MyBatis-Plus筆記-快速入門

大家在日常開發中應該能發現,單表的CRUD功能代碼重復度很高,也沒有什么難度。而這部分代碼量往往比較大,開發起來比較費時。

因此,目前企業中都會使用一些組件來簡化或省略單表的CRUD開發工作。目前在國內使用較多的一個組件就是MybatisPlus.

當然,MybatisPlus不僅僅可以簡化單表操作,而且還對Mybatis的功能有很多的增強。可以讓我們的開發更加的簡單,高效。

通過今天的學習,我們要達成下面的目標:

  • 能利用MybatisPlus實現基本的CRUD

  • 會使用條件構建造器構建查詢和更新語句

  • 會使用MybatisPlus中的常用注解

  • 會使用MybatisPlus處理枚舉、JSON類型字段

  • 會使用MybatisPlus實現分頁

1.快速入門

為了方便測試,我們先創建一個新的項目,并準備一些基礎數據。

1.1.環境準備

復制課前資料提供好的一個項目到你的工作空間(不要包含空格和特殊字符):

然后用你的IDEA工具打開,項目結構如下:

注意配置一下項目的JDK版本為JDK11。首先點擊項目結構設置:

在彈窗中配置JDK:

接下來,要導入兩張表,在課前資料中已經提供了SQL文件:

對應的數據庫表結構如下:

最后,在application.yaml中修改jdbc參數為你自己的數據庫參數:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: MySQL123
logging:level:com.itheima: debugpattern:dateformat: HH:mm:ss

1.2.快速開始

比如我們要實現User表的CRUD,只需要下面幾步:

  • 引入MybatisPlus依賴

  • 定義Mapper

1.2.1引入依賴

MybatisPlus提供了starter,實現了自動Mybatis以及MybatisPlus的自動裝配功能,坐標如下:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>

由于這個starter包含對mybatis的自動裝配,因此完全可以替換掉Mybatis的starter。 最終,項目的依賴如下:

<dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

1.2.2.定義Mapper

為了簡化單表CRUD,MybatisPlus提供了一個基礎的BaseMapper接口,其中已經實現了單表的CRUD:

因此我們自定義的Mapper只要實現了這個BaseMapper,就無需自己實現單表CRUD了。 修改mp-demo中的com.itheima.mp.mapper包下的UserMapper接口,讓其繼承BaseMapper

代碼如下:

package com.itheima.mp.mapper;
?
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.mp.domain.po.User;
?
public interface UserMapper extends BaseMapper<User> {
}

1.2.3.測試

新建一個測試類,編寫幾個單元測試,測試基本的CRUD功能:

package com.itheima.mp.mapper;
?
import com.itheima.mp.domain.po.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
?
import java.time.LocalDateTime;
import java.util.List;
?
@SpringBootTest
class UserMapperTest {
?@Autowiredprivate UserMapper userMapper;
?@Testvoid testInsert() {User user = new User();user.setId(5L);user.setUsername("Lucy");user.setPassword("123");user.setPhone("18688990011");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老師\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userMapper.insert(user);}
?@Testvoid testSelectById() {User user = userMapper.selectById(5L);System.out.println("user = " + user);}
?@Testvoid testSelectByIds() {List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L, 5L));users.forEach(System.out::println);}
?@Testvoid testUpdateById() {User user = new User();user.setId(5L);user.setBalance(20000);userMapper.updateById(user);}
?@Testvoid testDelete() {userMapper.deleteById(5L);}
}

可以看到,在運行過程中打印出的SQL日志,非常標準:

11:05:01  INFO 15524 --- [ ? ? ? ? ? main] com.zaxxer.hikari.HikariDataSource ? ? ? : HikariPool-1 - Starting...
11:05:02  INFO 15524 --- [ ? ? ? ? ? main] com.zaxxer.hikari.HikariDataSource ? ? ? : HikariPool-1 - Start completed.
11:05:02 DEBUG 15524 --- [ ? ? ? ? ? main] c.i.mp.mapper.UserMapper.selectById ? ? ?: ==>  Preparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM user WHERE id=?
11:05:02 DEBUG 15524 --- [ ? ? ? ? ? main] c.i.mp.mapper.UserMapper.selectById ? ? ?: ==> Parameters: 5(Long)
11:05:02 DEBUG 15524 --- [ ? ? ? ? ? main] c.i.mp.mapper.UserMapper.selectById ? ? ?: <== ? ?  Total: 1
user = User(id=5, username=Lucy, password=123, phone=18688990011, info={"age": 21}, status=1, balance=20000, createTime=Fri Jun 30 11:02:30 CST 2023, updateTime=Fri Jun 30 11:02:30 CST 2023)

