ORM框架升级,myabtis 升级到 mybatis-plus

1,506 阅读1分钟

当前项目框架版本

Spring:5.2.3.RELEASE

Spring-Boot:2.2.4.RELEASE

mybatis-spring-boot-starter:1.3.2

mybatis:3.4.6

第一步-修改pom.xml

<!-- mybatis 升级plus 弃用该包-->
<!--      <dependency>-->
<!--         <groupId>org.mybatis.spring.boot</groupId>-->
<!--         <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--         <version>${mybatis.spring.boot.starter.version}</version>-->
<!--      </dependency>-->
      <!-- mybatis-plus-->
      <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>mybatis-plus-boot-starter</artifactId>
         <version>3.5.1</version>
      </dependency>

第二步-修改application.yml

# MyBatis配置
#mybatis: //修改为mybatis-plus
mybatis-plus:
  # 搜索指定包别名
  typeAliasesPackage: com.test.yren.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:systeam/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis/mybatis-config.xml

mybatis-plus完整配置解释

#mybatis-plus:
#  # 对应的 XML 文件位置
#  mapperLocations: classpath*:mapper/**/*Mapper.xml
#  # 实体扫描,多个package用逗号或者分号分隔
#  typeAliasesPackage: com.ruoyi.**.domain
#  # 针对 typeAliasesPackage,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
#  #typeAliasesSuperType: Class<?>
#  # 如果配置了该属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 TypeHandler
#  #typeHandlersPackage: null
#  # 如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
#  #typeEnumsPackage: null
#  # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
#  checkConfigLocation: false
#  # 通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种:
#  # SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句(PreparedStatement)
#  # REUSE:该执行器类型会复用预处理语句(PreparedStatement)
#  # BATCH:该执行器类型会批量执行所有的更新语句
#  executorType: SIMPLE
#  # 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
#  configurationProperties: null
#  configuration:
#    # 自动驼峰命名规则(camel case)映射
#    # 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
#    mapUnderscoreToCamelCase: true
#    # 默认枚举处理类,如果配置了该属性,枚举将统一使用指定处理器进行处理
#    # org.apache.ibatis.type.EnumTypeHandler : 存储枚举的名称
#    # org.apache.ibatis.type.EnumOrdinalTypeHandler : 存储枚举的索引
#    # com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler : 枚举类需要实现IEnum接口或字段标记@EnumValue注解.
#    defaultEnumTypeHandler: org.apache.ibatis.type.EnumTypeHandler
#    # 当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。
#    aggressiveLazyLoading: true
#    # MyBatis 自动映射策略
#    # NONE:不启用自动映射
#    # PARTIAL:只对非嵌套的 resultMap 进行自动映射
#    # FULL:对所有的 resultMap 都进行自动映射
#    autoMappingBehavior: PARTIAL
#    # MyBatis 自动映射时未知列或未知属性处理策
#    # NONE:不做任何处理 (默认值)
#    # WARNING:以日志的形式打印相关警告信息
#    # FAILING:当作映射失败处理,并抛出异常和详细信息
#    autoMappingUnknownColumnBehavior: NONE
#    # Mybatis一级缓存,默认为 SESSION
#    # SESSION session级别缓存,同一个session相同查询语句不会再次查询数据库
#    # STATEMENT 关闭一级缓存
#    localCacheScope: SESSION
#    # 开启Mybatis二级缓存,默认为 true
#    cacheEnabled: true
#  global-config:
#    # 是否打印 Logo banner
#    banner: true
#    # 是否初始化 SqlRunner
#    enableSqlRunner: false
#    dbConfig:
#      # 主键类型
#      # AUTO 数据库ID自增
#      # NONE 空
#      # INPUT 用户输入ID
#      # ASSIGN_ID 全局唯一ID
#      # ASSIGN_UUID 全局唯一ID UUID
#      idType: AUTO
#      # 表名前缀
#      tablePrefix: null
#      # 字段 format,例: %s,(对主键无效)
#      columnFormat: null
#      # 表名是否使用驼峰转下划线命名,只对表名生效
#      tableUnderline: true
#      # 大写命名,对表名和字段名均生效
#      capitalMode: false
#      # 全局的entity的逻辑删除字段属性名
#      logicDeleteField: null
#      # 逻辑已删除值
#      logicDeleteValue: 2
#      # 逻辑未删除值
#      logicNotDeleteValue: 0
#      # 字段验证策略之 insert,在 insert 的时候的字段验证策略
#      # IGNORED 忽略判断
#      # NOT_NULL 非NULL判断
#      # NOT_EMPTY 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
#      # DEFAULT 默认的,一般只用于注解里
#      # NEVER 不加入 SQL
#      insertStrategy: NOT_NULL
#      # 字段验证策略之 update,在 update 的时候的字段验证策略
#      updateStrategy: NOT_NULL
#      # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
#      selectStrategy: NOT_NULL

