MybatisPlus的通用 CRUD

3.1 通用 CRUD

1) 提出问题: 假设我们已存在一张 tbl_employee 表,且已有对应的实体类 Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?

2) 实现方式:

基于 Mybatis

需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法 提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句.

基于 MP

只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口.这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。

3.2 插入操作

@Test
public void testInsert(){
    //初始化Employee对象
    Employee employee  = new Employee();
    employee.setLastName("shuchegnxi");
    employee.setEmail("shuchegnxi@atguigu.com");
    //insert 方法在插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现到sql语句中
    employeeMapper.insert(employee);

    //insertAllColumn方法在插入时,无论属性是否为空,属性所对应的字段都会出现到sql语句中
    //employeeMapper.insertAllColumn(employee);

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

和插入相关的属性和配置

@TableId

/*
   @TableId:
    value : 指定表中主键列的列名,如果实体的属性和列名一直,则可以省略不指定
    type: 指定主键的策略

 */
@TableId(value = "id",type = IdType.AUTO)

@TableName

// 指定该实体对应的数据库的表名
@TableName(value = "tbl_employee")

mybatisplus的全局配置+注入到 sqlSessionFactoryBean

<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
   <!-- 数据源 -->
   <property name="dataSource" ref="dataSource"></property>
   <property name="configLocation" value="classpath:mybatis.xml"></property>
   <!-- 别名处理 -->
   <property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property>      
   
   <!-- 注入全局MP策略配置 -->
   <property name="globalConfig" ref="globalConfiguration"></property>
</bean>

<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
   <!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
   <property name="dbColumnUnderline" value="true"></property>
   
   <!-- 全局的主键策略 -->
   <property name="idType" value="0"></property>
   
   <!-- 全局的表前缀策略配置 -->
   <property name="tablePrefix" value="tbl_"></property>
   
</bean>

@TableField

当没有配置转驼峰的全局配置时,则需要使用该注解,映射实体类的属性和数据库的字段

@TableField(value = "last_name")
private String lastName;

当实体中有某个属性,但是数据库中没有相应字段时,则需要设置

@TableField(exist = false)

插入数据获取主键值

mabatis会自动将主键 值,插入到实体类中

insertAllColumn方法

//insert 方法在插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现到sql语句中
employeeMapper.insert(employee);

//insertAllColumn方法在插入时,无论属性是否为空,属性所对应的字段都会出现到sql语句中
employeeMapper.insertAllColumn(employee);

3.3 更新操作

@Test
public void testUpdate(){
    Employee employee  = new Employee();
    employee.setId(9);
    employee.setLastName("houchen");
    employee.setEmail("houchen@qq.com");
    employee.setGender(2);
    //返回结果是 对当前数据库影响的行数
    // 
    Integer result = employeeMapper.updateById(employee);
    System.out.println(result);
}

3.4 查询操作

//通过id查询
Employee employee = employeeMapper.selectById(9);
System.out.println(employee);

//通过多个列进行查询
Employee emp  = new Employee();
emp.setLastName("houchen");
emp.setEmail("houchen@qq.com");
Employee employee1 = employeeMapper.selectOne(emp);
System.out.println(employee1);

// 通过多个id进行查询
List<Employee> employees = employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3));
for(Employee e:employees){
    System.out.println(e);
}

//selectByMap
HashMap<String, Object> columnMap = new HashMap<>();
//key 是表中的列名
columnMap.put("last_name", "houchen");
List<Employee> employees = employeeMapper.selectByMap(columnMap);
for(Employee e:employees){
    System.out.println(e);
}

//分页查询 selectPage
List<Employee> employees = employeeMapper.selectPage(new Page<>(2, 2), null);
for(Employee e:employees){
    System.out.println(e);
}

3.5 删除操作

@Test
public void testDelete(){
    //根据ID删除数据
    //employeeMapper.deleteById(9);

    //根据条件删除数据
    HashMap<String, Object> columnMap = new HashMap<>();
    //key 是表中的列名
    columnMap.put("last_name", "MP");
    employeeMapper.deleteByMap(columnMap);

    // 批量删除deleteBatchIds
    employeeMapper.deleteBatchIds(Arrays.asList(1,2));
}

3.6 MP启动注入sql原理分析
SqlSessionFacotry 中 → Configuration→ MappedStatements 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件 中的一个 SQL。

MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保 存到 configuration 对象中的 mappedStatements 中

3.7 通用crud总结
以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现 大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方 便的实现单一、批量、分页等操作。极大的减少开发负担

原文地址:https://www.cnblogs.com/houchen/p/13506065.html