MyBatisPlus--快速入門

MyBatisPlus介紹

從名字中就可以感覺到MybatisPlus與MyBatis之間的淵源,而MyBatis是一個非常流行的持久層框架,主要來做數據庫的增刪改查,而MyBatisPlus這種命名方式讓人不得不往MyBatis的升級版去聯想,事實也確實如此,MyBatisPlus就是對MyBatis框架的增強與升級,但MyBatisPlus并不是來替代MyBatis的,MyBatisPlus的官網logo是一只藍色的小鳥,MyBatis官網的logo是一只紅色的小鳥,并且在MyBatisPlus官網下的標語就是 MyBatis 最佳搭檔,只做增強不做改變,為簡化開發、提高效率而生。因此兩者是一種合作的關系。

而且兩者搭配使用,可以翻倍提高開發效率。因此MybatisPlus也成為了企業開發的必備工具。

那么MyBatisPlus是如何對MyBatis進行增強的呢?

我們可以從MyBatisPlus的官網文檔入手

image-20250530165410823

在實際開發中,書寫的大多數SQL語句都是單表得CRUD,花費時間最多的就是單表CRUD的代碼編寫上,而這些功能往往都是比較重復的,比較基礎的,比較浪費時間,而MyBatisPlus就幫助開發者干了一件事情:只需要簡單配置,設置不用配置,約定大于配置,那么MyBatisPlus就可以幫助開發者實現單表的CRUD的操作,,開發者只需要直接調用對應的方法就能實現對應的功能,這樣就節省了開發中大量去編寫單表CRUD的時間,開發效率也會隨之水漲船高,這就是MyBatisPlus最重要的功能。

但是MyBatisPlus不僅僅幫我們實現了單表CRUD功能,還有一些拓展功能,比如,代碼生成,自動分,邏輯刪除等等。

官方文檔:簡介 | MyBatis-Plus

官方文檔主要分為四大部分:

  • 快速入門:快速了解MyBatisPlus的基本特性。

  • 核心功能:以后再開發中寫的最多的代碼

  • 拓展:拓展的一些高級功能

  • 插件:一些插件功能,比如分頁插件,樂觀鎖插件等等

快速入門

快速開始

入門案例:

需求:基于項目,實現下列功能

  • 新增用戶功能

  • 根據ID查詢用戶

  • 根據ID批量查詢用戶

  • 根據ID更新用戶

  • 根據ID刪除用戶

以前的MyBatis冗余代碼:

?<?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.lyc.mybatisplusdemo.mapper.UserMapper">?<insert id="saveUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">insert into `user` (`id`,`username`,`password`,`phone`,`info`,`status`,`balance`)values (#{id},#{username},#{password},#{phone},#{info},#{status},#{balance})</insert><update id="updateUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">update `user`<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="phone != null">phone = #{phone},</if><if test="info != null">info = #{info},</if><if test="status != null">status = #{status},</if><if test="balance != null">balance = #{balance},</if></set>where id = #{id}</update><delete id="deleteUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">delete ?from `user` where id = #{id}</delete><select id="getUserById" resultType="com.lyc.mybatisplusdemo.pojo.User">select * from `user` where id = #{id}</select><select id="getUserByIds" resultType="com.lyc.mybatisplusdemo.pojo.User">select * from `user`<if test="ids != null">where id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></if>limit 10</select></mapper>

雖然邏輯很簡單,就是一些單表的增刪改查的語句,浪費了大量的時間,導致開發效率受到了影響,而如果使用MyBatisPlus,這些單表查詢語句都不需要書寫了,

如何使用MyBatisPlus?

步驟:

  • 引入MyBatisPlus的起步依賴

MyBatisPlus官方提供了Starter,其中集成了MyBatis和MyBatisPlus的所有功能,并且實現了自動裝配的效果。

因此我們可以使用MyBatisPlus的starter代替MyBatis的starter:

?<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.12</version></dependency>
  • 自定義Mapper

自定義的Mapper集成MyBatisPlus提供的BaseMapper接口:

因為BaseMapper中已經提前定義好了大量的增刪改查的方法,而且命名方式簡單明了。

那么我們就可以繼承BaseMapper,從而調用這些方法。

?public interface UserMapper extends BaseMapper<User> {}

