目錄
一、MyBatis-Plus簡介
1.1 介紹
1.2 優(yōu)點(diǎn)
1.3 結(jié)構(gòu)
二、MyBatis-Plus基本使用
2.1 配置
2.2 代碼生成
2.3 CRUD接口測試
三、MyBatis-Plus策略詳解
3.1 主鍵生成策略
3.2 雪花ID生成器
3.3 字段自動填充策略
3.4 邏輯刪除
四、MyBatis-Plus插件使用
4.1?樂觀鎖插件
4.1.1?什么是樂觀鎖和悲觀鎖?
4.1.2 樂觀鎖實(shí)現(xiàn)
4.2 分頁插件?
一、MyBatis-Plus簡介
1.1 介紹
MyBatis-Plus?(opens new window)(簡稱 MP)是一個(gè)?MyBatis?(opens new window)的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變(也就是說mybatis有的plus都有),為簡化開發(fā)、提高效率而生。
1.2 優(yōu)點(diǎn)
- 代碼生成器:?MyBatis-Plus 提供了一個(gè)代碼生成器,可以根據(jù)數(shù)據(jù)庫表自動生成實(shí)體類、mapper 接口和 XML 映射文件,大大提高了開發(fā)效率。
-
CRUD 操作簡化:?MyBatis-Plus 提供了一系列 CRUD 操作的方法,例如?
save()
、saveOrUpdate()
、updateById()
?和?deleteById()
,這些方法可以簡化常見的數(shù)據(jù)庫操作。 -
分頁查詢:?MyBatis-Plus 提供了分頁查詢的支持,您可以使用?
PageHelper
?插件或者內(nèi)置的分頁功能來實(shí)現(xiàn)分頁查詢。 - 性能優(yōu)化:?MyBatis-Plus 提供了二級緩存和批量操作的支持,可以提高數(shù)據(jù)庫操作的性能。
-
代碼簡潔:?MyBatis-Plus 提供了許多有用的注解,可以簡化 MyBatis 的代碼,例如?
@TableId
、@TableField
?和?@TableLogic
。 - 可擴(kuò)展性:?MyBatis-Plus 提供了許多擴(kuò)展點(diǎn),您可以通過自定義插件或攔截器來擴(kuò)展 MyBatis-Plus 的功能。
如果您正在使用 MyBatis,我強(qiáng)烈建議您使用 MyBatis-Plus ?。?!?
1.3 結(jié)構(gòu)
-
核心模塊(Core Module):核心模塊包含了Mybatis-Plus的核心功能和基本組件。它提供了通用的Mapper接口、通用的CRUD方法的實(shí)現(xiàn)、條件構(gòu)造器、分頁插件等核心功能的實(shí)現(xiàn)。核心模塊是整個(gè)框架的基礎(chǔ),其他模塊都依賴于它。
-
代碼生成器(Code Generator):代碼生成器是一個(gè)可選的輔助工具,用于根據(jù)數(shù)據(jù)庫表結(jié)構(gòu)自動生成實(shí)體類、Mapper接口、XML映射文件等基礎(chǔ)代碼。通過代碼生成器,開發(fā)者可以快速生成基礎(chǔ)代碼,減少手寫重復(fù)代碼的工作量。
-
擴(kuò)展模塊(Extension Module):擴(kuò)展模塊是Mybatis-Plus提供的一些擴(kuò)展功能和增強(qiáng)組件的集合。它包括了一些常用的增強(qiáng)功能,如邏輯刪除、字段自動填充、樂觀鎖等。開發(fā)者可以通過引入擴(kuò)展模塊,輕松地增加這些功能的支持。
-
注解(annotation):用于對實(shí)體類、Mapper接口以及SQL語句進(jìn)行配置和標(biāo)記。通過使用注解,可以簡化配置文件的編寫,提高代碼的可讀性和可維護(hù)性。 ?
簡介 | MyBatis-PlusMyBatis-Plus 官方文檔https://baomidou.com/pages/24112f/#%E7%89%B9%E6%80%A7
二、MyBatis-Plus基本使用
2.1 配置
1、導(dǎo)入pom依賴
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--自動生成模版引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--代碼生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
2、配置數(shù)據(jù)庫與mybatis-plus
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/bookshop
mybatis-plus:
# Mybatis Mapper所對應(yīng)的XML位置
mapper-locations: classpath:mapper/*.xml
# 別名包掃描路徑
type-aliases-package: com.ycxw.mybatis_test.model
# 是否開啟自動駝峰命名規(guī)則(camel case)映射
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.ycxw.mybatis_test.mapper: debug
2.2 代碼生成
1、添加代碼生成器
package com.ycxw.mybatis_test.config;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@Slf4j
public class MySQLGenerator {
private final static String URL = "jdbc:mysql://localhost:3306/bookshop";
private final static String USERNAME = "root";
private final static String PASSWORD = "123456";
private final static DataSourceConfig.Builder DATA_SOURCE_CONFIG =
new DataSourceConfig.Builder(URL, USERNAME, PASSWORD);
public static void main(String[] args) {
FastAutoGenerator.create(DATA_SOURCE_CONFIG)
.globalConfig(
(scanner, builder) ->
builder.author("云村小威")
.outputDir(System.getProperty("user.dir") + "\\src\\main\\java")
.commentDate("yyyy-MM-dd")
.dateType(DateType.TIME_PACK)
.disableOpenDir()
)
.packageConfig((builder) ->
builder.parent("com.ycxw.mybatis_test")
.entity("entity")
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.xml("mapper.xml")
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))
)
.injectionConfig((builder) ->
builder.beforeOutputFile(
(a, b) -> log.warn("tableInfo: " + a.getEntityName())
)
)
.strategyConfig((scanner, builder) ->
builder.addInclude(getTables(scanner.apply("請輸入表名,多個(gè)英文逗號分隔?所有輸入 all")))
.addTablePrefix("tb_", "t_", "lay_", "meeting_", "sys_")
.entityBuilder()
.enableChainModel()
.enableLombok()
.enableTableFieldAnnotation()
.controllerBuilder()
.enableRestStyle()
.enableHyphenStyle()
.build()
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
}
這段 Java 代碼是用于自動生成 MyBatis-Plus 代碼的。它使用 FastAutoGenerator 來生成實(shí)體類、服務(wù)類、服務(wù)實(shí)現(xiàn)類、映射器接口和映射器 XML 文件。
代碼主要做了以下事情:
- 定義數(shù)據(jù)源配置,指定數(shù)據(jù)庫 URL、用戶名和密碼。
- 創(chuàng)建 FastAutoGenerator 實(shí)例,并指定數(shù)據(jù)源配置。
- 配置全局配置,包括作者、輸出目錄、注釋日期和日期類型等。
- 配置包配置,包括父包名、實(shí)體包名、服務(wù)包名、服務(wù)實(shí)現(xiàn)包名、映射器包名和 XML 包名等。
- 配置注入配置,在輸出文件之前記錄表信息。
- 配置策略配置,包括要生成的表名、要移除的前綴、實(shí)體類配置、控制器類配置等。
- 指定模板引擎為 Freemarker。
- 執(zhí)行代碼生成。
當(dāng)運(yùn)行此代碼時(shí),它將生成 MyBatis-Plus 代碼,并將其輸出到指定目錄。
3、運(yùn)行該類輸入需要生成的數(shù)據(jù)表名
tips:
? ? ? ? 在這里可以發(fā)現(xiàn)除了entity實(shí)體包下的Book類其他的類和接口都是空了,其實(shí)它自帶了增刪改查等方法的,可以直接調(diào)用,如果需要更復(fù)雜的數(shù)據(jù)接口可以自行編寫。
最后注意添加mapper注釋交給spring管理,并在啟動器添加掃描mapper的注釋:
2.3 CRUD接口測試
package com.ycxw.mybatis_test.controller;
import com.github.yitter.idgen.YitIdHelper;
import com.ycxw.mybatis_test.entity.Book;
import com.ycxw.mybatis_test.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 書本信息表 前端控制器
* </p>
*
* @author 云村小威
* @since 2023-12-16
*/
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private IBookService bookService;
@GetMapping("/list")
public Object list() {
return bookService.list();
}
@PostMapping("/save")
public Object add(Book book) {
/*設(shè)置雪花id*/
book.setId(YitIdHelper.nextId());
return bookService.save(book);
}
@PatchMapping("/update")
public Object edit(Book book) {
return bookService.updateById(book);
}
@DeleteMapping("/{id}")
public Object del(@PathVariable Long id) {
return bookService.removeById(id);
}
}
查詢測試:?
等等。。。?
三、MyBatis-Plus策略詳解
3.1 主鍵生成策略
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_book")
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 書本編號
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
-
@TableId注解屬性
屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
---|---|---|---|---|
value | String | 否 | "" | 主鍵字段名 |
type | Enum | 否 | IdType.NONE | 指定主鍵類型 |
IdType屬性:
值 | 描述 |
---|---|
AUTO | 數(shù)據(jù)庫 ID 自增 |
NONE | 無狀態(tài),該類型為未設(shè)置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT) |
INPUT | insert 前自行 set 主鍵值 |
ASSIGN_ID | 分配 ID(主鍵類型為 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator 的方法nextId (默認(rèn)實(shí)現(xiàn)類為DefaultIdentifierGenerator 雪花算法) |
ASSIGN_UUID | 分配 UUID,主鍵類型為 String(since 3.3.0),使用接口IdentifierGenerator 的方法nextUUID (默認(rèn) default 方法) |
分布式全局唯一 ID 長整型類型(please use?ASSIGN_ID ) |
|
32 位 UUID 字符串(please use?ASSIGN_UUID ) |
|
分布式全局唯一 ID 字符串類型(please use?ASSIGN_ID ) |
3.2 雪花ID生成器
提示
自 3.3.0 開始,默認(rèn)使用雪花算法+UUID(不含中劃線)
自定義示例工程:
- spring-boot 示例 :傳送門
方法 | 主鍵生成策略 | 主鍵類型 | 說明 |
---|---|---|---|
nextId | ASSIGN_ID, |
Long,Integer,String | 支持自動轉(zhuǎn)換為 String 類型,但數(shù)值類型不支持自動轉(zhuǎn)換,需精準(zhǔn)匹配,例如返回 Long,實(shí)體主鍵就不支持定義為 Integer |
nextUUID | ASSIGN_UUID, |
String | 默認(rèn)不含中劃線的 UUID 生成 |
示例:
為什么要用ID生成器?
UUID 的主要優(yōu)點(diǎn)是:
- 它能夠生成真正隨機(jī)的標(biāo)識符,不需要依賴于數(shù)據(jù)庫或其他外部服務(wù)。
- 它可以跨不同的系統(tǒng)和平臺使用,而不需要進(jìn)行任何修改。
Snowflake ID 的主要優(yōu)點(diǎn)是:
- 它能夠生成遞增的唯一標(biāo)識符。
- 它可以分布式生成,因此可以擴(kuò)展到大型系統(tǒng)。
????????首先UUID它是隨機(jī)生成的,生成的id可能跨度較大。在性能方面,Snowflake ID 優(yōu)于 UUID。Snowflake ID 的生成速度更快,存儲空間更小,并且具備遞增性。但是,Snowflake ID 需要依賴于數(shù)據(jù)庫或其他外部服務(wù)來存儲和管理元數(shù)據(jù),并且需要進(jìn)行額外的配置和維護(hù)。
在實(shí)際應(yīng)用中,可以選擇使用 UUID 或 Snowflake ID,具體取決于具體的需求和場景。
3.3 字段自動填充策略
- @TableField 字段注解
/**
* 書本名稱
*/
@TableField(value = "bookname",fill = FieldFill.INSERT)
private String bookname;
屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
---|---|---|---|---|
value | String | 否 | "" | 數(shù)據(jù)庫字段名 |
exist | boolean | 否 | true | 是否為數(shù)據(jù)庫表字段 |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自動填充策略 |
Fill 屬性值
值 | 描述 |
---|---|
DEFAULT | 默認(rèn)不處理 |
INSERT | 插入時(shí)填充字段 |
UPDATE | 更新時(shí)填充字段 |
INSERT_UPDATE | 插入和更新時(shí)填充字段 |
在這里我們可以設(shè)置該字段是否自動填充以及什么時(shí)候填充,一般在時(shí)間字段設(shè)置自動填充方便查詢數(shù)據(jù)的插入和更新時(shí)間,當(dāng)然下面只是一個(gè)簡單的案例:
我們還需要編寫 自定義實(shí)現(xiàn)類 MyMetaObjectHandler
package com.ycxw.mybatis_test.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; @Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("插入時(shí)自動填充 ...."); this.strictInsertFill(metaObject, "bookname", String.class, "暫無"); // 起始版本 3.3.0(推薦使用) } @Override public void updateFill(MetaObject metaObject) { log.info("修改時(shí)自動填充 ...."); this.strictUpdateFill(metaObject, "updateTime", String.class, "未填寫修改名稱"); // 起始版本 3.3.0(推薦) } }
定義了自動填充,我們在新增或修改時(shí)就可以不為該字段賦值。
3.4 邏輯刪除
為什么要使用邏輯刪除?
- 保留歷史記錄:通過邏輯刪除,可以保留項(xiàng)目的完整歷史記錄,而無需物理刪除數(shù)據(jù)。這對于調(diào)試、審計(jì)和數(shù)據(jù)分析非常有用。
- 恢復(fù)數(shù)據(jù):如果項(xiàng)目數(shù)據(jù)被意外刪除,通過邏輯刪除可以輕松恢復(fù)。而物理刪除的數(shù)據(jù)則無法恢復(fù)。
- 性能優(yōu)化:邏輯刪除可以提高項(xiàng)目的性能,因?yàn)椴恍枰锢韯h除數(shù)據(jù)。這對于大型項(xiàng)目或具有大量數(shù)據(jù)的項(xiàng)目尤為重要。
- 安全性:邏輯刪除可以提高項(xiàng)目的安全性,因?yàn)椴恍枰锢韯h除數(shù)據(jù),可以防止不必要的數(shù)據(jù)泄露。
- 合規(guī)性:一些行業(yè)或法規(guī)可能要求保留數(shù)據(jù)一段特定時(shí)間。邏輯刪除可以幫助項(xiàng)目遵守這些規(guī)定,而無需永久存儲數(shù)據(jù)。
????????通過mybatis-plus擴(kuò)展的邏輯刪除功能,再調(diào)用刪除接口時(shí)將刪除自動轉(zhuǎn)為修改。將數(shù)據(jù)狀態(tài)修改為不可查詢到(前提是該表含有特定的狀態(tài)列)
使用方法:
1、全局配置
2、局部配置
這里不可以配置
@TableLogic
注解,但必須指定@TableField
并設(shè)置對應(yīng)數(shù)據(jù)庫中的字段名。
?
3、測試
例如刪除第一條數(shù)據(jù):
再次查看該數(shù)據(jù)表:
調(diào)用查詢測試:
可以發(fā)現(xiàn)剛才刪除的數(shù)據(jù)將不能查到,而數(shù)據(jù)庫仍存在。
四、MyBatis-Plus插件使用
4.1?樂觀鎖插件
4.1.1?什么是樂觀鎖和悲觀鎖?
????????樂觀鎖和悲觀鎖是兩種不同的并發(fā)控制機(jī)制,用于防止多用戶同時(shí)修改同一份數(shù)據(jù)時(shí)產(chǎn)生數(shù)據(jù)不一致的問題。
- 樂觀鎖假設(shè)在并發(fā)操作時(shí),數(shù)據(jù)不會被其他用戶修改,因此在執(zhí)行更新操作前不需要對數(shù)據(jù)加鎖。在提交更新時(shí),會檢查數(shù)據(jù)是否已經(jīng)被修改。如果數(shù)據(jù)已經(jīng)被修改,則會拋出異常,要求用戶重新獲取數(shù)據(jù)并重新提交更新。
- 悲觀鎖假設(shè)在并發(fā)操作時(shí),數(shù)據(jù)可能會被其他用戶修改,因此在執(zhí)行更新操作前需要先對數(shù)據(jù)加鎖。在更新操作執(zhí)行完成后,鎖才會被釋放。這樣可以確保在數(shù)據(jù)更新時(shí),不會被其他用戶修改。
樂觀鎖的優(yōu)點(diǎn):
- 性能好,因?yàn)樵诖蠖鄶?shù)情況下不需要加鎖。
- 可伸縮性好,因?yàn)椴恍枰S護(hù)鎖狀態(tài)。
- 不會出現(xiàn)死鎖。
樂觀鎖的缺點(diǎn):
- 可能出現(xiàn)數(shù)據(jù)不一致的問題,因?yàn)樵谔峤桓聲r(shí),數(shù)據(jù)可能已經(jīng)被其他用戶修改。
- 需要應(yīng)用程序代碼來處理并發(fā)沖突。
悲觀鎖的優(yōu)點(diǎn):
- 可以保證數(shù)據(jù)一致性,因?yàn)樵诟聰?shù)據(jù)時(shí),其他用戶不能修改數(shù)據(jù)。
- 不需要應(yīng)用程序代碼來處理并發(fā)沖突。
悲觀鎖的缺點(diǎn):
- 性能差,因?yàn)樵诟聰?shù)據(jù)時(shí)需要加鎖。
- 可伸縮性差,因?yàn)樾枰S護(hù)鎖狀態(tài)。
- 可能出現(xiàn)死鎖。
4.1.2 樂觀鎖實(shí)現(xiàn)
當(dāng)要更新一條記錄的時(shí)候,希望這條記錄沒有被別人更新。
樂觀鎖實(shí)現(xiàn)方式:
- 取出記錄時(shí),獲取當(dāng)前 version
- 更新時(shí),帶上這個(gè) version
- 執(zhí)行更新時(shí), set version = newVersion where version = oldVersion
- 如果 version 不對,就更新失敗
?
所以先給需要加鎖的表添加version列,同時(shí)在實(shí)體類中加上@Version注解
@Version private Integer version;
1、配置插件
package com.ycxw.mybatis_test.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Spring Boot 方式
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
2、編寫修改接口測試
@PutMapping("/edit")
public Object update(){
Book b1 = bookService.getById("16");
b1.setPrice(133F);
bookService.updateById(b1);
return "1";
}
調(diào)用查詢接口可以看到:首先查詢該數(shù)據(jù),在修改version值并判斷該數(shù)據(jù)的version值是否等于當(dāng)前的version值。?
????????可以看到version值已變成2了,沒修改一次就會加1。這就意味著當(dāng)我修改改數(shù)據(jù)時(shí)version變?yōu)榱?,而其他人同時(shí)修改該數(shù)據(jù)時(shí)首先查詢到的是1,而我已經(jīng)修改為2,他人再修改時(shí)條件已不再成立將無法修改。
以下案例進(jìn)行驗(yàn)證:
@PutMapping("/edit")
public Object update(){
/*模仿兩人同時(shí)修改不同數(shù)據(jù)時(shí)*/
Book b1 = bookService.getById("16");
b1.setPrice(133F);
Book b2 = bookService.getById("16");
b2.setPrice(210F);
bookService.updateById(b1);
bookService.updateById(b2);
return "1";
}
????????可以看到只有第一條修改成功了,且version變?yōu)?(首先查詢的值為2,修改后自動變?yōu)?)。如果他人同時(shí)于此修改時(shí),而version判斷不成立則無法修改。?
4.2 分頁插件?
1、首先添加分頁插件配置,與樂觀鎖配置位置一樣,該類可以同時(shí)配置多個(gè)插件。
package com.ycxw.mybatis_test.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// Spring Boot 方式
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
/*配置樂觀鎖*/
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
/*配置分頁*/
//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多數(shù)據(jù)源可以不配具體類型 否則都建議配上具體的DbType
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多個(gè)插件,切記分頁最后添加
return mybatisPlusInterceptor;
}
}
?2、編寫查詢接口測試
@GetMapping("/list")
public Object list() {
//簡單的分頁查詢
Page<Book> page = new Page<>(1,5);
Page<Book> res = bookService.page(page, wrapper);
res.getTotal();//數(shù)據(jù)總數(shù)
res.getPages();//數(shù)據(jù)總頁數(shù)
return res.getRecords();
}
?
以上只是一個(gè)簡單的查詢案例,mp通過page類實(shí)現(xiàn)了
簡單分頁模型。需要進(jìn)行條件查詢則要了解
查詢構(gòu)造器:????????QueryWrapper是Mybatis-Plus提供的一個(gè)條件構(gòu)造器,用于快速構(gòu)建SQL查詢語句的條件部分。
????????QueryWrapper的語法類似于Mybatis的XML文件中的where標(biāo)簽,其最終會被轉(zhuǎn)換為SQL語句的條件部分。我們可以通過鏈?zhǔn)秸{(diào)用的方式,不斷添加查詢條件,從而構(gòu)建出復(fù)雜的查詢條件。
代碼示例:文章來源:http://www.zghlxwxcb.cn/news/detail-765372.html
@GetMapping("/list")
public Object list(@RequestParam(value = "bookname", required = false, defaultValue = "") String bookname) {
//查詢條件
QueryWrapper<Book> wrapper = new QueryWrapper<>();
/**
* 設(shè)置查詢條件 bookname like %name%
* 如:
* warpper.eq("price",100,300) == price 在 100 ~ 300 之間
* ...
*/
wrapper.like("bookname",bookname);
//分頁條件條件
Page<Book> page = new Page<>(1,5);
Page<Book> res = bookService.page(page, wrapper);
res.getTotal();//數(shù)據(jù)總數(shù)
res.getPages();//數(shù)據(jù)總頁數(shù)
return res.getRecords();
}
?可以看到通過like方法指定注入需要查詢的列名,自定拼接到sql中文章來源地址http://www.zghlxwxcb.cn/news/detail-765372.html
到了這里,關(guān)于【MyBatis-Plus】MyBatis進(jìn)階使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!