MybatisPlus的FieldStrategy
端午节英语
起源
今天在新项⽬中打算使⽤Mybatis Plus的3.x版本,然后发现2.x版本中有些配置被废弃了。其中⼀个field-strategy引起了注意。
⼀时偷懒可能会导致线上问题,所以还是研究⼀下。
正⽂
在MP中,该设置会影响sql语句的拼接⾏为。在2.x版本中,没有对这个进⾏区分,不可单独设置字段策略。
下⾯通过具体的配置来解释差异
# 2.x配置
mybatis-plus:
mapper-locations:
- classpath*:mapper/**/*l
typeAliasPackage: st.assist.dao.domain
global-config:
id-type: 0
field-strategy: 2
db-column-underline: true
configuration:
map-underscore-to-camel-ca: true
cache-enabled: fal
#3.x的配置
mybatis-plus:
typeAliasPackage: st.assist.dao.domain
mapper-locations:
- classpath*:mapper/**/*l
global-config:
db-config:
lect-strategy: not_empty
inrt-strategy: not_empty
update-strategy: not_empty
id-type: auto
configuration:
map-underscore-to-camel-ca: true
院子英文
cache-enabled: fal
public enum FieldStrategy {
IGNORED,
NOT_NULL,
NOT_EMPTY,
DEFAULT,
NEVER;
private FieldStrategy() {
}
}
通过查阅资料和翻看源码,发现这个字段主要会影响sql拼接。我们知道,当通过Entity对表进⾏更新时,只会更新⾮空字段。对于那些值为NULL的字段是不会出现在sql语句⾥的。
下⾯我从源码⾥⾯截取了⼀段
protected String convertIfTag(boolean ignored, TableFieldInfo fieldInfo, String prefix, boolean clo) {
FieldStrategy fieldStrategy = FieldStrategy();
//如果字段策略为忽略,进⾏相应的处理
if (fieldStrategy == FieldStrategy.IGNORED) {
if (ignored) {
return "";
}
fieldStrategy = GlobalConfig().getFieldStrategy();
}
if (clo) {
return "</if>";
翻绳之爱心} el {
String property = Property();
Class propertyType = PropertyType();
国歌响起
property = veIsPrefixIfBoolean(property, propertyType);
if (null != prefix) {
property = prefix + property;
桑怿传
}
//重点是这⾥,如果字段策略为NOT_EMPTY,那么会对当前字段的值进⾏判断
if (fieldStrategy == FieldStrategy.NOT_EMPTY) {
return StringUtils.isCharSequence(propertyType) ? String.format("\n\t<if test=\"%s!=null and %s!=''\">", property, property) : String.format("\n\t<if test=\"%s!=null \">", property); } el {
世界上最大的乌贼return String.format("\n\t<if test=\"%s!=null\">", property);
}
}
}
通过上⾯的代码可以总结出:
NOT_EMPTY:会对字段值进⾏null和'' ⽐较操作
NOT_NULL: 只会进⾏null检查钢琴家英文
同时在3.x版本中,⽀持对lect、update、inrt设置不同的字段策略,由此看来⼤家对这种⼀⼑切的⾏为还是⽐较反感的。这⼀点,我在github也看到issue。
总结
小学开学第一课对于不清楚的配置不能囫囵吞枣,否则容易酿成⼤祸。参考⽂献