通用 CRUD 场景设定
- 提出问题:
假设我们已存在一张 tbl_employee 表,且已有对应的实体类 Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?- 实现方式:
(1)基于 Mybatis
需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法 ;
提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句。
(2)基于 MP
只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口。
这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。
准备具体的Mapper接口
package com.neuedu.mp.mapper; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.neuedu.mp.beans.Employee; /** * Mapper接口 * * 基于Mybatis: * 在Mapper接口中编写CRUD相关的方法 * 提供Mapper接口所对应的SQL映射文件 * 以及方法对应的SQL语句. * * 基于MP: * 让XxxMapper接口继承 BaseMapper接口即可. * BaseMapper<T> : 泛型指定的就是当前Mapper接口所操作的实体类类型 * */ public interface EmployeeMapper extends BaseMapper<Employee> { }
BaseMapper:继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能。
在applicationContext.xml文件中配置mapper
接口扫描
<!-- 配置 mybatis 扫描 mapper 接口的路径 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.neuedu.mp.mapper"></property> </bean>
测试通用插入操作
①指定主键策略
/* * @TableId: * value: 指定表中的主键列的列名, 如果实体属性名与列名一致,可以省略不指定. * type: 指定主键策略. */ @TableId(value="id" , type=IdType.AUTO)
MP支持以下4中主键策略,可根据需求自行选用:
序号 值 描述 1 IdType.AUTO 数据库ID自增 2 IdType.INPUT 用户输入ID 3 IdType.ID_WORKER 全局唯一ID,内容为空自动填充(默认配置) 4 IdType.UUID 全局唯一ID,内容为空自动填充 ②实体类类名和数据库表表名映射关联
// MybatisPlus会默认使用实体类的类名到数据中找对应的表. @TableName(value="tbl_employee")
表名注解
@TableName
序号 值 描述 1 value 表名( 默认空 ) 2 resultMap xml 字段映射 resultMap ID ③在测试类中获取EmployeeMapper接口代理实现类
// 获取EmployeeMapper接口代理实现类 private EmployeeMapper employeeMapper = iocContext.getBean("employeeMapper", EmployeeMapper.class);
④测试通用插入操作
insert
方法
/** * 通用 插入操作 */ @Test public void testCommonInsert() { //初始化Employee对象 Employee employee = new Employee(); employee.setLastName("MP_01"); employee.setEmail("mp_01@neusoft.com"); employee.setGender(1); employee.setAge(23); // 向数据库中添加数据 Integer result = employeeMapper.insert(employee); System.out.println(result); }
insert
方法在插入时, 会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中。⑤测试插入操作返回主键值(支持主键自增的数据库插入数据获取主键值)
- Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
- MP: 自动将主键值回写到实体类中
/** * 通用 插入操作 */ @Test public void testCommonInsert() { //初始化Employee对象 Employee employee = new Employee(); employee.setLastName("MP_02"); employee.setEmail("mp_02@neusoft.com"); employee.setGender(0); employee.setAge(42); // 向数据库中添加数据 Integer result = employeeMapper.insert(employee); System.out.println(result); //获取当前数据在数据库中的主键值 Integer key = employee.getId(); System.out.println("key:" + key); }
⑥测试通用插入操作
insertAllColumn
方法
/** * 通用 插入操作 */ @Test public void testCommonInsert() { //初始化Employee对象 Employee employee = new Employee(); employee.setLastName("MP_03"); employee.setEmail("mp_03@neusoft.com"); // 向数据库中添加数据 Integer result = employeeMapper.insertAllColumn(employee); System.out.println(result); }
insertAllColumn
方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中。
通用更新操作
①测试通用更新操作
updateById
方法
/** * 通用 更新操作 */ @Test public void testCommonUpdate() { //初始化修改对象 Employee employee = new Employee(); employee.setId(7); employee.setLastName("MP_03"); employee.setEmail("mp_03@neusoft.com"); employee.setGender(0); employee.setAge(33); // 更新ID为7的雇员的性别:null->0,Age->33 Integer result = employeeMapper.updateById(employee); System.out.println("result: " + result); }
②测试通用更新操作
updateAllColumnById
方法
/** * 通用 更新操作 */ @Test public void testCommonUpdate() { //初始化修改对象 Employee employee = new Employee(); employee.setId(7); employee.setLastName("MP_03"); employee.setEmail("mp_03@东软.com"); employee.setGender(1); // 更新ID为7的雇员的性别:Email->mp_03@东软.com,Gender->0,并且不写Age属性 Integer result = employeeMapper.updateAllColumnById(employee); System.out.println("result: " + result); }
通用查询操作
①测试通用查询操作
selectById
方法
/** * 通用 查询操作 */ @Test public void testCommonSelect() { // 通过id查询 Employee employee = employeeMapper.selectById(7); System.out.println(employee); }
②测试通用查询操作
selectOne
方法
/** * 通用 查询操作 */ @Test public void testCommonSelect() { // 通过多个列进行查询: id + lastName Employee employee = new Employee(); employee.setId(6); employee.setLastName("MP_02"); Employee result = employeeMapper.selectOne(employee); System.out.println("result: " +result); }
③测试通用查询操作
selectBatchIds
方法
/** * 通用 查询操作 */ @Test public void testCommonSelect() { // 通过多个id进行查询 List<Integer> idList = new ArrayList<>(); idList.add(4); idList.add(5); idList.add(6); idList.add(7); List<Employee> emps = employeeMapper.selectBatchIds(idList); // 打印查询的数据 for (Employee employee : emps) { System.out.println(employee); } }
④测试通用查询操作
selectByMap
方法
/** * 通用 查询操作 */ @Test public void testCommonSelect() { // 通过Map封装条件查询 Map<String,Object> columnMap = new HashMap<>(); columnMap.put("last_name", "Tom"); columnMap.put("gender", 1); List<Employee> emps = employeeMapper.selectByMap(columnMap); for (Employee employee : emps) { System.out.println(employee); } }
⑤测试通用查询操作
selectPage
方法
/** * 通用 查询操作 */ @Test public void testCommonSelect() { // 分页查询 List<Employee> emps = employeeMapper.selectPage(new Page<>(3, 2), null); for (Employee employee : emps) { System.out.println(employee); } }
通用删除操作
①测试通用删除操作
deleteById
方法
/** * 通用 删除操作 */ @Test public void testCommonDelete() { // 根据id进行删除 Integer result = employeeMapper.deleteById(7); System.out.println("result: " + result); }
②测试通用删除操作
deleteByMap
方法
/** * 通用 删除操作 */ @Test public void testCommonDelete() { // 根据 多个 条件进行删除 Map<String,Object> columnMap = new HashMap<>(); columnMap.put("last_name", "MP_01"); columnMap.put("email", "mp_01@neusoft.com"); Integer result = employeeMapper.deleteByMap(columnMap); System.out.println("result: " + result); }
③测试通用删除操作
deleteBatchIds
方法
/** * 通用 删除操作 */ @Test public void testCommonDelete() { // 根据ID批量删除 List<Integer> idList = new ArrayList<>(); idList.add(1); idList.add(2); idList.add(6); Integer result = employeeMapper.deleteBatchIds(idList); System.out.println("result: " + result ); }
通用 CRUD 操作小结
以上就是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担,难道这就是 MP 的强大之处了吗?
- 提出需求:
现有一个需求,我们需要分页查询 tbl_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?
MyBatis :
需要在 SQL 映射文件中编写带条件查询的 SQL,并基于 PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。普通的 Mapper 能够解决这类痛点吗?
MP:
依旧不用编写 SQL 语句, MP 提供了功能强大的条件构造器 EntityWrapper 。好了,接下来就学习这个内容,拭目以待吧!