月下飞天镜,云生结海楼。
1 前言
在前文中已经分享了springboot 3.0项目升级实践 和 Springcloud Alibaba + jdk17+nacos 项目实践,在本文中,将继续分享项目升级遇到的问题,springboot3 和 mybatisplus3 是项目开发过程中重要的框架,在 jdk17 的环境下,会遇到一些使用的配置和api的运用问题。本文将结合项目升级实践,分享项目改造过程中遇到的问题。
2 依赖引入
在项目开发中, mybatisplus 的引入自从 3.5.4 之后,引入方式可以使用 mybatis-plus-boot-starter 也可以使用 mybatis-plus-spring-boot3-starter。如下所示,常用的 mybatisplus 如下所示。
            
            
              xml
              
              
            
          
          <!-- mybatis-plus-spring-boot3-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>${mybatisplus.version}</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatisplus.version}</version>
</dependency>
<!-- mybatis-plus-extension  扩展功能 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>${mybatisplus.version}</version>
</dependency>
<!-- mybatis-plus-generator 代码自动生成工具-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>${mybatisplus.version}</version>
</dependency>
        在项目中,使用 mybatisplus 按照业务要求对数据进行增删改查,在分页查询的场景下,进行了分页插件的配置。
            
            
              java
              
              
            
          
          // jdk1.8 环境下 mybatis-plus 分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}
// jdk17 环境下 mybatis-plus-3.5.5 分页插件
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}
        这里分享一下在项目开发中常用的数据库和 myabtisplus 的配置信息。
            
            
              yaml
              
              
            
          
          # mybatis-plus 配置
mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml
  type-aliases-package: com.platform.bootlog.entity
  global-config:
    db-config:
      id-type: assign_id
    banner: true
  configuration:
    map-underscore-to-camel-case: true
     # 是否输出执行的sql 信息
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 
    # log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
# spring datasource 配置
spring:
  application:
    name: boot-log
  profiles:
    active: dev
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      connection-test-query: select 1
      max-lifetime: 180000
      minimum-idle: 10
      maximum-pool-size: 50
      idle-timeout: 36000
      connection-timeout: 50000
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://localhost:3306/mall_business?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true&useAffectedRows=true
    username: root
    password: 123456
        3 问题分析
3.1 SelectExpressionItem ClassNotFoundException
由于项目开发引入的是公司封装的依赖,在升级依赖时遇到了问题 ClassNotFound,错误的详细内容如下图所示。

错误信息是类 SelectExpressionItem 找不到,由于 mybatisplus 升级,其分页插件的配置也发生了变化。

            
            
              xml
              
              
            
          
          <dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.6</version>
</dependency>
        这里依赖的版本不匹配问题,在 mybatisplus3.5.5 中应该匹配的版本是 jsqlparser4.6 ,但是项目中还引入了 jsqlparser4.7 的版本。解决办法将高版本的依赖 exclude 掉即可实现错误的解决。
3.2 分页插件使用不当
在业务进行分页查询操作时,需要确保在启动类上添加 @MapperScan 注解或者在每个 mapper 方法上添加 @Mapper 注解,确保 Mapper 文件能够正确的添加到项目配置中。此外对于查询参数,可以使用定义实体类继承 Page 对象或者自定义 Page 查询参数进行操作,对于使用排序的分页查询方法,需要自定义排序对象进行处理。此外需要说明的是使用 Wrapper 不能进行关联表查询,关联表查询的需要在 xml 文件中自定义查询语句进行处理。
3.3 批量处理
常见问题是批量操作新增或者更新,使用 Mybatis-Plus 提供的批量操作方法性能欠佳,此外还要考虑批量处理的性能问题,如果业务需要大量的批处理动作,需要自定义 sql 进行处理。
4 总结
在本文中,主要分享了在 springboot3 升级过程中,与 Mybatis-Plus 整合实践遇到的问题。升级框架使用jdk17是大趋势,在这个过程中会持续不断的遇到各种类型的问题,在这个过程中能够增加自己的实践经验和解决问题的能力。后续还会继续分享升级整合过程中遇到的冲突和问题。