springboot3与mybatisplus3.5.5 升级实践

月下飞天镜,云生结海楼。

1 前言

在前文中已经分享了springboot 3.0项目升级实践Springcloud Alibaba + jdk17+nacos 项目实践,在本文中,将继续分享项目升级遇到的问题,springboot3mybatisplus3 是项目开发过程中重要的框架,在 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是大趋势,在这个过程中会持续不断的遇到各种类型的问题,在这个过程中能够增加自己的实践经验和解决问题的能力。后续还会继续分享升级整合过程中遇到的冲突和问题。

相关推荐
格鸰爱童话7 分钟前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
H_老邪24 分钟前
spring boot 学习之路-1.0
spring boot·后端·学习
Flittly27 分钟前
【SpringAIAlibaba新手村系列】(18)Agent 智能体与今日菜单应用
java·spring boot·agent
树獭叔叔34 分钟前
Claude Code Skill 系统:懒加载的 Agent 行动说明
后端·aigc·openai
Nexzk39 分钟前
我把 Hermes Agent 源码扒了个底朝天:它不是“又一个 AI Agent”,而是在认真造一套代理操作系统
后端
袋鱼不重39 分钟前
Hermes Agent 安装与实战:从安装到与 OpenClaw 全方位对比
前端·后端·ai编程
写Cpp的小黑黑42 分钟前
C++ std::shared_ptr 线程安全性和最佳实践详解
后端
沸点小助手44 分钟前
「 AI 整活大赛,正式开擂 & 最近一次面试被问麻了吗」沸点获奖名单公示|本周互动话题上新🎊
前端·人工智能·后端
何陋轩1 小时前
消息队列Kafka与RabbitMQ深度解析:把分布式消息核心讲透,吊打面试官
redis·后端
青Cheng序员石头1 小时前
龙虾运行时安全部署 | NVIDIA NemoClaw 深度研究报告
后端·aigc·nvidia