第三步 修改MyBatisConfig.class

获取你的MybatisConfig.class 配置文件并不叫这个

你可以尝试寻找项目中哪个配置类注册了SqlSessionFactory Bean

以下三个参数对应application.yml文件中mybatis配置:指定包别名 / mapper的扫描 / 加载全局的配置文件路径

old:

String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
String configLocation = env.getProperty("mybatis.configLocation");

new:

String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
String configLocation = env.getProperty("mybatis-plus.configLocation");

修改返回SqlSessionFactory对象

由SqlSessionFactoryBean 改为 MybatisSqlSessionFactoryBean

image.png

修改原因

当项目已经有配置SqlSessionFactory。mybatis-plus将不会自动帮我们注入SqlSessionFactory,而使用我们自己定义的SqlSessionFactory。而项目配置的SqlSessionFactory不是Mybatis-plus需要的MybatisSqlSessionFactoryBean

巨坑!PageHelper与Mybatis-plus依赖冲突

问题背景

Mybatis-Plus和PageHelper都是基于Mybatis的基础上进行二开的。 所以,他们的问题基本上就比较明显。 每个的对应的Mybatis的版本都是不一样的。

SqlSessionFactoryBean 问题

  1. 在实际代码的引入包中,会发生版本的冲突问题。可能PageHelper中的Mybaits把Mybatis—Plus中的Mybatis覆盖

PageHelper与MybatisPlus共存其一分页失效问题

PageHelper与Mybatis-plus实现分页都用到了jsqlparser包,Mybatis-P需要jsqlparser 4.0及以上,PageHelper与Mybatis需要jsqlparser 1.4及以下

所以PageHelper与MybatisPlus分页只能选其一

<dependency>
<groupId>com.github.jsqlparser</groupId> 
<artifactId>jsqlparser</artifactId>
</dependency>

所以,如果同时配置了mybatis-plus的PaginationInnerInterceptor(分页拦截器)并且引入了pagehelper包,那么,这个时候pagehelper分页会失效,只有mybatis-plus的分页才能正常使用。

一般分页出问题的,大多数都是因为版本不兼容的问题导致的。

解决方案

分页问题

1.如果需要使用Mybatis-plus的分页则去PageHelper中排除jsqlparser

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <version>${pagehelper.spring.boot.starter.version}</version>
   <exclusions>
      <exclusion>
       <artifactId>jsqlparser</artifactId>
       <groupId>com.github.jsqlparser</groupId>
      </exclusion>
   </exclusions>
</dependency>

2.如果需要使用PageHelper的分页则去Mybatis-plus排除掉jsqlparser

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.5.3.1</version>
   <exclusions>
      <!-- 解决jsqlparser 依赖版本冲突-->
      <exclusion>
         <artifactId>jsqlparser</artifactId>
         <groupId>com.github.jsqlparser</groupId>
      </exclusion>
   </exclusions>
</dependency>

SqlSessionFactoryBean问题

//Mybatis 升级 MybatisPlus 由SqlSessionFactoryBean 替换为MybatisSqlSessionFactoryBean
//final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();

排除PageHelper中的Mybatis

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <version>${pagehelper.spring.boot.starter.version}</version>
   <exclusions>
      <exclusion>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
      </exclusion>
      <exclusion>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis-spring</artifactId>
      </exclusion>
   </exclusions>
</dependency>