优点
- 定位:只做增强不做改变, 引入它不会对现有工程产生影响
- 效率:只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间
- 功能:代码生成、物理分页、性能分析等功能一应俱全
为什么要使用Mybytis Plus
- 简化:使用MP能简化完成单表的CURD操作简化开发的过程,大大节省开发效率
- 思想:使用对象的方式操作数据库
- 接口:使自己接口继承公共的接口,即可获取常用的CRUD的操作(告别SQL语句)
Mybytis Plus的思想是以对象的方式操作数据库单表几乎不用开发者写简单的单表Sq1
包含Mybytis所有的包,之前用Mybytis写的代码换成Mybytis Plus一样有效
使用Mybytis Plus
- 导入pom里Mybytis Plus的依赖
- Spring核心配置由之前的mybatis(K键)改成mybatis-plus:
- 修改pojo实体类 , 设置 对象与表名映射 / 设置主键自增 / 设置数据库表字段名与属性名的映射
- mapper(原Dao层)创建接口继承Mybytis Plus提供的公共类BaseMapper<实体类>接口
- 调用层创建该接口的成员属性为引用使用@Autowired,即可在内存代理出一个实体类
工作原理(执行顺序)
- 程序业务开始调用
- 根据Mapper接口动态获取到操作的泛型对象,然后获取表的相关数据
- 只要获取到对象,就相当于获取了 表的名称/字段的名称/数据的值
- 将对象转换为特定的SQL交给Mybytis执行
- Mybytis Plus将返回的数据自动封装称对象返回
动态SQL语句
例如: select * from user where name = “赵云” and age =18
如果: name没值则sql语句为select * from user where name = null and age =18
或者: select * from user where name = null and age =null
那么: 如何使不穿参数的参数名和参数(null)不编辑在SQL语句里呢?
- 在QueryWrapper或者UpdateWrapper有很多条件方法
- 第一个参数类型为boolean condition的参数即可决定此参数是否需要动态的拼接
- 当传true时拼接SQL语句
- 当传false时不拼接SQL语句
- 如果所有条件都传false时则取消条件如(where)直接查表所有内容,或者直接全部删除
MP分页查询
使用MP分页查询时,需要在官网找见 指南 - 分页插件 即可调用分页的函数进行调用了
- 其中 实例化分页内拦截器(PaginationInnerInterceptor)时需要按照MP链接的数据库类型设置
- 因为SQL现在都支持SQL92标准(增删改查,语法是相同的),但设计理念不同,MP针对不同的数据库做出了优化
- 插件的作用:设定一个拦截器,将分页的SqL进行动态的拼接
MP数据的自动填充
作用
自动添加表中某一字段的值
例如
在数据库中用户修改信息等等,需要添加当前修改的时间;当用户调用修改新增操作时,MP可自动实现数据库字段的填充
实现
实现步骤:
- 对实体类对象的成员属性加注释
@TableField(fill = FieldFill.INSERT_UPDATE)
- MP对外暴露了一个自动填充的接口MetaObjectHandler,开发人员只需要实现该接口
- 重写该接口的两个方法即可完成自动填充的功能
1.实体类对象添加注解
//FieldFill.INSERT设定数据什么时候自动填充
@TableField(fill = FieldFill.INSERT)
private Date created; //表示入库时需要赋值
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updated; //表示入库/更新时赋值
INSERT: 表示MP入库时自动赋值
INSERT_UPDATE : 表示入库或更新时赋值
2.实现MP的MetaObjectHandler接口(建议写在配置包下)
@Component
public class MyMetaObjectHandLer implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Date date = new Date();
this.setFieldValByName("created", date,metaObject);
this.setFieldValByName("updated", date,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updated", new Date(),metaObject);
}
}
setFieldValByName方法参数的说明:
arg1: 需要自动填充的字段名称
arg2: 自动填充的值
arg3: metaObject固定写法