只需要繼承BaseMapper就能省去所有的單表CRUD,是不是非常簡單!

1.3.常見注解

在剛剛的入門案例中,我們僅僅引入了依賴,繼承了BaseMapper就能使用MybatisPlus,非常簡單。但是問題來了: MybatisPlus如何知道我們要查詢的是哪張表?表中有哪些字段呢?

大家回憶一下,UserMapper在繼承BaseMapper的時候指定了一個泛型:

泛型中的User就是與數據庫對應的PO.

MybatisPlus就是根據PO實體的信息來推斷出表的信息,從而生成SQL的。默認情況下:

  • MybatisPlus會把PO實體的類名駝峰轉下劃線作為表名

  • MybatisPlus會把PO實體的所有變量名駝峰轉下劃線作為表的字段名,并根據變量類型推斷字段類型

  • MybatisPlus會把名為id的字段作為主鍵

但很多情況下,默認的實現與實際場景不符,因此MybatisPlus提供了一些注解便于我們聲明表信息。

1.3.1.@TableName

說明:

  • 描述:表名注解,標識實體類對應的表

  • 使用位置:實體類

示例:

@TableName("user")
public class User {private Long id;private String name;
}

TableName注解除了指定表名以外,還可以指定很多其它屬性:

屬性類型必須指定默認值描述
valueString""表名
schemaString""schema
keepGlobalPrefixbooleanfalse是否保持使用全局的 tablePrefix 的值(當全局 tablePrefix 生效時)
resultMapString""xml 中 resultMap 的 id(用于滿足特定類型的實體類對象綁定)
autoResultMapbooleanfalse是否自動構建 resultMap 并使用(如果設置 resultMap 則不會進行 resultMap 的自動構建與注入)
excludePropertyString[]{}需要排除的屬性名 @since 3.3.1

1.3.2.@TableId

說明:

  • 描述:主鍵注解,標識實體類中的主鍵字段

  • 使用位置:實體類的主鍵字段

示例:

@TableName("user")
public class User {@TableIdprivate Long id;private String name;
}

TableId注解支持兩個屬性:

屬性類型必須指定默認值描述
valueString""表名
typeEnumIdType.NONE指定主鍵類型

IdType支持的類型有:

描述
AUTO數據庫 ID 自增
NONE無狀態,該類型為未設置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT)
INPUTinsert 前自行 set 主鍵值
ASSIGN_ID分配 ID(主鍵類型為 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認實現類為DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主鍵類型為 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認 default 方法)
ID_WORKER分布式全局唯一 ID 長整型類型(please use ASSIGN_ID)
UUID32 位 UUID 字符串(please use ASSIGN_UUID)
ID_WORKER_STR分布式全局唯一 ID 字符串類型(please use ASSIGN_ID)

這里比較常見的有三種:

  • AUTO:利用數據庫的id自增長

  • INPUT:手動生成id

  • ASSIGN_ID:雪花算法生成Long類型的全局唯一id,這是默認的ID策略

1.3.3.@TableField

說明:

描述:普通字段注解

示例:

@TableName("user")
public class User {@TableIdprivate Long id;private String name;private Integer age;@TableField("isMarried")private Boolean isMarried;@TableField("'concat'")private String concat;@TableField(exist = false)private String address;
}

一般情況下我們并不需要給字段添加@TableField注解,一些特殊情況除外:

  • 成員變量名與數據庫字段名不一致

  • 成員變量是以isXXX命名,按照JavaBean的規范,MybatisPlus識別字段時會把is去除,這就導致與數據庫不符。

  • 成員變量名與數據庫一致,但是與數據庫的關鍵字沖突。使用@TableField注解給字段名添加轉義字符:``。

  • 成員變量不是數據庫字段

支持的其它屬性如下:

屬性類型必填默認值描述
valueString""數據庫字段名
existbooleantrue是否為數據庫表字段
conditionString""字段 where 實體查詢比較條件,有值設置則按設置的值為準,沒有則為默認全局的 %s=#{%s},參考(opens new window)
updateString""字段 update set 部分注入,例如:當在version字段上注解update="%s+1" 表示更新時會 set version=version+1 (該屬性優先級高于 el 屬性)
insertStrategyEnumFieldStrategy.DEFAULT舉例:NOT_NULL insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
updateStrategyEnumFieldStrategy.DEFAULT舉例:IGNORED update table_a set column=#{columnProperty}
whereStrategyEnumFieldStrategy.DEFAULT舉例:NOT_EMPTY where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
fillEnumFieldFill.DEFAULT字段自動填充策略
selectbooleantrue是否進行 select 查詢
keepGlobalFormatbooleanfalse是否保持使用全局的 format 進行處理
jdbcTypeJdbcTypeJdbcType.UNDEFINEDJDBC 類型 (該默認值不代表會按照該值生效)
typeHandlerTypeHander類型處理器 (該默認值不代表會按照該值生效)
numericScaleString""指定小數點后保留的位數

