Mybatis_plus

前言

Mybatis_plus 是在 mybatis 的基礎上進行了增強,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。本文章只做簡單的使用介紹,更加詳細的內容大家可以參考官網。

下面是mybatis_plus 官網地址:
mybatis_plus 官網

配置

springboot 3 maven 需要導入的依賴:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.10.1</version>
</dependency>

這里要注意導入了 mybatis_plus 依賴之后就不用導入 mybatis 依賴了,避免依賴的沖突,上面已經說到 mybatis_plus 是 mybatis 的增強版,也就說說 mybatis_plus 其實內部已經配置了 mybatis 的依賴。

之后就要引入數據庫的驅動依賴,這里以MySQL為例:

        <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

然后在 pom.xml 文件下,配置好數據庫的相關信息:

spring:# 數據庫連接配置datasource:url: jdbc:mysql://127.0.0.1:3306/數據庫名稱?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=trueusername: 用戶名password: 密碼driver-class-name: com.mysql.cj.jdbc.Driver

和 mybatis 一樣,mybatis_plus 也可以進行下面的配置:

mybatis-plus:configuration:map-underscore-to-camel-case: true #配置駝峰自動轉換log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql語句

快速開始

和mybatis 一樣,創建 mapper 文件夾,在里面創建數據庫操作類,這里要注意 mybatis_plus 的類要繼承 BaseMapper< T > ,這里面的泛型 T 填寫你要操縱的類:

@Mapper
public interface BookInfoMapper extends BaseMapper<BookInfo> {}

之后我們就可以直接調用里面的方法了。

Wrapper

在 MyBatis-Plus 中,Wrapper 類是構建查詢和更新條件的核心工具。以下是主要的 Wrapper 類及其功能:

AbstractWrapper:這是一個抽象基類,提供了所有 Wrapper 類共有的方法和屬性。它定義了條件構造的基本邏輯,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都繼承自 AbstractWrapper。

QueryWrapper:專門用于構造查詢條件,支持基本的等于、不等于、大于、小于等各種常見操作。它允許你以鏈式調用的方式添加多個查詢條件,并且可以組合使用 and 和 or 邏輯。

UpdateWrapper:用于構造更新條件,可以在更新數據時指定條件。與 QueryWrapper 類似,它也支持鏈式調用和邏輯組合。使用 UpdateWrapper 可以在不創建實體對象的情況下,直接設置更新字段和條件。

LambdaQueryWrapper:這是一個基于 Lambda 表達式的查詢條件構造器,它通過 Lambda 表達式來引用實體類的屬性,從而避免了硬編碼字段名。這種方式提高了代碼的可讀性和可維護性,尤其是在字段名可能發生變化的情況下。

LambdaUpdateWrapper:類似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表達式的更新條件構造器。它允許你使用 Lambda 表達式來指定更新字段和條件,同樣避免了硬編碼字段名的問題。

三個注解

@TableName

用于類指定對應的表明,如果類名命名不規范,mybatis_plus 是找不到對應的表的

假設我們要操控的表為 book_info ,如果你設置的類名不規范,正常來說應該為 BookInfo,假設你的類名為 Bookinfo,這時候mybatis_plus 是找不到表的:
在這里插入圖片描述

這時候我們可以使用 @TableName 來指定表名:

在這里插入圖片描述

@TableField

如果類的屬性命名不規范,mybatis_plus 還是找不到對應的字段:

假設字段名為 book_name , 屬性命名為 bookname:
在這里插入圖片描述

這時候就可以使用 @TableField 來指定字段名:
在這里插入圖片描述

@TableId

mybatis_plus 是不知道表的主鍵的

如果你類屬性命名不規范,無法映射為主鍵的話,可以使用 @TableId 來指定主鍵:
假設主鍵為 id ,但是屬性為 bookId

    @TableId("id")private Integer boookId;

如果主鍵和屬性可以映射,并且你的主鍵是會自增的話,要使用 @TableId(type = IdType.AUTO) 來說明該主鍵為自增。否則的話,mybaits_plus 是不知道你的主鍵是會自增的,那么它就會自己生成一個數值來進行填充。

    @TableId(type = IdType.AUTO)private Integer id;

