MyBatisPlus-3-通用CRUD

♀尐吖头ヾ 提交于 2019-11-29 06:25:11

通用CRUD

1.1 创建接口EmployeeMapper并继承BaseMapper<T>

public interface EmployeeMapper extends BaseMapper<Employee> {
    /*
     * Mapper接口
     *
     * 基于Mybatis: 在Mapper接口中编写CRUD相关的方法  提供Mapper接口所对应的SQL映射文件 以及 方法对应的SQL语句.
     *
     * 基于MP: 让XxxMapper接口继承  BaseMapper接口即可.
     *
     * BaseMapper<T>:  泛型指定的就是当前Mapper接口所操作的实体类类型
     *
     */

    //   Integer  insertEmployee(Employee employee );
    //   <insert useGeneratedKeys="true" keyProperty="id" > SQL...</insert>
}

2.1 创建测试类TestMPCRUD01进行测试

2.1.1 插入操作

public class TestMPCRUD01 {

    private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");

    private EmployeeMapper employeeMapper = ioc.getBean("employeeMapper", EmployeeMapper.class);

    @Test
    public void testCommonInsert() {
        //初始化Employee对象
        Employee employee = new Employee();
        employee.setLastName("MP");
        employee.setEmail("mp@test.com");
        employee.setGender(1);
        employee.setAge(22);
        employee.setSalary(20000.0);
        // 插入到数据库
        // insert方法在插入时,会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中
        // Integer result = employeeMapper.insert(employee);

        // insertAllColumn方法在插入时,不管属性是否非空,属性所对应的字段都会出现到SQL语句中.
        Integer result = employeeMapper.insertAllColumn(employee);

        System.out.println("result: " + result);

        //获取当前数据在数据库中的主键值
        Integer key = employee.getId();
        System.out.println("key:" + key);
    }
}

2.1.2 更新操作

    @Test
    public void testCommonUpdate() {
        //初始化修改对象
        Employee employee = new Employee();
        employee.setId(4);
        employee.setLastName("小泽老师");
        employee.setEmail("xz@sina.com");
        employee.setGender(0);
        employee.setAge(33);

        //Integer result = employeeMapper.updateById(employee);
        Integer result = employeeMapper.updateAllColumnById(employee);

        System.out.println("result: " + result);
    }

2.1.3 查询操作

    @Test
    public void testCommonSelect() {
        //1. 通过id查询
        Employee employee = employeeMapper.selectById(1);
        System.out.println(employee);

        //2. 通过多个列进行查询    id  +  lastName
        employee = new Employee();
        employee.setId(4);
        employee.setLastName("小泽老师");
        employee.setGender(0);

        Employee result = employeeMapper.selectOne(employee);
        System.out.println("result: " + result);

        //3. 通过多个id进行查询    <foreach>
        List<Integer> idList = new ArrayList<>();
        idList.add(4);
        idList.add(5);
        idList.add(6);
        idList.add(7);

        List<Employee> emps = employeeMapper.selectBatchIds(idList);
        System.out.println(emps);

        //4. 通过Map封装条件查询
        Map<String, Object> columnMap = new HashMap<>();
        columnMap.put("last_name", "Tom");
        columnMap.put("gender", 1);

        emps = employeeMapper.selectByMap(columnMap);
        System.out.println(emps);

        //5. 分页查询
        emps = employeeMapper.selectPage(new Page<>(3, 2), null);
        System.out.println(emps);
    }

2.1.4 删除操作

    @Test
    public void testCommonDelete() {
        //1 .根据id进行删除
        Integer result = employeeMapper.deleteById(13);
        System.out.println("result: " + result);

        //2. 根据 条件进行删除
        Map<String, Object> columnMap = new HashMap<>();
        columnMap.put("last_name", "MP");
        columnMap.put("email", "mp@test.com");

        result = employeeMapper.deleteByMap(columnMap);
        System.out.println("result: " + result);

        //3. 批量删除
        List<Integer> idList = new ArrayList<>();
        idList.add(3);
        idList.add(5);

        result = employeeMapper.deleteBatchIds(idList);
        System.out.println("result: " + result);
    }

3.1 小结

3.1.1 通用

Integer insert(T entity);
Integer insertAllColumn(T entity);

Integer updateById(@Param("et") T entity);
Integer updateAllColumnById(@Param("et") T entity);

T selectById(Serializable id);
T selectOne(@Param("ew") T entity);
List<T> selectBatchIds(List<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);

Integer deleteById(Serializable id);
Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);
Integer deleteBatchIds(List<? extends Serializable> idList);

3.1.2 注解/全局配置

@TableName
全局的 MP 配置: <property name="tablePrefix" value="tbl_"></property>

@TableField
全局的 MP 配置: <property name="dbColumnUnderline" value="true"></property>

@TableId
全局的 MP 配置: <property name="idType" value="0"></property>

支持主键自增的数据库插入数据获取主键值
Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
MP: 自动将主键值回写到实体类中

4.1 SQL注入分析

  • A. employeeMapper 的本质 org.apache.ibatis.binding.MapperProxy。
  • B. MapperProxy 中 sqlSession –>SqlSessionFactory。
  • C. SqlSessionFacotry 中 → Configuration→ MappedStatements。
    • 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件中的一个 SQL。
    • MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保存到 configuration 对象中的 mappedStatements 中。
  • D. 实质:
    • Configuration: MyBatis 或者 MP 全局配置对象。
    • MappedStatement:一个 MappedStatement 对象对应 Mapper 配置文件中的一个select/update/insert/delete 节点,主要描述的是一条 SQL 语句。
    • SqlMethod : 枚举对象 ,MP 支持的 SQL 方法。
    • TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息。
    • SqlSource: SQL 语句处理对象。
    • MapperBuilderAssistant: 用于缓存、SQL 参数、查询方剂结果集处理等.通过 MapperBuilderAssistant 将每一个 mappedStatement添加到 configuration 中的 mappedstatements 中。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!