1.4.常見配置

MybatisPlus也支持基于yaml文件的自定義配置,詳見官方文檔:

https://www.baomidou.com/pages/56bac0/#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE

大多數的配置都有默認值,因此我們都無需配置。但還有一些是沒有默認值的,例如:

  • 實體類的別名掃描包

  • 全局id類型

mybatis-plus:type-aliases-package: com.itheima.mp.domain.poglobal-config:db-config:id-type: auto # 全局id類型為自增長

需要注意的是,MyBatisPlus也支持手寫SQL的,而mapper文件的讀取地址可以自己配置:

mybatis-plus:mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,當前這個是默認值。

可以看到默認值是classpath*:/mapper/**/*.xml,也就是說我們只要把mapper.xml文件放置這個目錄下就一定會被加載。

例如,我們新建一個UserMapper.xml文件:

然后在其中定義一個方法:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mp.mapper.UserMapper">
?<select id="queryById" resultType="User">SELECT * FROM user WHERE id = #{id}</select>
</mapper>

然后在測試類UserMapperTest中測試該方法:

@Test
void testQuery() {User user = userMapper.queryById(1L);System.out.println("user = " + user);
}

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

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

相關文章

Maven jar 包下載失敗問題處理

Maven jar 包下載失敗問題處理 1.配置好國內的Maven源2.重新下載3. 其他問題 1.配置好國內的Maven源 打開??的 Idea 檢測 Maven 的配置是否正確&#xff0c;正確的配置如下圖所示&#xff1a; 檢查項?共有兩個&#xff1a; 確認右邊的兩個勾已經選中&#xff0c;如果沒有請…

Spring 核心技術解析【純干貨版】- IX:Spring 數據訪問模塊 Spring-Jdbc 模塊精講

在現代企業級應用中&#xff0c;數據訪問層的穩定性和高效性至關重要。為了簡化和優化數據庫操作&#xff0c;Spring Framework 提供了 Spring-JDBC 模塊&#xff0c;旨在通過高度封裝的 JDBC 操作&#xff0c;簡化開發者的編碼負擔&#xff0c;減少冗余代碼&#xff0c;同時提…

探秘AI的兩大核心:決策式AI與生成式AI?

目錄 一、引言 二、從定義上來看 1. 決策式AI&#xff08;Discriminative AI&#xff09; 2. 生成式AI&#xff08;Generative AI&#xff09; 三、從技術原理上來看 1. 決策式AI&#xff08;Discriminative AI&#xff09; 2. 生成式AI&#xff08;Generative AI&#…

2.5學習

misc buuctf-假如給我三天光明 下載附件后得到了一個壓縮包和一個圖片&#xff0c;壓縮包為加密壓縮包&#xff0c;需要解出密碼&#xff0c;然后注意到這個圖片并非簡單的一個封面&#xff0c;在下方還有諸多點&#xff0c;有黑有灰。經過搜索&#xff0c;發現這是盲文通過與…

sed變量中特殊字符/處理方式

個人博客地址&#xff1a;sed變量中特殊字符/處理方式 | 一張假鈔的真實世界 如果變量值中包含斜杠&#xff08;/&#xff09;特殊字符&#xff0c;在使用sed命令的做行內字符串替換時可以使用井號&#xff08;#&#xff09;做為sed語法分隔符&#xff0c;如下&#xff1a; G…

java進階1——JVM

java進階——JVM 1、JVM概述 作用 Java 虛擬機就是二進制字節碼的運行環境&#xff0c;負責裝載字節碼到其內部&#xff0c;解釋/編譯為對 應平臺上的機器碼指令行&#xff0c;每一條 java 指令&#xff0c;java 虛擬機中都有詳細定義&#xff0c;如怎么取操 作數&#xff0c…

搭建集成開發環境PyCharm

1.下載安裝Python&#xff08;建議下載并安裝3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾選“Add Python 3.9 to PATH”復選框&#xff0c;表示將Python的路徑增加到環境變量中 2.安裝集成開發環境Pycharm http://www.jetbrains.com/pycharm/…

vue2-v-if和v-for的優先級

vue2-v-if和v-for的優先級 1.v-if和v-for的作用 v-if是條件渲染&#xff0c;只有條件表達式true的情況下&#xff0c;才會渲染v-for是基于一個數組來渲染一個列表&#xff0c;在v-for的時候&#xff0c;保證給每個元素添加獨一無二的key值&#xff0c;便于diff算法進行優化 …

