兄弟们!mybatis-plus是号称对mybatis本身无侵入的一种加强版。
但是当你引入它的时候,可能会广泛踩坑。接下来给大家看看我的踩坑历史。
第一坑:当你选择的是mybatis-spring-boot-starter
+mybatis-plus
引入时
pom依赖如下:
<!--mybatis的基础依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--mybatis-plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.1.tmp</version>
</dependency>
这样。其实,你的mybatis还是你曾经的mybatis,只是附加了一些功能。但是,当你开始配置yml文件的时候,诸多小白(如我),可能会直接将一些属性配置直接替换到mybatis-plus之下。
如:
mybatis-plus:
#mapper路径
mapper-locations: classpath*:/mapper/*.xml
configuration:
# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
map-underscore-to-camel-case: true
# 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true
cache-enabled: false
#懒加载
#aggressive-lazy-loading: true
#NONE:不启用自动映射 PARTIAL:只对非嵌套的 resultMap 进行自动映射 FULL:对所有的 resultMap 都进行自动映射
#auto-mapping-behavior: partial
#NONE:不做任何处理 (默认值)WARNING:以日志的形式打印相关警告信息 FAILING:当作映射失败处理,并抛出异常和详细信息
#auto-mapping-unknown-column-behavior: none
#如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
call-setters-on-nulls: true
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
#表名下划线命名默认true
table-underline: true
#id类型
id-type: auto
#是否开启大写命名,默认不开启
#capital-mode: false
#逻辑已删除值,(逻辑删除下有效) 需要注入逻辑策略LogicSqlInjector 以@Bean方式注入
logic-not-delete-value: 0
#逻辑未删除值,(逻辑删除下有效)
logic-delete-value: 1
血泪的教训!!!
其实,yml已经很好心地提醒了你,比如打mybatis-plus
之后没有属性提示信息,属性高亮黄色等等,但是你的配置很可能就是直接CL复制过来的,所以完全不会注意到。
那么此时请记住,现在你的mybatis-plus
是没有mybatis
基础文件的大哥们!!!你们是两个包!!!你不是直接引入的mybatis-plus-boot-starter
的!!!
因此,该配置在mybatis下的,一个都不能少。比如,驼峰映射。
如果你像我这么配置,明明打开了驼峰映射map-underscore-to-camel-case: true
但是鉴于它不是有效的配置,所以它是不会生效的。
当你纠结为啥你获取到的参数都是null的时候,花费了N个小时之后,终于觉得可能是驼峰映射的问题的时候,一个断点打进来。
哟嚯,发现了!这个配置是关闭的哦!
所以需要在mybatis
下保留其基础配置。
如下:
mybatis:
mapper-locations: classpath*:/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
#如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
call-setters-on-nulls: true
但这样就没法直接在yml中操作mybatis-plus
了。
第二坑:当你觉得附和两个包太过麻烦,而且无法配置mybatis-plus的属性打算直接引入mybatis-plus-boot-starter
时
请记住一定要排除掉mybatis-spring-boot-starter
这个包,不然很可能会有jar包版本冲突。
mybatis造成的启动时版本冲突bug示例
因此,我们直接这样导入包即可
<!--mybatis-plus-starter依赖-->
<!--有了这个依赖之后不要在增加mybatis依赖了,会冲突-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
然后配置文件就可以全部转到mybatis-plus
下
如下:
mybatis-plus:
#mapper路径
mapper-locations: classpath*:/mapper/*.xml
configuration:
# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
map-underscore-to-camel-case: true
# 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true
cache-enabled: false
#懒加载
#aggressive-lazy-loading: true
#NONE:不启用自动映射 PARTIAL:只对非嵌套的 resultMap 进行自动映射 FULL:对所有的 resultMap 都进行自动映射
#auto-mapping-behavior: partial
#NONE:不做任何处理 (默认值)WARNING:以日志的形式打印相关警告信息 FAILING:当作映射失败处理,并抛出异常和详细信息
#auto-mapping-unknown-column-behavior: none
#如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
call-setters-on-nulls: true
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
#表名下划线命名默认true
table-underline: true
#id类型
id-type: auto
#是否开启大写命名,默认不开启
#capital-mode: false
#逻辑已删除值,(逻辑删除下有效) 需要注入逻辑策略LogicSqlInjector 以@Bean方式注入
logic-not-delete-value: 0
#逻辑未删除值,(逻辑删除下有效)
logic-delete-value: 1
其实yml真的已经尽力了!如果你真的已经引入了starter包,它的提示就是会生效的配置!