注意事項:在繼承BaseMapper接口時,需要將泛型的類型換成實體類的類型。

測試代碼:

?package com.lyc.mybatisplusdemo.mapper;?import com.lyc.mybatisplusdemo.pojo.User;import jakarta.annotation.Resource;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;?import java.time.LocalDateTime;import java.util.List;?@SpringBootTestclass UserMapperTest {@Resourceprivate UserMapper userMapper;@Testvoid testInsert(){User user = new User();user.setId(5L);user.setUsername("lyc");user.setPassword("123456");user.setPhone("12345678901");user.setBalance(200);user.setInfo("{\"age\":24,\"intro\":\"英文老師\",\"gender\":\"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userMapper.saveUser(user);}@Testvoid testSelectById(){User user = userMapper.getUserById(5L);System.out.println("user = "+user);}@Testvoid testSelectByIds(){List<User> users = userMapper.getUserByIds(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.updateUser(user);}}

因為MyBatisPlus是對MyBatis的增強,因此即使我們將依賴替換成MyBatisPlus,開始在Mapper.xml中的文件依然可以使用。

進行測試:

image-20250530191202267

而使用MyBatisPlus無需再書寫SQL語句以及聲明方法了。

將這些都刪除。

在修改測試單元代碼,直接調用父類BaseMapper中的方法即可

?package com.lyc.mybatisplusdemo.mapper;?import com.lyc.mybatisplusdemo.pojo.User;import jakarta.annotation.Resource;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;?import java.time.LocalDateTime;import java.util.List;?@SpringBootTestclass UserMapperTest {@Resourceprivate UserMapper userMapper;@Testvoid testInsert(){User user = new User();user.setId(5L);user.setUsername("lyc");user.setPassword("123456");user.setPhone("12345678901");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));users.forEach(System.out::println);}@Testvoid testUpdateById(){User user = new User();user.setId(5L);user.setBalance(20000);userMapper.updateById(user);}@Testvoid testDeleteById(){userMapper.deleteById(5L);}}

再次進行測試:

image-20250530192047060

測試成功。

查詢數據庫看是否插入數據

image-20250530192117561

測試成功。

總結:

使用MyBatisPlus的基本步驟:

  • 使用MyBatisPlus依賴,代替MyBatis依賴

  • 定義Mapper接口并繼承BaseMaper

MyBatisPlus確實做到了對Mybatis的無侵入:潤物無聲

常見注解

MyBatisPlus是如何獲取數據庫信息的呢?

原因:MyBatisPlus通過掃描實體類,并給予反射獲取實體類信息作為數據庫表信息。

在前面的入門案例中,在繼承BaseMapper類后需要指定泛型,就是對應的實體類的類型,而MyBatisPlus就可以基于反射拿到實體類類型,拿到實體類類型就可以基于反射拿到對應的class對象,即對應字節碼,拿到對應字節碼就可以拿到實體類信息,就基于實體類信息作為數據庫表信息。

為了拿到準確的數據表信息,MyBatisPlus有一系列的約定。

  • 類名駝峰轉下劃線作為表名

  • 名為id的字段作為主鍵

  • 變量名駝峰轉下劃線作為表的字段名

如果實體類不符合約定,就必須自己去定義表明主鍵名,以及字段名。

如何自定義呢?MyBatisPlus為我們提供了注解來幫助我們自定義設置。

常用注解:

  • @TableName:用來指定表名

  • @Tabled:用來指定表中的主鍵字段信息

  • @TableField:用來指定表中的普通字段信息

如果實體類和表的對應關系不符合MyBatisPlus的約定,就可以使用這些注解聲明。

注意事項:

我們在使用MyBatisPlus,一定要保證自己的實體類以及表中有一個名為id的字段(如果實體類中主鍵不為ID,那么也要使用注解@Tabled("id")),要使MyBatisPlus找到主鍵。

在數據庫中的主鍵可以添加約束,比如 Auto_increment(自增),而在實體類中我們可以使用@Tabled(value="id",type = "IdType.AUTO")等等,

IdType枚舉:

  • Auto:數據庫自增長(數據庫自己生成)

  • INPUT:通過set方法自行輸入(由調用者填入)

  • ASSIGN_ID:分配id,基于接口IdentiterGenertaor的方法nextld()來生成id(我們也可以重寫方法來覆蓋原來的方法),默認實現類為DefaultIdentifiterGenerator,它內部自帶一種雪花算法來幫助我們生成id,生成的是一個Long型的整數,長度為20位。(由MyBatisPlus幫助生成ID)

使用@TableField的常見場景

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

  • 成員名以is開頭,且類型為布爾值的字段,MyBatisPlus會基于反射類型的機制去獲取字段名稱,會將is減去作為變量名,變量名駝峰轉下劃線作為表的字段名便不起作用了,這時可能就與數據庫中的字段名不一致。這種就需要去使用@TableField。

  • 成員變量名與數據庫關鍵字沖突,這時我們需要使用轉義字符,例如

?@TableField("`order`")
  • 成員變量不是數據庫字段,這時就需要使用@TableField(exist = false)

更多詳情在官方文檔中查看:注解配置 | MyBatis-Plus

案例展示:

?@TableName("tb_user")public class User {?//用戶ID//主鍵自增@TableId(type = IdType.AUTO)private Long id;//用戶名@TableField("`username`")private String username;//密碼@TableField(exist = false)private String password;//注冊手機號private String phone;//詳細信息private String info;//使用狀態(1正常2凍結)private Integer status;//賬戶余額private Integer balance;//創建時間private LocalDateTime createTime;//更新時間private LocalDateTime updateTime;

image-20250530203106065

使用 @TableId(type = IdType.AUTO)就可以使id自增,但是如果不設置type,那默認策略是什么呢?

進行測試:

將測試單元中的setId()省略,以及實體類的 @TableId(type = IdType.AUTO)注解省略,再次進行測試:

測試成功,檢查數據庫

發現id值為long型,有20位,證明使用的是MybatisPlus中的雪花算法

image-20250530221920189

證明默認使用的策略就是ASSIGN_ID(雪花算法)。

常見配置

在前面我們只是導入了MyBatisPlus的起步依賴,就可以自動裝配,無需配置就可直接使用,十分方便,但是MyBatisPlus也是支持一些自定義配置的,那么MyBatisPlus支持哪些常見的配置呢?

MyBatisPlus的配置項繼承了MyBatis原生配置和自己特有的配置。例如:

?mybatis-plus:type-aliases-package: com.lyc.mp.pojo # 別名掃描包mapper-locations: "classpath*:mapper/**/*.xml" # 掃描mapper.xml文件configuration:map-underscore-to-camel-case: true # 開啟駝峰命名與下劃線命名的映射cache-enabled: false # 是否開啟二級緩存global-config: # 全局配置db-config: # 數據庫配置id-type: assign_id # 主鍵策略 雪花算法update-strategy: not_null # 更新策略 只更新非空字段

第一個: type-aliases-package:類型別名的掃描包,需要指定對應的實體類的包,就會掃描實體類

作用:將來在定義Mapper.xml文件中的語句時,如果需要定義實體類的類型,就不需要寫全路徑名,直接寫類的簡化名即可。

第二個: mapper-locations:mapper.xml文件的地址,可以掃描到指定包下的Mapper.xml文件。(MyBatisPlus更擅長單表查詢,如果業務的SQL語句過于復雜或多表查詢,就不建議使用MyBatisPlus,還是建議寫Mapper.xml文件)

第三個: map-underscore-to-camel-case: true:開啟駝峰命名與下劃線命名的映射,開啟后實體類與數據庫中的字段名就會自動轉換格式

第四個:cache-enabled: false:是否開啟二級緩存

第五個:id-type:在前面學習的注解@TableId中的type中的默認配置,在配置文件中是全局配置,優先級沒有注解高,如果注解配的是主鍵自增,那么是以注解內容為準,如果注解沒有配置,則以配置類中的配置為準。

第六個:update-strategy: 更新策略,我們在前面中學習的MyBatisPlus只更新實體類中存在的字段,實體類中沒有而數據庫中存在的字段并不更新,這就是更新策略,上述講的這種策略就是只更新非空字段。

以上的配置大多數都是有默認值的,幾乎都不需要配置,除非要自定義修改。

如果要進行自定義修改時記不清配置名,有兩種方法:

  • 查詢官網:配置 | MyBatis-Plus

  • 根據集成工具代碼提示及補全,因此只需要記憶一小部分即可,無需全部記憶

總結:

MyBatisPlus的基本使用流程:

  1. 引入起步依賴

  2. 自定義Mapper接口繼承BaseMapper接口

  3. 在實體類添加注解聲明表信息

  4. 在application.yml根據需要添加配置。

以上就是MyBatisPlus的快速入門,希望對大家有所幫助!

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

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

相關文章

redis持久化策略

RDB 是通過生成數據快照來實現持久化的&#xff0c;相當于給內存中的數據拍一張"照片"保存到磁盤上。AOF 記錄所有寫操作命令&#xff0c;以Redis協議格式追加到文件末尾。 RDB 在滿足特定條件時觸發內存快照&#xff0c;生成新的RDB文件替換舊文件 AOF 先寫入內…

Spring Boot中使用@JsonAnyGetter和@JsonAnySetter處理動態JSON屬性

Spring Boot 中使用 @JsonAnyGetter 和 @JsonAnySetter 處理動態 JSON 屬性 在實際的后端開發中,尤其是使用 Spring Boot 構建 API 時,我們經常會遇到需要處理動態 JSON 屬性的場景。例如,前端傳遞過來的 JSON 數據結構不固定,或者業務需求變更頻繁,導致實體類無法預先定…

拉取gitlab項目

一、下載nvm管理node 先下載配置好nvm,再用nvm下載node 下載鏈接&#xff1a;開始 下載nvm - nvm中文官網 情況&#xff1a;npm i 下載依賴緩慢&#xff0c;可能是node版本不對&#xff0c;可能node版本太高 可能得問題&#xff1a;使用nvm 下載低版本的node時&#xff0c;…

【解決辦法】ubuntu重啟不起來,輸入用戶名和密碼進不去,又重新返回登錄頁。

項目場景&#xff1a; ubuntu重啟不起來&#xff0c;輸入用戶名和密碼進不去&#xff0c;又重新返回登錄頁。 問題描述 在華碩天選一代筆記本上面安裝了ubuntu22.04.5桌面版&#xff0c;但是重啟以后出現&#xff0c;輸入了用戶名和密碼&#xff0c;等待一會還讓輸入用戶名和…

# 云端大模型:智能時代的新引擎

云端大模型&#xff1a;智能時代的新引擎 在人工智能技術的迅猛發展中&#xff0c;云端大模型扮演著至關重要的角色。它們不僅推動了技術的邊界&#xff0c;也為各行各業帶來了前所未有的機遇。本文將結合一系列圖片和代碼示例&#xff0c;深入探討云端大模型的功能、應用及其…

(1)pytest簡介和環境準備

1. pytest簡介 pytest是python的一種單元測試框架&#xff0c;與python自帶的unittest測試框架類似&#xff0c;但是比unittest框架使用起來更簡潔&#xff0c;效率更高。根據pytest的官方網站介紹&#xff0c;它具有如下特點&#xff1a; 非常容易上手&#xff0c;入門簡單&a…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.5 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.5 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖。 dataframe <-data.frame( wrapc(17,20,12,9,…

線程池的詳細知識(含有工廠模式)

前言 下午學習了線程池的知識。重點探究了ThreadPoolExecutor里面的各種參數的含義。我詳細了解了這部分的知識。其中有一個參數涉及工廠模式&#xff0c;我將這一部分知識分享給大家~ 線程池的詳細介紹(含工廠模式) 結語 分享到此結束啦。byebye~

嵌入式開發學習(第二階段 C語言筆記)

內存操作 我們對于內存操作需要依賴于string.h頭文件中相關的函數庫。 內存操作函數 內存填充 頭文件&#xff1a;#include <string.h> 函數原型&#xff1a; void* memset(void *s,int c,size_t n)函數功能&#xff1a;將內存塊s的前n個字節填充為c&#xff0c;一般…

C++學習-入門到精通【9】面向對象編程:繼承

C學習-入門到精通【9】面向對象編程&#xff1a;繼承 目錄 C學習-入門到精通【9】面向對象編程&#xff1a;繼承一、基類與派生類CommunityMember類的繼承層次結構如何定義一個派生類呢 二、基類和派生類間的關系1.創建并使用類CommissionEmployee2.不使用繼承創建類BasePlusCo…

黑馬k8s(十七)

一&#xff1a;高級存儲 1.高級存儲-pv和pvc介紹 2.高級存儲-pv 3.高級存儲-pvc 最后一個改成5gi pvc3是沒有來綁定成功的 pv3沒有綁定 刪除pod、和pvc&#xff0c;觀察狀態&#xff1a; 4.高級存儲-pc和pvc的生命周期 二&#xff1a;配置存儲 1.配置存儲-ConfigMap 2.配…

cf每日刷題c++

目錄 Simple Repetition&#xff08;1000&#xff09; Fashionable Array&#xff08;800&#xff09; Kevin and Arithmetic(800) Permutation Warm-Up(800) Game of Mathletes(900) LRC and VIP(800) Simple Repetition&#xff08;1000&#xff09; https://codeforc…

歷年中國科學技術大學計算機保研上機真題

2025中國科學技術大學計算機保研上機真題 2024中國科學技術大學計算機保研上機真題 2023中國科學技術大學計算機保研上機真題 在線測評鏈接&#xff1a;https://pgcode.cn/school?classification1 拆分數字 題目描述 給定一個數字&#xff0c;拆分成若干個數字之和&#xff…

PHP學習筆記(十一)

類常量 可以把在類中始終保持不變的值定義為常量&#xff0c;類常量的默認可見性是public。 接口中也可以定義常量。 可以用一個變量來動態調用類&#xff0c;但該變量的值不能為關鍵字 需要注意的是類常量只為每個類分配一次&#xff0c;而不是為每個類的實例分配。 特殊的…

Nginx 性能優化全解析:從進程到安全的深度實踐

一、進程優化&#xff1a;釋放硬件性能潛力 Nginx 通過多工作進程處理請求&#xff0c;合理配置進程參數能充分利用 CPU 資源&#xff0c;避免資源浪費。 1.1 worker_processes 參數詳解 worker_processes用于設置 Nginx 工作進程的數量&#xff0c;它直接影響 Nginx 對 CP…

中國移動咪咕助力第五屆全國人工智能大賽“AI+數智創新”專項賽道開展

第五屆全國人工智能大賽由鵬城實驗室主辦&#xff0c;新一代人工智能產業技術創新戰略聯盟承辦&#xff0c;華為、中國移動、鵬城實驗室科教基金會等單位協辦&#xff0c;廣東省人工智能與機器人學會支持。 大賽發布“AI圖像編碼”、“AI增強視頻質量評價”、“AI數智創新”三大…

《 PyTorch 2.3革新:torch.compile自動生成CUDA優化內核全解》

CUDA作為NVIDIA推出的并行計算平臺和編程模型&#xff0c;為GPU計算提供了強大的支持&#xff0c;但手動優化CUDA代碼不僅需要深厚的專業知識&#xff0c;而且過程繁瑣、耗時費力&#xff0c;torch.compile的出現&#xff0c;猶如一道曙光&#xff0c;為解決這一困境帶來了全新…

mysql-mysql源碼本地調試

前言 先進行mysql源碼本地編譯&#xff1a;mysql源碼本地編譯 1.本地調試 這里以macbook為例 1.使用vscode打開mysql源碼 2.創建basedir目錄、數據目錄、配置文件目錄、配置文件 cd /Users/test/ mkdir mysqldir //創建數據目錄和配置目錄 cd mysqldir mkdir conf data …

帶你手寫React中的useReducer函數。(底層實現)

文章目錄 前言一、為什么需要 Reducer&#xff1f;二、Reducer 的核心概念1. Reducer 函數2. useReducer 鉤子 三&#xff0c;手寫react中的useReducer 總結 前言 在 React 開發中&#xff0c;useReducer 是管理復雜狀態邏輯的利器。它類似于 Redux 的簡化版&#xff0c;允許我…

用wireshark抓了個TCP通訊的包

昨兒個整理了下怎么用wireshark抓包&#xff0c;鏈接在這里&#xff1a;捋捋wireshark 今天打算抓個TCP通訊的包試試&#xff0c;整體來說比較有收獲&#xff0c;給大家匯報一下。 首先就是如何搞到可以用來演示TCP通訊的客戶端、服務端&#xff0c;問了下deepseek&#xff0c;…