前言
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);}