SpringBoot3.3.X整合Mybatis-Plus的實(shí)現(xiàn)示例
前提說明:
項(xiàng)目的springboot版本為:<version>3.3.2</version>
需要整合的mybatis-plus版本:<version>3.5.7</version>
廢話不多說,開始造吧
1.準(zhǔn)備好數(shù)據(jù)庫(kù)和表
2.配置全局文件
application.properties或者是application.yml(配置mapper的映射文件路徑)
我這里是application.properties,配置如下:
#配置服務(wù)器端口號(hào) server.port=9090 #連接數(shù)據(jù)庫(kù) 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.啟動(dòng)類配置包掃描注解和路徑信息
配置之前先看下我這邊的包結(jié)構(gòu)

啟動(dòng)類,造吧?找到有@SpringBootApplication注解的類就是了,在其位置加上包掃描注解@MapperScan("com.dormitory.dormitory_backend.mapper")

注意括號(hào)里面的內(nèi)容需要根據(jù)自己的包結(jié)構(gòu)來(lái)配置,com.dormitory.dormitory_backend是我的包結(jié)構(gòu),主要看java,實(shí)在不懂,那就任意打開一個(gè)XXXmapper.java文件,看其包結(jié)構(gòu),框起來(lái)的一整個(gè)復(fù)制粘貼上去就可以了


