MyBatisPlus介紹
從名字中就可以感覺到MybatisPlus與MyBatis之間的淵源,而MyBatis是一個非常流行的持久層框架,主要來做數據庫的增刪改查,而MyBatisPlus這種命名方式讓人不得不往MyBatis的升級版去聯想,事實也確實如此,MyBatisPlus就是對MyBatis框架的增強與升級,但MyBatisPlus并不是來替代MyBatis的,MyBatisPlus的官網logo是一只藍色的小鳥,MyBatis官網的logo是一只紅色的小鳥,并且在MyBatisPlus官網下的標語就是 MyBatis 最佳搭檔,只做增強不做改變,為簡化開發、提高效率而生。因此兩者是一種合作的關系。
而且兩者搭配使用,可以翻倍提高開發效率。因此MybatisPlus也成為了企業開發的必備工具。
那么MyBatisPlus是如何對MyBatis進行增強的呢?
我們可以從MyBatisPlus的官網文檔入手
在實際開發中,書寫的大多數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中的文件依然可以使用。
進行測試:
而使用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);}}
再次進行測試:
測試成功。
查詢數據庫看是否插入數據
測試成功。
總結:
使用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;
使用 @TableId(type = IdType.AUTO)就可以使id自增,但是如果不設置type,那默認策略是什么呢?
進行測試:
將測試單元中的setId()省略,以及實體類的 @TableId(type = IdType.AUTO)注解省略,再次進行測試:
測試成功,檢查數據庫
發現id值為long型,有20位,證明使用的是MybatisPlus中的雪花算法
證明默認使用的策略就是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的基本使用流程:
-
引入起步依賴
-
自定義Mapper接口繼承BaseMapper接口
-
在實體類添加注解聲明表信息
-
在application.yml根據需要添加配置。
以上就是MyBatisPlus的快速入門,希望對大家有所幫助!