Spring Boot3.3.X整合Mybatis-Plus

前提说明:

项目的springboot版本为:3.3.2

需要整合的mybatis-plus版本:3.5.7

废话不多说,开始造吧

1.准备好数据库和表

2.配置全局文件application.properties或者是application.yml(配置mapper的映射文件路径)

我这里是application.properties,配置如下:

#配置服务器端口号
server.port=9090
#连接数据库
spring.application.name=dormitory_backend
spring.datasource.url=jdbc:mysql://localhost:3306/dormitory?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#mybatis-plus配置mapper文件路径
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
#打印sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.dormitory.dormitory_backend.mapper=DEBUG

3.启动类配置包扫描注解和路径信息

配置之前先看下我这边的包结构

启动类,造吧?找到有@SpringBootApplication注解的类就是了,在其位置加上包扫描注解@MapperScan(“com.dormitory.dormitory_backend.mapper”)

注意括号里面的内容需要根据自己的包结构来配置,com.dormitory.dormitory_backend是我的包结构,主要看java,实在不懂,那就任意打开一个XXXmapper.java文件,看其包结构,框起来的一整个复制粘贴上去就可以了


4.导入依赖:

无效依赖—我尝试过导入网上的各种mybatis-plus的依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-annotation</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-core</artifactId>
    <version>3.5.1</version>
</dependency>

至于为什么说是无效依赖,导入以上的依赖无法使用mybatis-plus自带的方法

发送请求时,后台产生以下报错:

Invalid bound statement (not found): com.dormitory.dormitory_backend.mapper.AttendanceMapper.deleteById

AttendanceMapper的deleteById方法是无效的绑定语句,也就是,无法识别到mybatis-plus自带的删除方法,但是可以识别自定义的mapper语句,能正常进行增删改查,也就是原mybatis的写法呗,但是,我想快速实现CRUD啊!于是,网上找了一个解决的方法,配置一个类,请看下文:

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;

@Configuration
public class MybatisPlusConfig {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private MybatisProperties properties;
    @Autowired
    private ResourceLoader resourceLoader = new DefaultResourceLoader();
    @Autowired(required = false)
    private Interceptor[] interceptors;
    @Autowired(required = false)
    private DatabaseIdProvider databaseIdProvider;

    /**
     * mybatis-plus分页插件
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor(){
        PaginationInnerInterceptor page= new PaginationInnerInterceptor();
        return page;
    }

    /**
     * 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定 <p> 配置文件和mybatis-boot的配置文件同步 @return
     */
    @Bean
    public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() {
        MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
        mybatisPlus.setDataSource(dataSource);
        mybatisPlus.setVfs(SpringBootVFS.class);
        if (StringUtils.hasText(this.properties.getConfigLocation()))
            mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
        if (!ObjectUtils.isEmpty(this.interceptors)) mybatisPlus.setPlugins(this.interceptors);
        MybatisConfiguration mc = new MybatisConfiguration();
        mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        // 数据库字段设计为驼峰命名,默认开启的驼峰转下划线会报错字段找不到
        mc.setMapUnderscoreToCamelCase(true);
        mybatisPlus.setConfiguration(mc);
        if (this.databaseIdProvider != null) mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider);
        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage()))
            mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage()))
            mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations()))
            mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations());
        return mybatisPlus;
    }
}

配置了这个类,确实是可以使用mybatis-plus自带的方法,但是自己写的方法却无法实现了

实现配置类后,请求自定义的新增方法:

实现配置类后,请求mybatis-plus自带的删除方法:

几经辗转,发现导入以下这个依赖可以实现同时使用自定义方法和mybatis-plus自带方法,注意:需要删除MybatisPlusConfig类,以及将原先导入的三个依赖替换成新的依赖就可以了

有效依赖—导入mybatis-plus的依赖:

---------------原依赖-----------------
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-annotation</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-core</artifactId>
    <version>3.5.1</version>
</dependency>

--------------新依赖------------------
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.7</version>
</dependency>

5.实现表对应的实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_attendance")
public class Attendance {
    @ApiModelProperty("自增id")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty("账号(学号)")
    @TableField("user_account")
    private String userAccount;

    @ApiModelProperty("缺勤原因")
    @TableField("reason")
    private String reason;
}