4.導(dǎo)入依賴
無(wú)效依賴---我嘗試過導(dǎo)入網(wǎng)上的各種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>至于為什么說是無(wú)效依賴,導(dǎo)入以上的依賴無(wú)法使用mybatis-plus自帶的方法
發(fā)送請(qǐng)求時(shí),后臺(tái)產(chǎn)生以下報(bào)錯(cuò):
Invalid bound statement (not found): com.dormitory.dormitory_backend.mapper.AttendanceMapper.deleteById
AttendanceMapper的deleteById方法是無(wú)效的綁定語(yǔ)句,也就是,無(wú)法識(shí)別到mybatis-plus自帶的刪除方法,但是可以識(shí)別自定義的mapper語(yǔ)句,能正常進(jìn)行增刪改查,也就是原mybatis的寫法唄,但是,我想快速實(shí)現(xiàn)CRUD?。∮谑?,網(wǎng)上找了一個(gè)解決的方法,配置一個(gè)類,請(qǐng)看下文:
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分頁(yè)插件
*/
@Bean
public PaginationInnerInterceptor paginationInnerInterceptor(){
PaginationInnerInterceptor page= new PaginationInnerInterceptor();
return page;
}
/**
* 這里全部使用mybatis-autoconfigure 已經(jīng)自動(dòng)加載的資源。不手動(dòng)指定 <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);
// 數(shù)據(jù)庫(kù)字段設(shè)計(jì)為駝峰命名,默認(rèn)開啟的駝峰轉(zhuǎn)下劃線會(huì)報(bào)錯(cuò)字段找不到
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;
}
}
配置了這個(gè)類,確實(shí)是可以使用mybatis-plus自帶的方法,但是自己寫的方法卻無(wú)法實(shí)現(xiàn)了
實(shí)現(xiàn)配置類后,請(qǐng)求自定義的新增方法:

實(shí)現(xiàn)配置類后,請(qǐng)求mybatis-plus自帶的刪除方法:

幾經(jīng)輾轉(zhuǎn),發(fā)現(xiàn)導(dǎo)入以下這個(gè)依賴可以實(shí)現(xiàn)同時(shí)使用自定義方法和mybatis-plus自帶方法,注意:需要?jiǎng)h除MybatisPlusConfig類,以及將原先導(dǎo)入的三個(gè)依賴替換成新的依賴就可以了
有效依賴---導(dǎo)入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.實(shí)現(xiàn)表對(duì)應(yīng)的實(shí)體類
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("賬號(hào)(學(xué)號(hào))")
@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.實(shí)現(xiàn)

嘮一嘮:出現(xiàn)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.啟動(dòng)類沒加包掃描注解 ?
檢查啟動(dòng)類上是否添加包掃描注解
@SpringBootApplication
@MapperScan("項(xiàng)目路徑.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的命名空間是否正確,是否能跳轉(zhuǎn)到對(duì)應(yīng)的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>正常能跳轉(zhuǎn)會(huì)有箭頭圖標(biāo),點(diǎn)擊能跳轉(zhuǎn)(下載一個(gè)插件)


到此這篇關(guān)于SpringBoot3.3.X整合Mybatis-Plus的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot3.3.X整合Mybatis-Plus內(nèi)容請(qǐng)搜索腳本之家以
- SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級(jí)評(píng)論功能
- SpringBoot3整合mybatis-plus的實(shí)現(xiàn)
- Springboot3整合Mybatis-plus3.5.3報(bào)錯(cuò)問題解決
- SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢功能
- springboot3.2整合mybatis-plus詳細(xì)代碼示例
- SpringBoot3和mybatis-plus整合出現(xiàn)的問題解決辦法
- SpringBoot3.2.2整合MyBatis-Plus3.5.5依賴不兼容的問題解決
- SpringBoot整合Mybatis-Plus實(shí)現(xiàn)關(guān)聯(lián)查詢
- 全網(wǎng)最新springboot整合mybatis-plus的過程
相關(guān)文章
Java?常量池詳解之字符串常量池實(shí)現(xiàn)代碼
這篇文章主要介紹了Java?常量池詳解之字符串常量池,本文結(jié)合示例代碼對(duì)java字符串常量池相關(guān)知識(shí)講解的非常詳細(xì),需要的朋友可以參考下2022-12-12
springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例
這篇文章主要介紹了springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
5分鐘搭建SpringCloud Eureka服務(wù)注冊(cè)中心的實(shí)現(xiàn)
這篇文章主要介紹了5分鐘搭建SpringCloud Eureka服務(wù)注冊(cè)中心的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java的Finalizer引發(fā)的內(nèi)存溢出問題及解決
本文介紹了Java中的Finalizer機(jī)制,解釋了當(dāng)類實(shí)現(xiàn)finalize()方法時(shí),JVM的行為和潛在的風(fēng)險(xiǎn),通過一個(gè)示例程序,展示了實(shí)現(xiàn)finalize()方法會(huì)導(dǎo)致大量對(duì)象存活,最終引發(fā)OutOfMemoryError,文章分析了GC日志,解釋了Finalizer線程和主線程之間的競(jìng)爭(zhēng)2025-03-03
利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù)
這篇文章主要介紹了利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù),區(qū)塊鏈的應(yīng)用范圍幾乎無(wú)窮無(wú)盡,關(guān)于區(qū)塊鏈?zhǔn)侨绾芜\(yùn)作的,下文來(lái)看看具體的內(nèi)容介紹吧,需要的朋友可以參考一下2022-04-04
在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)的代碼示例
在現(xiàn)代微服務(wù)架構(gòu)中,通常需要與多個(gè)數(shù)據(jù)庫(kù)交互的服務(wù),這可能是由于各種原因,例如遺留系統(tǒng)集成、不同類型的數(shù)據(jù)存儲(chǔ)需求,或者僅僅是為了優(yōu)化性能,在本綜合指南中,我們將探討如何在 Spring Boot 微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)連接,需要的朋友可以參考下2024-12-12
SpringBoot修改內(nèi)置tomcat版本的操作步驟
生產(chǎn)環(huán)境使用的外部部署Tomcat還是內(nèi)置Tomcat由于版本安全漏洞,往往需要升級(jí)到指定的安全版本,本文演示一下SpringBoot升級(jí)內(nèi)置的Tomcat版本,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-07-07
Java分布式鎖、分布式ID和分布式事務(wù)的實(shí)現(xiàn)方案
在分布式系統(tǒng)中,分布式鎖、分布式ID和分布式事務(wù)是常用的組件,用于解決并發(fā)控制、唯一標(biāo)識(shí)和數(shù)據(jù)一致性的問題,本文將介紹Java中常用的分布式鎖、分布式ID和分布式事務(wù)的實(shí)現(xiàn)方案,并通過具體的示例代碼演示它們的用法和應(yīng)用場(chǎng)景2023-06-06
SpringBoot監(jiān)控模塊Actuator的用法詳解
Spring?Boot?Actuator?是?Spring?Boot?自帶的一個(gè)功能模塊,提供了一組已經(jīng)開箱即用的生產(chǎn)環(huán)境下常用的特性和服務(wù),比如應(yīng)用程序的健康檢查、信息暴露、度量收集、日志記錄等,本文將給大家詳細(xì)SpringBoot監(jiān)控模塊Actuator的用法2023-06-06

