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ù)庫和表
2.配置全局文件
application.properties或者是application.yml(配置mapper的映射文件路徑)
我這里是application.properties,配置如下:
#配置服務(wù)器端口號(hào) server.port=9090 #連接數(shù)據(jù)庫 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)來配置,com.dormitory.dormitory_backend是我的包結(jié)構(gòu),主要看java,實(shí)在不懂,那就任意打開一個(gè)XXXmapper.java文件,看其包結(jié)構(gòu),框起來的一整個(gè)復(fù)制粘貼上去就可以了
4.導(dǎo)入依賴
無效依賴---我嘗試過導(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>
至于為什么說是無效依賴,導(dǎo)入以上的依賴無法使用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方法是無效的綁定語句,也就是,無法識(shí)別到mybatis-plus自帶的刪除方法,但是可以識(shí)別自定義的mapper語句,能正常進(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分頁插件 */ @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ù)庫字段設(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自帶的方法,但是自己寫的方法卻無法實(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)分頁查詢功能
- 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-12springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例
這篇文章主要介紹了springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-125分鐘搭建SpringCloud Eureka服務(wù)注冊(cè)中心的實(shí)現(xiàn)
這篇文章主要介紹了5分鐘搭建SpringCloud Eureka服務(wù)注冊(cè)中心的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java的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線程和主線程之間的競爭2025-03-03利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù)
這篇文章主要介紹了利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù),區(qū)塊鏈的應(yīng)用范圍幾乎無窮無盡,關(guān)于區(qū)塊鏈?zhǔn)侨绾芜\(yùn)作的,下文來看看具體的內(nèi)容介紹吧,需要的朋友可以參考一下2022-04-04在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫的代碼示例
在現(xiàn)代微服務(wù)架構(gòu)中,通常需要與多個(gè)數(shù)據(jù)庫交互的服務(wù),這可能是由于各種原因,例如遺留系統(tǒng)集成、不同類型的數(shù)據(jù)存儲(chǔ)需求,或者僅僅是為了優(yōu)化性能,在本綜合指南中,我們將探討如何在 Spring Boot 微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫連接,需要的朋友可以參考下2024-12-12SpringBoot修改內(nèi)置tomcat版本的操作步驟
生產(chǎn)環(huán)境使用的外部部署Tomcat還是內(nèi)置Tomcat由于版本安全漏洞,往往需要升級(jí)到指定的安全版本,本文演示一下SpringBoot升級(jí)內(nèi)置的Tomcat版本,感興趣的小伙伴跟著小編一起來看看吧2024-07-07Java分布式鎖、分布式ID和分布式事務(wù)的實(shí)現(xiàn)方案
在分布式系統(tǒng)中,分布式鎖、分布式ID和分布式事務(wù)是常用的組件,用于解決并發(fā)控制、唯一標(biāo)識(shí)和數(shù)據(jù)一致性的問題,本文將介紹Java中常用的分布式鎖、分布式ID和分布式事務(wù)的實(shí)現(xiàn)方案,并通過具體的示例代碼演示它們的用法和應(yīng)用場景2023-06-06SpringBoot監(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