如果主鍵和屬性映射不了,并且主鍵還是一個自增的話,可以這樣寫:

    @TableId(value = "id", type = IdType.AUTO)private Integer bookId;

QueryWrapper

示例:

    @Testvoid select2() {QueryWrapper<Bookinfo> wrapper = new QueryWrapper<>();wrapper.select("id, book_name, author, count").gt("count", 20);bookInfoMapper.selectList(wrapper).stream().forEach(System.out::println);}

由于直接使用 QueryWrapper 會寫死字段,也就會產生硬編碼的問題,所以我們可以使用 LambdaQueryWrapper 用過 Lamda 表達式來指定對應的字段名即可

示例:
可以通過 lambda() 方法將 QueryWrapper 轉化為 LambdaQueryWrapper

    @Testvoid select3() {QueryWrapper<Bookinfo> wrapper = new QueryWrapper<>();wrapper.lambda().select(Bookinfo::getId, Bookinfo::getBookname, Bookinfo::getAuthor, Bookinfo::getCount).gt(Bookinfo::getCount, 20);bookInfoMapper.selectList(wrapper).stream().forEach(System.out::println);}
    @Testvoid select4() {LambdaQueryWrapper<Bookinfo> wrapper = new LambdaQueryWrapper<>();wrapper.select(Bookinfo::getId, Bookinfo::getBookname, Bookinfo::getAuthor, Bookinfo::getCount).gt(Bookinfo::getCount, 20);bookInfoMapper.selectList(wrapper).stream().forEach(System.out::println);}

UpdateWrapper

示例:

    @Testvoid select4() {UpdateWrapper<Bookinfo> wrapper = new UpdateWrapper<>();wrapper.set("book_name", "mybatis_plus").set("author","people").set("count",45).in("id", 41);bookInfoMapper.update(wrapper);}

當然也可以使用 Lambda() 方法,使用 LambdaUpdateWrapper:

    @Testvoid select5() {UpdateWrapper<Bookinfo> wrapper = new UpdateWrapper<>();wrapper.lambda().set(Bookinfo::getBookname, "mybatis_plus").set(Bookinfo::getAuthor,"people").set(Bookinfo::getCount,45).in(Bookinfo::getId, 40);bookInfoMapper.update(wrapper);}

或者直接使用LambdaUpdateWrapper

@Testvoid select6() {LambdaUpdateWrapper<Bookinfo> wrapper = new LambdaUpdateWrapper<>();wrapper.set(Bookinfo::getBookname, "mybatis_plus").set(Bookinfo::getAuthor,"people").set(Bookinfo::getCount,45).in(Bookinfo::getId, 40);bookInfoMapper.update(wrapper);}

自定義 SQL

我們可以正常使用 mybatis 定義sql 語句的方式,使用 @Select、@Update、@Delete、@Insert 或者使用 xml 的方式來定義 sql

當然你也可以使用 Wrapper 的條件:

參數命名:在自定義 SQL 時,傳遞 Wrapper 對象作為參數時,參數名必須為 ew,或者使用注解 @Param(Constants.WRAPPER) 明確指定參數為 Wrapper 對象。
使用 ${ew.customSqlSegment}:在 SQL 語句中,使用 ${ew.customSqlSegment} 來引用 Wrapper 對象生成的 SQL 片段。
不支持基于 entity 的 where 語句:自定義 SQL 時,Wrapper 對象不會基于實體類自動生成 where 子句,你需要手動編寫完整的 SQL 語句。

示例:

