当前位置: 首页 > news >正文

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>

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

http://www.jsqmd.com/news/450464/

相关文章:

  • Lua 的 UTF-8 模块
  • Matlab入门速成七十二:(一文识记所有代码)均值方差相关系数,分析数据的特征
  • Flutter 三方库 kdtree 的鸿蒙化适配指南 - 掌控空间搜索资产、精密算法治理实战、鸿蒙级算力专家
  • 洋州影院购票管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • Spring Cloud Nacos配置管理
  • Flutter 三方库 dart_extensions_methods 的鸿蒙化适配指南 - 掌控语法扩展资产、精密工程治理实战、鸿蒙级开发专家
  • Linux下如何使用Git工具:从安装到实战的完整指南
  • Spring Cloud Alibaba 组件版本选择
  • SpringBoot+Vue 学院个人信息管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 基于Java+SSM+Flask疫情信息管理系统(源码+LW+调试文档+讲解等)/疫情数据管理系统/疫情信息统计软件/疫情信息管理工具/公共卫生信息管理系统/疫情监控平台/实时疫情信息系统
  • Spring Integration + MQTT
  • 使用OpenClaw,搭建私人QQ助理
  • Flutter 三方库 youtube_caption_scraper 的鸿蒙化适配指南 - 掌控多媒体字幕资产、精密 Scraper 治理实战、鸿蒙级内容专家
  • 企业级养老院管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 前后端分离校车调度管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • Flutter 三方库 nyxx_commands 的鸿蒙化适配指南 - 掌控指令资产、精密 Discord Bot 治理实战、鸿蒙级交互专家
  • Flutter 三方库 delete_un_used_assets 的鸿蒙化适配指南 - 掌控清理资产、精密冗余治理实战、鸿蒙级瘦身专家
  • R语言,linux及服务器远程配置
  • Spring cloud alibaba集成nacos 报错:[Nacos Config] config[dataId=xxx, group=DEFAULT_GROUP] is empty 解决
  • 流水潺潺:探寻Linux下C语言文件流的诗意实现
  • 风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(下)
  • Spring Boot与MyBatis
  • ASP.NET商家联盟会员消费管理系统源码(含IIS+SQL Server 2005部署说明)
  • 2026年西藏抖音短视频代运营推广公司排行 - 精选优质企业推荐榜
  • 基于SpringBoot+Vue的校园一卡通abo管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 称重装置(CAD装配图)
  • 梯度下降:机器学习中的核心优化算法
  • 2026年山东抖音短视频代运营公司排行榜发布 - 精选优质企业推荐榜
  • 纸上流年:Linux基础IO的文件理解与操作
  • Spring Cloud Data Flow 简介