通過C/C++編程語言實現“數據結構”課程中的鏈表

引言 鏈表(Linked List)是數據結構中最基礎且最重要的線性存儲結構之一。與數組的連續內存分配不同,鏈表通過指針將分散的內存塊串聯起來,具有動態擴展和高效插入/刪除的特性。本文將以C/C++語言為例,從底層原理到代碼實現,手把手教你構建完整的鏈表結構,并深入探討其應…

《redis4.0 通信模塊源碼分析(一)》

【redis導讀】redis作為一款高性能的內存數據庫&#xff0c;面試服務端開發&#xff0c;redis是繞不開的話題&#xff0c;如果想提升自己的網絡編程的水平和技巧&#xff0c;redis這款優秀的開源軟件是很值得大家去分析和研究的。 筆者從大學畢業一直有分析redis源碼的想法&…

開源安全一站式構建!開啟企業開源治理新篇章

在如今信息技術日新月異、飛速發展的數字化時代&#xff0c;開源技術如同一股強勁的東風&#xff0c;為企業創新注入了源源不斷的活力&#xff0c;然而&#xff0c;正如一枚硬幣有正反兩面&#xff0c;開源技術的廣泛應用亦伴隨著不容忽視的挑戰。安全風險如影隨形&#xff0c;…

DeePseek結合PS!批量處理圖片的方法教程

? ? 今天我們來聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;實現圖片的批量處理。 傳統上&#xff0c;批量修改圖片尺寸、分辨率等任務往往需要編寫腳本或手動處理&#xff0c;而現在有了AI的輔助&#xff0c;我們可以輕松生成PS腳本&#xff0c;實現自動化處…

13.代理模式(Proxy Pattern)

定義 代理模式&#xff08;Proxy Pattern&#xff09; 是一種結構型設計模式&#xff0c;它通過提供一個代理對象來控制對目標對象的訪問。代理對象作為客戶端與目標對象之間的中介&#xff0c;間接地訪問目標對象的功能。代理模式可以在不改變目標對象的情況下增加一些額外的…

DBeaver連接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解決方法

在使用DBeaver連接MySQL數據庫時&#xff0c;如果遇到“Access denied for user ip (using password: YES)”的錯誤提示&#xff0c;說明用戶認證失敗。此問題通常與數據庫用戶權限、配置錯誤或網絡設置有關。本文將詳細介紹解決此問題的步驟。 一、檢查用戶名和密碼 首先&am…

Python進行模型優化與調參

在數據科學與機器學習領域,模型的優化與調參是提高模型性能的重要步驟之一。模型優化可以幫助提高模型的準確性和泛化能力,而合理的調參則能夠充分發揮模型的潛力。這篇教程將重點介紹幾種常用的模型優化與調參方法,特別是超參數調整和正則化技術的應用。這些技術能夠有效地…

Verilog基礎(三):過程

過程(Procedures) - Always塊 – 組合邏輯 (Always blocks – Combinational) 由于數字電路是由電線相連的邏輯門組成的,所以任何電路都可以表示為模塊和賦值語句的某種組合. 然而,有時這不是描述電路最方便的方法. 兩種always block是十分有用的: 組合邏輯: always @(…

2024年12月 Scratch 圖形化(一級)真題解析 中國電子學會全國青少年軟件編程等級考試

202412 Scratch 圖形化&#xff08;一級&#xff09;真題解析 中國電子學會全國青少年軟件編程等級考試 一、單選題(共25題&#xff0c;共50分) 第 1 題 點擊下列哪個按鈕&#xff0c;可以將紅框處的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 標…

C++【深入 STL--list 之 迭代器與反向迭代器】

接前面的手撕list(上)文章&#xff0c;由于本人對于list的了解再一次加深。本文再次對list進行深入的分析與實現。旨在再一次梳理思路&#xff0c;修煉代碼內功。 1、list 基礎架構 list底層為雙向帶頭循環鏈表&#xff0c;問題是如何來搭建這個list類。可以進行下面的考慮&am…

如何打開vscode系統用戶全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用戶配置文件&#xff0c;它存儲了 編輯器的個性化設置&#xff0c;包括界面布局、代碼格式化、擴展插件、快捷鍵等&#xff0c;是用戶全局配置&#xff08;影響所有…

wordpress外貿獨立站常用詢盤軟件

LiveChat LiveChat是一家提供實時聊天軟件的公司&#xff0c;幫助企業通過其平臺與客戶進行即時通訊&#xff0c;提高客戶滿意度和忠誠度。他們的產品允許企業在網站、應用程序或電子郵件等多個渠道與客戶互動&#xff0c;從而提升客戶體驗并促進銷售增長。 LiveChat的軟件特…