@Mapper
public interface BookInfoMapper extends BaseMapper<Bookinfo> {@Select("select * from book_info ${ew.customSqlSegment}")List<Bookinfo> selectByIdAndBookName(@Param(Constants.WRAPPER) Wrapper<Bookinfo> wrapper);
}
    @Testvoid selectByBokNamwAndAuthor() {QueryWrapper<Bookinfo> wrapper = new QueryWrapper<>();wrapper.in("id", List.of(9, 28)).like("book_name","圖書一號");bookInfoMapper.selectByIdAndBookName(wrapper).stream().forEach(System.out::println);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899154.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899154.shtml

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

相關文章

深圳問頂安全科技有限公司asktopsec是做什么的?

深圳問頂安全科技有限公司&#xff0c;是一家專業的AI與應用安全公司。 全球領先的AI、Android、IOS應用安全解決方案提供商&#xff0c;官網&#xff1a;https://asktopsec.com 問頂安全主要為企業提供AI和應用安全服務 移動應用安全檢測、移動應用安全加固、AI智能體安全、AI…

鴻蒙OS 5 架構設計探秘:從分層設計到多端部署

文章目錄 鴻蒙OS架構設計探秘&#xff1a;從分層設計到多端部署一、鴻蒙的分層架構設計二、模塊化設計的精髓三、智慧分發設計&#xff1a;資源的動態調度四、一次開發&#xff0c;多端部署的實踐總結與思考 鴻蒙OS架構設計探秘&#xff1a;從分層設計到多端部署 最近兩年來&a…

idea 沒有 add framework support(添加框架支持)選項

在 IntelliJ IDEA 2023 中&#xff0c;若需通過設置手動添加 “添加框架支持” 菜單項&#xff0c;可按照以下步驟操作&#xff1a; 手動添加 “添加框架支持” 菜單項 打開設置 點擊頂部菜單欄的 File&#xff08;文件&#xff09; -> Settings&#xff08;設置&#xff09…

計算機網絡--傳輸層(2)

傳輸層核心機制深度解析 一、可靠傳輸實現機制 1. 校驗和機制 技術原理&#xff1a; 使用16位二進制反碼求和算法&#xff0c;計算范圍包括TCP偽首部&#xff08;12字節&#xff09;、TCP首部&#xff08;20字節&#xff09;和數據部分接收端重新計算校驗和&#xff0c;若與…

再探帶權并查集

典型例題 Acwing 權值 故名思義&#xff0c;在帶權并查集中&#xff0c;我們需要讓每個節點攜帶一個**“權值”**。 那么這個權值應該是什么呢&#xff1f;其實答案就在并查集當中。 由于在并查集當中我們可以在 O ( 1 ) O(1) O(1) 時間內找到一個節點的根節點&#xff0c;那…

Vala編成語言教程-構造函數和析構函數

構造函數 Vala支持兩種略有不同的構造方案&#xff1a;我們將重點討論Java/C#風格的構造方案&#xff0c;另一種是GObject風格的構造方案。 Vala不支持構造函數重載的原因與方法重載不被允許的原因相同&#xff0c;這意味著一個類不能有多個同名構造函數。但這并不構成問題&…

本地部署Stable Diffusion生成爆火的AI圖片

直接上代碼 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

python爬蟲WASM

WASM 一.WASM簡介 1.1 WASM定義 ? WebAssembly(簡稱wasm)是一個虛擬指令集體系架構(virtual ISA),整體架構包括核心的ISA定義、二進制編碼、程序語義的定義與執行,以及面向不同的嵌入環境(如Web)的應用編程接口(WebAssembly API)。是一種運行在現代網絡瀏覽器中的…

Docker鏡像遷移方案

Docker鏡像遷移方案 文章目錄 Docker鏡像遷移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;異常原因參考&#xff1a; 一&#xff1a;背景 比如機器上已經有先有的容器&#xff0c;但是docker pull的時候是失敗的二&#xff1a;操作方式 1、停止正在運行的容器…

關于跨域問題(本地前端訪問服務器端接口跨域出錯)

問題來源&#xff1a; 當服務器封裝了接口但是本地電腦端前端訪問出現跨域問題。 解決方案&#xff1b; 1、使用ipconfig 查看本地電腦的ip地址 ipconfig 2、在后端接口處配置如下代碼 allow_origins["http://本地ip地址:3001", # 局域網內其他設備訪問的本地…

邊緣計算 vs. 云計算,誰才是工業物聯網的未來?

前言 在物聯網&#xff08;IoT&#xff09;飛速發展的今天&#xff0c;邊緣計算正在徹底改變數據的處理、存儲和分析方式。傳統的IoT設備數據通常需要發送到云端進行處理&#xff0c;但隨著設備數量的激增&#xff0c;這種模式在延遲、帶寬和安全性方面暴露出諸多局限。邊緣計…

dell 臺式機 電腦 紐扣電池 如何取下?

dell 臺式機 電腦 紐扣電池 如何取下&#xff1f; 戴爾-optiplex-3060-塔式機-服務手冊

NFC 智能門鎖全棧解決方案:移動端、服務器、Web 管理平臺

目錄 一、系統整體架構 二、移動端 APP 開發 2.1 開發環境與基礎準備 2.2 主要功能模塊 2.3 示例代碼&#xff08;Android/Kotlin 簡化示例&#xff09; 三、后臺服務開發 3.1 環境準備 3.2 主要功能 3.3 示例代碼&#xff08;Node.js Express 簡化示例&#xff09; …

DDR4、DDR5、固態硬盤(SSD)和機械硬盤(HDD)在連續讀/寫、隨機讀/寫性能的對比分析

以下是關于DDR4、DDR5、固態硬盤&#xff08;SSD&#xff09;和機械硬盤&#xff08;HDD&#xff09;在連續讀/寫、隨機讀/寫性能的對比分析&#xff0c;結合技術特性與應用場景的總結&#xff1a; 一、性能對比表格 存儲類型連續讀&#xff08;MB/s&#xff09;連續寫&#x…

【AI】MAC版本本地Stable Diffusion web ui安裝

文章目錄 前言環境依賴homebrewpython3下載stable-diffusion-webui webui模型準備模型網站 中文頁面設置提示詞轉漢語轉英文controlnet安裝controlnet模型下載 結尾 前言 目前&#xff0c;市面上已經出現了很多用Ai 繪圖制作的作品&#xff0c;用于自媒體或者商業等。例如表情…

Linux 云服務器開放端口

首先找到你買服務器的官網&#xff0c;我這里是阿里云 點擊這里的控制臺 這里先點手動添加&#xff0c;再看自己是UDP還是TCP協議&#xff0c;找到對應的協議&#xff0c;目的就填你想開放的端口&#xff0c;源填所有IP/4 0.0.0.0 添加備注點擊保存就開放好了。

[unity 點擊事件] 區域響應點擊事件,排除子節點區域,Raycast Target 應用

當我打開一個二級彈窗后&#xff0c;希望可以通過點擊彈窗以外的區域來關閉該彈窗。一開始我是在彈窗主節點上掛載了一個 button 組件&#xff0c;該 button 注冊的點擊事件中關閉該彈窗。在子節點&#xff08;一個背景圖&#xff09;的image組件上啟用 Raycast Target 選項&am…

表的約束及代碼練習

一.表的約束 查看表&#xff1a;mysql> select * from t_hero; 1.設置t_hero的主鍵為t_id alter table t_hero add primary key(t_id); 2.設置t_hero t_id屬性非空 alter table t_hero modify t_id int not null;3.設置name屬性為非空非重復 alter table t_hero modify…

Linux筆記---動靜態庫(使用篇)

目錄 1. 庫的概念 2. 靜態庫&#xff08;Static Libraries&#xff09; 2.1 靜態庫的制作 2.2 靜態庫的使用 2.2.1 顯式指定庫文件及頭文件路徑 2.2.2 將庫文件安裝到系統目錄 2.2.3 將頭文件安裝到系統目錄 3. 動態庫 3.1 動態庫的制作 3.2 動態庫的使用 3.2.1 顯式…

Java并發編程2(鎖-Sychronized)

目錄 認識Java對象頭 sychronized鎖原理 基本概念 工作原理 1.作用在方法上 2.作用在代碼塊上 工作機制 JVM優化鎖 Monitor鎖 wait/notify park/unpark 線程狀態轉換案例 死鎖 概念 死鎖發生的必要條件 哲學家問題 活鎖 饑餓 概念 饑餓的原因 Reentrant…