浅谈MyBatis-Plus学习之通用CRUD

一、实现通用CRUD的方式

下面内容基于前篇文章在DB中已创建tbl_employee表格,并且在project中已有相应实体Employee类

对于Mybatis来说:

需要编写相应的接口EmployeeMapper,然后编写CRUD方法;编写对应的EmployeeMapper.xml映射文件,并针对每个方法编写SQL语句

对于MP来说:

只需要编写接口EmployeeMapper,然后继承BaseMapper<T>接口,就可以

因为BaseMapper接口内置很多CRUD方法,然后通过泛型将实体的属性映射到DB中的表字段

然后产生接口代理对象

public interface EmployeeMapper extends BaseMapper<Employee>{ //继承BaseMapper接口,内置通用的CRUD方法

}

MP默认规定实体类的设定:

主键叫id;名称(实体名和属性名)映射到DB表为驼峰命名,这样无须注解设置,因为这样MP通过这样的约定俗成方便实体跟数据库映射

但,通常开发中都很少这样的,因此MP提供一系列注解方便映射

表名注解  @TableName  

主键注解  @TableId  

字段注解  @TableField

@TableName(value="tbl_employee")
public class Employee {
    @TableId(type=IdType.AUTO)  //指定主键策略, 这里指定为数据库自增, 默认主键类型是IdType.ID_WORKER;全局唯一ID
    private Integer id;
    @TableField(value="last_Name")
    private String lastName;   //默认驼峰命名到数据库字段下划线的转换
    private String email;
    private Integer gender;
    private Integer age;
    @TableField(exist=false)  //不会将该字段映射到数据库表
    private Integer status; 

关注解更多的介绍,可以翻阅官方文档,有更详尽介绍

在开发过程中数据库表跟实体是很多的,为了减轻在每个实体中重复性设置注解。

MP提供全局配置策略

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="typeAliasesPackage" value="cn.hjj.mp.entity"></property>
        <property name="globalConfig" ref="globalConfiguration"></property>
    </bean>
    
    <!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置-->
    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <property name="dbColumnUnderline" value="true"></property>  <!-- 2.3版本后默认配置数据库下划线-->
        <!-- 指定数据库ID生成策略   0:数据库自增-->
        <property name="idType" value="0"></property>
        <!-- 指定数据库表前缀 -->
        <property name="tablePrefix" value="tbl_"></property>
    </bean>

二、通用CRUD操作演示

以上可以看到EmployeeMapper接口中内置很多的通用CRUD操作

下面以代码形式展示

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:applicationContext.xml"})
public class TestCommonCRUD {
    @Autowired
    private EmployeeMapper employeeMapper;
    
    /**
     * 基本插入测试
     */
    @Test
    public void testCommonInsert() {
        Employee employee = new Employee();
        employee.setLastName("jack");
        employee.setEmail("jack@qq.com");
        employee.setAge(20);
        //employee.setGender(0);
        Integer res = employeeMapper.insert(employee);
        System.out.println("res: " + res);
        //自动回写到操作的Entity中
        System.out.println("the pk of employee: " + employee.getId());
    }
    
    /**
     * 基本插入所有字段测试
     */
    @Test
    public void testCommonInsertAll() {
        Employee employee = new Employee();
        employee.setLastName("jack");
        employee.setEmail("jack@qq.com");
        employee.setAge(20);
        //employee.setGender(0);
        Integer res = employeeMapper.insertAllColumn(employee);
        System.out.println("res: " + res);
    }
    
    /**
     * 基本更新测试,根据Id
     */
    @Test
    public void testCommonUpdate() {
        Employee employee = new Employee();
        employee.setId(6);
        employee.setLastName("Andy");
        //employee.setEmail("andy@qq.com");
        employee.setAge(20);
        employee.setGender(1);
        
        Integer res = employeeMapper.updateById(employee);
        System.out.println("res: " + res);
    }
    
    /**
     * 基本更新全部测试,根据Id
     * 如果字段对应的实体属性没有设置,则提供默认值。
     */
    @Test
    public void testCommonUpdateAll() {
        Employee employee = new Employee();
        employee.setId(7);
        employee.setLastName("Andy");
        employee.setEmail("andy@qq.com");
        //employee.setAge(20);
        employee.setGender(1);
        
        Integer res = employeeMapper.updateAllColumnById(employee);
        System.out.println("res: " + res);
    }
    
    /**
     * 基本查询测试,根据Id
     */
    @Test
    public void testCommonSelect() {
        Employee employee = employeeMapper.selectById(1);
        System.out.println(employee);
    }
    
    /**
     *  根据实体封装查询条件,来查询一个记录,
     *  如果查询结果有多个,会报对应的异常信息
     */
    @Test
    public void testCommonSelectOne() {
        Employee employee = new Employee();
        employee.setLastName("Jerry");
        employee.setAge(20);
        System.out.println(employeeMapper.selectOne(employee));
    }
    
    /**
     * 根据id集合,查询数据库中多个记录
     */
    @Test
    public void testCommonSelectBatchIds() {
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        ids.add(4);
        List<Employee> emps = employeeMapper.selectBatchIds(ids);
        System.out.println(emps);
    }
    
    /**
     * 根据map封装查询条件
     */
    @Test
    public void testCommonSelectByMap() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("last_name", "jack");
        map.put("age", 20);
        List<Employee> emps = employeeMapper.selectByMap(map);
        System.out.println(emps);
    }
    
    /**
     * 根据条件查询分页数据
     * RowBounds对象是ibatis提供的用于封装分页条件的实体
     * Page是实现分页的辅助类
     * 没有通过limit来进行分页操作,
     * 其实本质上是通过ibatis的RowBounds进行分页,也就是在内存中进行分页
     * 不推荐使用
     */
    @Test
    public void testCommonSelectPage() {
        List<Employee> page = employeeMapper.selectPage(new Page<>(2, 2), null);
        System.out.println(page);
    }
    
    /**
     * 删除数据,根据id
     */
    @Test
    public void testCommonDeleteById() {
        Integer res = employeeMapper.deleteById(11);
        System.out.println("res: " + res);
    }
    
    /**
     * 删除数据,根据Map集合封装数据
     */
    @Test
    public void testCommonDeleteByMap() {
        Map<String, Object> map = new HashMap<>();
        map.put("last_name", "Andy");
        map.put("email", "andy@qq.com");
        Integer res = employeeMapper.deleteByMap(map);
        System.out.println("res: " + res);
    }
    
    /**
     * 删除数据,根据id集合
     */
    @Test
    public void testCommonDeleteBatchIds() {
        employeeMapper.deleteBatchIds(Arrays.asList(new Integer[] {1, 2, 3, 4}));
    }
    
    
}
原文地址:https://www.cnblogs.com/jayhou/p/9807758.html