6.mapper和xml

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dormitory.dormitory_backend.entity.Attendance;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface AttendanceMapper extends BaseMapper<Attendance> {
    int insertAttendance(Attendance attendance);
    int deleteAttendance(Integer id);
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dormitory.dormitory_backend.mapper.AttendanceMapper">
    <insert id="insertAttendance" parameterType="com.dormitory.dormitory_backend.entity.Attendance">
        insert into t_attendance(user_account,reason) values(#{userAccount},#{reason})
    </insert>
    <delete id="deleteAttendance">
        delete from t_attendance where id = #{id}
    </delete>

</mapper>

7.service和impl

public interface AttendanceService {
    int addAttendance(Attendance attendance);
    int deleteAttendance(Integer id);
}

import com.dormitory.dormitory_backend.entity.Attendance;
import com.dormitory.dormitory_backend.mapper.AttendanceMapper;
import com.dormitory.dormitory_backend.service.AttendanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class AttendanceServiceImpl implements AttendanceService {
    @Autowired
    private AttendanceMapper attendanceMapper;

    /**
     * 自定义的新增方法
     * @param attendance
     * @return
     */
    @Override
    public int addAttendance(Attendance attendance) {
        int insert = attendanceMapper.insertAttendance(attendance);
        return insert;
    }

    /**
     * plus自带的删除方法
     * @param id
     * @return
     */
    @Override
    public int deleteAttendance(Integer id) {
        return attendanceMapper.deleteById(id);
    }
}

8.controller

import com.dormitory.dormitory_backend.entity.Attendance;
import com.dormitory.dormitory_backend.service.AttendanceService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/attendance")
@Api(tags = {"考勤管理"})
public class AttendanceController {
    @Autowired
    private AttendanceService attendanceService;

    @PostMapping("/addAttendance")
    public int addAttendance(@RequestBody Attendance attendance){
        int addAttendance = attendanceService.addAttendance(attendance);
        return addAttendance;
    }

    @DeleteMapping("/deleteAttendance")
    public int deleteAttendance(Integer id){
        int addAttendance = attendanceService.deleteAttendance(id);
        return addAttendance;
    }
}

9.实现

唠一唠:出现Invalid bound statement (not found)问题的原因可能有哪些

1.全局配置文件没配好?

检查全局配置文件application.properties或application.yml是否配置扫描mapper包的文件路径

#mybatis配置mapper文件路径
#mybatis.mapper-locations=classpath:/mapper/*.xml
#mybatis-plus配置mapper文件路径
mybatis-plus.mapper-locations=classpath:/mapper/*.xml

2.启动类没加包扫描注解 ?

检查启动类上是否添加包扫描注解

@SpringBootApplication
@MapperScan("项目路径.mapper")
public class DormitoryBackendApplication {
    public static void main(String[] args) {
        SpringApplication.run(DormitoryBackendApplication.class, args);
}

3.没使用@Mapper注解?

XXXmapper.java类是否使用@Mapper注解

@Mapper
public interface AttendanceMapper extends BaseMapper<Attendance> {}

4.命名空间不正确?

检查XXXmapper.xml的命名空间是否正确,是否能跳转到对应的XXXmapper.java

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dormitory.dormitory_backend.mapper.AttendanceMapper"></mapper>

正常能跳转会有箭头图标,点击能跳转(下载一个插件)

<think> 我们正在讨论Spring Boot 3.x集成MyBatis-Plus所需的额外调整。根据引用内容,我们可以总结出以下几点关键调整: 1. **依赖替换**:Spring Boot 3.x需要将原来的`mybatis-plus-boot-starter`替换为`mybatis-plus-spring-boot3-starter`(引用[2])。这是因为Spring Boot 3.x基于Spring Framework 6,而后者使用了Jakarta EE 9+,包名从`javax`改为`jakarta`,导致原有starter不兼容。 2. **Java版本要求**:Spring Boot 3.x要求JDK版本至少为17(引用[1]),因此需要确保项目使用JDK17或更高版本。 3. **配置调整**:在配置文件(如application.properties或application.yml)中,数据源配置和MyBatis-Plus配置需要按照Spring Boot 3.x的规范进行(引用[4])。例如: - 数据源配置(包括url、username、password等) - MyBatis-Plus的mapper文件路径配置 - 日志配置(如打印SQL日志) 4. **包导入调整**:由于Spring Boot 3.x使用Jakarta EE,所有涉及到的包导入(如`@Resource`、`@PostConstruct`等)需要从`javax`改为`jakarta`(引用[1])。 5. **自动填充处理器等组件的调整**:如果项目中使用到MyBatis-Plus的自动填充功能(如`MetaObjectHandler`),需要确保这些组件被正确扫描并注入(引用[3])。 6. **分页插件等配置类的调整**:MyBatis-Plus的分页插件等配置类需要重新配置,因为Spring Boot 3.x的自动配置机制有所变化(引用[3])。 7. **启动类调整**:确保启动类上的注解(如`@MapperScan`)指向正确的包路径,并且使用正确的包名(引用[3])。 下面,我们按照步骤详细说明这些调整: ### 1. 依赖调整 在`pom.xml`中,使用以下依赖替代原有的MyBatis-Plus starter: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.5</version> <!-- 建议使用3.5.5或更高版本 --> </dependency> ``` 同时,移除原有的`mybatis-plus-boot-starter`依赖(引用[2])。 ### 2. 升级JDK版本 确保项目的JDK版本为17或更高。在Maven中配置: ```xml <properties> <java.version>17</java.version> </properties> ``` ### 3. 配置文件调整 在`application.properties`(或`application.yml`)中,配置数据源和MyBatis-Plus相关属性(引用[4]): ```properties # 服务器端口 server.port=9090 # 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # MyBatis-Plus配置 mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml # 开启SQL日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` ### 4. 包导入调整 将所有代码中使用的`javax`包替换为`jakarta`包,例如: - `javax.annotation.Resource` → `jakarta.annotation.Resource` - `javax.servlet.*` → `jakarta.servlet.*` ### 5. 自动填充处理器的调整 如果项目中有实现`MetaObjectHandler`接口的自动填充类,确保其被Spring管理(使用`@Component`注解): ```java import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 插入填充逻辑 } @Override public void updateFill(MetaObject metaObject) { // 更新填充逻辑 } } ``` ### 6. 分页插件配置 创建一个配置类,配置MyBatis-Plus的分页插件(引用[3]): ```java import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` ### 7. 启动类调整 在启动类上,使用`@MapperScan`注解指定Mapper接口的包路径: ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.mapper") // 替换为你的Mapper接口包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 8. 代码生成器调整(如果使用) 如果使用MyBatis-Plus的代码生成器,需要确保使用支持Spring Boot 3.x的版本(3.5.5+),并且在生成代码时,模板中的包导入也要使用`jakarta`包。 ### 注意事项 - **测试**:完成上述调整后,务必进行全面的测试,特别是事务和多数据源场景(引用[5]提到分布式事务,但Spring Boot 3.x可能需要额外调整分布式事务方案)。 - **日志**:如果遇到问题,开启SQL日志(如引用[4]中的配置)有助于排查。 通过以上步骤,即可在Spring Boot 3.x项目中成功集成MyBatis-Plus。如果在迁移过程中遇到启动失败或功能异常,请重点检查包导入、依赖版本和配置类是否正确[^1][^2][^3][^4]。 §§相关问题§§ 1. Spring Boot 3.x集成MyBatis-Plus时,如何解决启动报错`java.lang.ClassNotFoundException: javax.servlet.*`? 2.Spring Boot 3.x中使用MyBatis-Plus的多数据源配置需要注意什么? 3. 如何升级现有Spring Boot 2.x + MyBatis-Plus项目到Spring Boot 3.x? </think> ### Spring Boot 3.x 集成 MyBatis-Plus 的额外调整 根据引用内容,Spring Boot 3.x 集成 MyBatis-Plus 需要进行以下关键调整: #### 1. **依赖包替换(核心调整)** 必须将原有的 `mybatis-plus-boot-starter` 替换为专为 Spring Boot 3.x 设计的依赖包: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.5+</version> <!-- 推荐3.5.12+ --> </dependency> ``` ⚠️ **注意**: - 移除旧版 `mybatis-plus-boot-starter`(引用[2]) - **不要**额外添加 `mybatis-spring` 依赖,新 starter 已包含必要组件 #### 2. **JDK 版本升级** Spring Boot 3.x 要求 **JDK 17+**(引用[1]),需确保环境满足: ```shell $ java -version openjdk version "17.0.10" 2024-01-16 ``` #### 3. **包路径迁移(Jakarta EE 适配)** 所有 `javax.*` 包需替换为 `jakarta.*`: - 实体类注解: ```java // 旧版 (Spring Boot 2.x) import javax.persistence.*; // 新版 (Spring Boot 3.x) import jakarta.persistence.*; ``` - Servlet 相关组件: ```java import jakarta.servlet.http.HttpServletRequest; // 替代 javax.servlet ``` #### 4. **配置项调整** 在 `application.properties` 或 `application.yml` 中: ```properties # 数据源配置(引用[4]) spring.datasource.url=jdbc:mysql://localhost:3306/db_name?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root # MyBatis-Plus 专用配置 mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 ``` #### 5. **自动配置类更新** 需显式配置分页插件等组件(引用[3]): ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` #### 6. **代码生成器适配** 若使用代码生成器,需确保: - 使用 MyBatis-Plus 3.5.5+ 版本的生成器 - 模板中的包路径改为 `jakarta.persistence.*` - 生成的实体类字段注解更新为 `@TableId(type = IdType.AUTO)` 等新语法 #### 7. **事务管理调整(分布式场景)** 多数据源需使用 JTA 分布式事务(引用[5]): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency> ``` #### 8. **启动类验证** 确保启动类添加 Mapper 扫描注解: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 指定Mapper接口路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 常见问题解决方案 | 问题现象 | 原因 | 解决方案 | |-----------------------------------|-----------------------|------------------------------------------| | 启动报 `ClassNotFoundException` | 未替换 Jakarta 包 | 全局替换 `javax`→`jakarta` | | SQL 日志不输出 | 日志配置未生效 | 检查 `log-impl` 配置项(引用[4]) | | 分页插件失效 | 未显式配置拦截器 | 添加 `PaginationInnerInterceptor`(引用[3]) | | 字段填充(如 createTime)失效 | 处理器未注入 | 检查 `@Component` 注解是否添加 | > **关键提示**:升级后务必进行**接口测试**(引用[3])和**单元测试**,重点关注事务边界和 SQL 执行日志[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值