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 {@Autowiredprivate DataSource dataSource;@Autowiredprivate MybatisProperties properties;@Autowiredprivate ResourceLoader resourceLoader = new DefaultResourceLoader();@Autowired(required = false)private Interceptor[] interceptors;@Autowired(required = false)private DatabaseIdProvider databaseIdProvider;/*** mybatis-plus分頁插件*/@Beanpublic PaginationInnerInterceptor paginationInnerInterceptor(){PaginationInnerInterceptor page= new PaginationInnerInterceptor();return page;}/*** 這里全部使用mybatis-autoconfigure 已經自動加載的資源。不手動指定 <p> 配置文件和mybatis-boot的配置文件同步 @return*/@Beanpublic 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 mapperPUBLIC "-//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 {@Autowiredprivate AttendanceMapper attendanceMapper;/*** 自定義的新增方法* @param attendance* @return*/@Overridepublic int addAttendance(Attendance attendance) {int insert = attendanceMapper.insertAttendance(attendance);return insert;}/*** plus自帶的刪除方法* @param id* @return*/@Overridepublic 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 {@Autowiredprivate 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 mapperPUBLIC "-//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.pswp.cn/pingmian/71979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71979.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可視化圖解算法:鏈表指定區間反轉

1. 題目 描述 給你單鏈表的頭指針 head 和兩個整數 left 和 right &#xff0c;其中 left < right 。請你反轉從位置 left 到位置 right 的鏈表節點&#xff0c;返回 反轉后的鏈表 。 示例1 輸入&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], left 2, right 4 輸…

?SQL-遞歸CTE

&#x1f4d6; SQL魔法課堂&#xff1a;CTE「時間折疊術」全解 &#x1f3a9; 第一章&#xff1a;什么是CTE&#xff1f; CTE&#xff08;Common Table Expression&#xff09; 就像 SQL 里的「臨時筆記本」&#x1f4d2;&#xff1a; WITH 臨時筆記本 AS ( SELECT ... FRO…

Cursor 新手入門使用教程

一、Cursor 是什么&#xff1f; Cursor 是一個集成了 GPT-4、Claude 3.5 等先進 LLM&#xff08;大語言模型&#xff09;的類 VSCode 編譯器&#xff0c;可以理解為在 VSCode 中集成了 AI 輔助編程助手。從界面布局來看&#xff0c;Cursor 與 VSCode 基本一致&#xff0c;且使…

如何在Spring Boot中配置和使用MyBatis-Plus

在當今的Java開發中&#xff0c;Spring Boot已經成為了一個非常流行的框架&#xff0c;而MyBatis-Plus則是一個強大的ORM框架&#xff0c;為開發人員提供了更簡便的數據庫操作方式。很多開發者都在使用Spring Boot和MyBatis-Plus的組合來快速構建高效的應用。今天就來聊聊如何在…

【貪心算法3】

力扣1005.k次取反后最大化的數組和 鏈接: link 思路 既然要求最大和&#xff0c;那么不妨先給數組排個序&#xff0c;如果有負數&#xff0c;先處理負數從前往后給數組取反&#xff0c;如果負數處理完后k還有次數&#xff0c;此時數組全是正數了&#xff0c;只需要對第一個元…

自然語言處理中的語音識別技術:從聲波到語義的智能解碼

引言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是自然語言處理&#xff08;NLP&#xff09;的關鍵分支&#xff0c;旨在將人類語音信號轉化為可處理的文本信息。隨著深度學習技術的突破&#xff0c;語音識別已從實驗室走向日常生活&#xff0c;賦能…

1688店鋪所有商品數據接口詳解

??一、接口概述淘寶開放平臺提供 1688.items.onsale.get/taobao.item_search_shop 接口&#xff0c;可批量獲取店鋪在售商品列表&#xff0c;包含商品 ID、標題、價格、銷量、圖片等核心信息。該接口適用于商品庫管理、競品監控、數據分析等場景 ?二、接口調用流程 前期準…

ArduPilot開源代碼之AP_OSD

ArduPilot開源代碼之AP_OSD 1. 源由2. 簡介3. 補丁4. 框架設計4.1 啟動代碼 (AP_OSD::init)4.2 任務代碼 (AP_OSD::osd_thread)4.3 實例初始化 (AP_OSD::init_backend) 5. 重要例程5.1 AP_OSD::update_stats5.2 AP_OSD::update_current_screen5.3 AP_OSD::update_osd 6. 總結7.…

qt open3dAlpha重建

qt open3dAlpha重建 效果展示二、流程三、代碼效果展示 二、流程 創建動作,鏈接到槽函數,并把動作放置菜單欄 參照前文 三、代碼 1、槽函數實現 void on_actionAlpha_triggered();//alpha重建 void MainWindow::

Deepseek可以通過多種方式幫助CAD加速工作

自動化操作&#xff1a;通過Deepseek的AI能力&#xff0c;可以編寫腳本來自動化重復性任務。例如&#xff0c;使用Python腳本調用Deepseek API&#xff0c;在CAD中實現自動化操作。 插件開發&#xff1a;結合Deepseek進行二次開發&#xff0c;可以創建自定義的CAD插件。例如&a…

Centos的ElasticSearch安裝教程

由于我們是用于校園學習&#xff0c;所以最好是關閉防火墻 systemctl stop firewalld systemctl disable firewalld 個人喜歡安裝在opt臨時目錄&#xff0c;大家可以隨意 在opt目錄下創建一個es-standonely-docker目錄 mkdir es-standonely-docker 進入目錄編輯yml文件 se…

c++ 調用 gurobi 庫,cmake,mac

gurobi 一般使用 python 調用&#xff0c;官方的培訓會議及資料大部分也都基于 python。 由于最近上手了 c&#xff0c;因此想試試 c 怎么調用 gurobi。但我發現&#xff0c;c 調用第三方庫比 python 或 java 要復雜不少。python 中直接 import 第三方庫&#xff0c;java 加載…

Python基于Django的醫用耗材網上申領系統【附源碼、文檔說明】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Python中很常用的100個函數整理

Python 內置函數提供了強大的工具&#xff0c;涵蓋數據處理、數學運算、迭代控制、類型轉換等。本文總結了 100 個常用內置函數&#xff0c;并配備示例代碼&#xff0c;提高編程效率。 1. abs() 取絕對值 print(abs(-10)) # 10 2. all() 判斷所有元素是否為真 print(all([…

Python畢業設計選題:基于django+vue的疫情數據可視化分析系統

開發語言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 管理員登錄 管理員功能界面 用戶管理 員工管理 疫情信息管理 檢測預約管理 檢測結果…

C#程序結構及基本組成說明

C# 程序的結構主要由以下幾個部分組成,以下是對其結構的詳細說明和示例: 1. 基本組成部分 命名空間 (Namespace) 用于組織代碼,避免命名沖突。通過 using 引入其他命名空間。 using System; // 引入 System 命名空間類 (Class) C# 是面向對象的語言,所有代碼必須定義在類或…

Python 編程題 第八節:字符串變形、壓縮字符串、三個數的最大乘積、判定字符是否唯一、IP地址轉換

字符串變形 swapcase()方法將字符串大小寫轉換&#xff1b;split()方法將字符串以括號內的符號分隔并以列表形式返回 sinput() ls.split(" ") ll[::-1] s"" for i in l:ai.swapcase()sas" " print(s[0:len(s)-1]) 壓縮字符串 很巧妙的方法 …

大語言模型學習--向量數據庫基礎知識

1.向量 向量是多維數據空間中的一個坐標點。 向量類型 圖像向量 文本向量 語音向量 Embedding 非結構化數據轉換為向量過程 通過深度學習訓練&#xff0c;將真實世界離散數據&#xff0c;投影到高維數據空間上&#xff0c;通過數據在空間中間的距離體現真實世界的相似度 V…

項目工坊 | Python驅動淘寶信息爬蟲

目錄 前言 1 完整代碼 2 代碼解讀 2.1 導入模塊 2.2 定義 TaoBao 類 2.3 search_infor_price_from_web 方法 2.3.1 獲取下載路徑 2.3.2 設置瀏覽器選項 2.3.3 反爬蟲處理 2.3.4 啟動瀏覽器 2.3.5 修改瀏覽器屬性 2.3.6 設置下載行為 2.3.7 打開淘寶登錄頁面 2.3.…

藍橋杯題型

藍橋杯 藍橋杯題型分類語法基礎藝術與籃球&#xff08;日期問題&#xff09;時間顯示&#xff08;時間問題&#xff09;跑步計劃&#xff08;日期問題&#xff09;偶串(字符&#xff09;最長子序列&#xff08;字符&#xff09;字母數&#xff08;進制轉換&#xff09;6個0&…