1.字段填充器
注意重写了strictFill
方法
统一规范,字段填充的值和类型所有的表都一样。所以不作类型判断。
1 |
|
原理
- 最终调用了
insertFill
或者updateFill
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56// 调用MybatisPlus 的 ibatis代码
public abstract class BaseStatementHandler implements StatementHandler {
protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
。。。
// 就是在这里调用了MybatisPlus的填充逻辑
this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);
。。。
}
}
// MybatisPlus的参数处理程序
public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
private final TypeHandlerRegistry typeHandlerRegistry;
private final MappedStatement mappedStatement;
private final Object parameterObject;
private final BoundSql boundSql;
private final Configuration configuration;
public MybatisDefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
// processParameter 处理参数
super(mappedStatement, processParameter(mappedStatement, parameterObject), boundSql);
。。。
}
protected static Object processParameter(MappedStatement ms, Object parameterObject) {
if (parameterObject != null &&
(SqlCommandType.INSERT == ms.getSqlCommandType() || SqlCommandType.UPDATE == ms.getSqlCommandType())
) {
。。。
Collection<Object> parameters = getParameters(parameterObject);
if (null != parameters) {
parameters.forEach(obj -> process(ms, obj));
} else {
process(ms, parameterObject);
}
}
return parameterObject;
}
private static void process(MappedStatement ms, Object parameterObject) {
TableInfo tableInfo;
...
if (tableInfo != null) {
MetaObject metaObject = ms.getConfiguration().newMetaObject(entity);
if (SqlCommandType.INSERT == ms.getSqlCommandType()) {
populateKeys(tableInfo, metaObject, entity);
// 最终填充
insertFill(metaObject, tableInfo);
} else {
// 最终填充
updateFill(metaObject, tableInfo);
}
}
}
}
2.[批量|单个]软删除使自动填充器生效(默认不生效)
mybatisPlus 使用@TableLogic
注解在字段上,表示当前表软删除,当前字段为软删除字段
正常调用删除的API即可软删除。但是缺点是:并不会使字段填充器生效
目前我用的3.3.2有单个的软删除使字段填充器生效,但是批量的没有
批量软删除参考批量删除的方法
- mybatisPlus在初始化的时候会给每个表添加通用的Statement映射
- 批量软删除需要再加一个参数,总共两个参数,一个是实体(不然字段填充器往哪里填?),一个是删除的idList集合,所以需要从新定义一个方法
自定义批量软删除的代码
1 | // mapper新增一个方法 |
最后需要把sql映射的工具类添加到Spring容器中哦
1 |
|
使用的话一定要使用mapper新定义的方法哦
大功告成
3.MybatisPlus查询软删除的数据
批量软删除,我们已经完美的实现,字段填充器也可以生效。但有些业务需要查询已经删除的数据,mybatisPlus目前还没有对应的方法,只能自己实现了。
首先定义方法到mapper里面
1 |
|
然后定义这些个方法的实现
有用动态代理啊动态代理
1 | /** |
绑定statement
1 |
|
至此完成SQL的statement绑定,然后具体业务继承CustomBaseMapper即可享用啦
4.避免字符串编码
lambda语法已经帮我们解决了字符串编码的问题,但是非lambda的api,他的参数只支持接受字符串,那么我们如何避免字符串呢?
参考Lambda转字符串
我们也可以自定义lambda转字符串
1 | /** |
这样我们在其他地方也可以用lambda转字段的语法了
5.避免空指针,使api操作更安全
集成以上所有的特性到一个类中作为一个baseDao。
实际项目中一个表对应一个实体,一个mapper,当然也需要一个Dao,继承此Dao就可以顺心的使用了。
我们Dao的职责就是用来拼接sql的。避免sql东一处西一处,不好维护。强制校验把sql写在Dao类中👉MybatisPlus语法糖的校验
然后service的业务代码,调用Dao写好的sql即可。service层不关心sql。
1 | /** |
总结
- 配置字段填充器
省去无关记录用户的操作 - 批量软删除使字段填充器删除时也生效
- 查询已经删除的数据
- 避免字符串编程
- 避免空指针异常
mybatisPlus 虽然能开箱即用,但是如果没有更完善的配置,用起来也会不是特别的方便。这些特性配置完事之后,按照每个特性的使用步骤来。 可以节省我们开发人员很多的代码量。以及省去了很多不需要关系的东西。