MyBatis-Plus高效開發(fā)實(shí)戰(zhàn)指南
一. MyBatis-Plus 介紹
MyBatis-Plus(簡(jiǎn)稱 MP)是?個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā).提高效率而生 。
特性:
• 潤(rùn)物無(wú)聲:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有?程產(chǎn)生影響,如絲般順滑.
• 效率至上:只需簡(jiǎn)單配置,即可快速進(jìn)行單表CRUD操作,從而節(jié)省大量時(shí)間.
• 豐富功能:代碼生成、自動(dòng)分頁(yè)、邏輯刪除、自動(dòng)填充、攔截器等功能?應(yīng)俱全.
• 廣泛認(rèn)可:連續(xù)5年獲得開源中國(guó)年度最佳開源項(xiàng)目殊榮,Github累計(jì)16KStar.

支持?jǐn)?shù)據(jù)庫(kù): PostgreSQL , MySQL , MariaDB , Oracle , SQLServer , OceanBase , H2 , DB2...(任何能使用MyBatis進(jìn)行增刪改查,并且支持標(biāo)準(zhǔn)SQL的數(shù)據(jù)庫(kù)應(yīng)該都在MyBatis-Plus的支持范圍內(nèi))
更多介紹,可查看 MyBatis-Plus 官網(wǎng):https://baomidou.com/
二. MyBatis-Plus 使用
2.1 準(zhǔn)備工作
數(shù)據(jù)庫(kù)數(shù)據(jù)準(zhǔn)備:
-- 創(chuàng)建數(shù)據(jù)庫(kù) DROP DATABASE IF EXISTS mybatis_test; CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4; -- 使?數(shù)據(jù)數(shù)據(jù) USE mybatis_test; -- 創(chuàng)建表[??表] DROP TABLE IF EXISTS user_info; CREATE TABLE `user_info` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `user_name` VARCHAR ( 127 ) NOT NULL, `password` VARCHAR ( 127 ) NOT NULL, `age` TINYINT ( 4 ) NOT NULL, `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-? 0-默認(rèn)', `phone` VARCHAR ( 15 ) DEFAULT NULL, `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-刪除', `create_time` DATETIME DEFAULT now(), `update_time` DATETIME DEFAULT now(), PRIMARY KEY ( `id` ) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; -- 添加??信息 INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) VALUES ( 'admin', 'admin', 18, 1, '18612340001' ); INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' ); INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' ); INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone ) VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
添加MyBatis-Plus依賴與MySQL數(shù)據(jù)庫(kù)依賴:
引入 MyBatis-Plus Starter 依賴:
Spring Boot2
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.15</version>
</dependency>Spring Boot3
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.15</version>
</dependency>Spring Boot4 (自3.5.13開始)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot4-starter</artifactId>
<version>3.5.15</version>
</dependency>注意:不同的Spring版本引入不同的MyBatis-Plus依賴得版本不同(根據(jù)Spring版本添加相應(yīng)版本得依賴)
引入MySQL數(shù)據(jù)庫(kù)依賴:
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency>
配置數(shù)據(jù)庫(kù)
application.yml文件,配置內(nèi)容如下:
# 數(shù)據(jù)庫(kù)連接配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 控制臺(tái)打印 SQL日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 2.2 編碼
為數(shù)據(jù)庫(kù)中表創(chuàng)建實(shí)體類:
@Data
public class UserInfo {
private Integer id;
private String userName;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
編寫Mapper接口類:
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
我們需要我們創(chuàng)建的這個(gè) Mapper接口類 去繼承 BaseMapper 這個(gè)接口
BaseMapper 這個(gè)接口是個(gè)泛型接口,填的是我們方法返回內(nèi)容的對(duì)象的類型
BaseMapper中定義的方法:

MybatisPlus提供了?個(gè)基礎(chǔ)的 BaseMapper 接口,已經(jīng)實(shí)現(xiàn)了單表的CRUD, 我們自定義的 Mapper只需要繼承這個(gè)BaseMapper, 就無(wú)需自己實(shí)現(xiàn)單表CRUD了
2.3 單元測(cè)試
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
UserInfoMapper userInfoMapper;
@Test
void testInsert() {
UserInfo user = new UserInfo();
user.setUserName("xiaoming");
user.setPassword("123456");
user.setAge(11);
user.setGender(0);
user.setPhone("18610001234");
userInfoMapper.insert(user);
}
@Test
void testSelectById() {
UserInfo user = userInfoMapper.selectById(1L);
System.out.println("user: " + user);
}
@Test
void testSelectByIds() {
List<UserInfo> users = userInfoMapper.selectByIds(List.of(1, 2, 3, 4));
users.forEach(System.out::println);
}
@Test
void testUpdateById() {
UserInfo user = new UserInfo();
user.setId(1);
user.setPassword("4444444");
userInfoMapper.updateById(user);
}
@Test
void testDelete() {
userInfoMapper.deleteById(5);
}
}執(zhí)行后的測(cè)試用例后的數(shù)據(jù)庫(kù):

三. MyBatis-Plus復(fù)雜操作
3.1 常見注解
3.1.1 @TableName
我們來(lái)看下面這個(gè)日志

發(fā)現(xiàn):在我們并沒(méi)有告訴要操作表的信息時(shí),MyBatis-Plus就已經(jīng)知道了我們要操作的是哪一張表,這是為什么----原因:MyBatis-Plus會(huì)通過(guò) 我們?cè)?BaseMapper<>中傳入的實(shí)體類來(lái)推斷對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表名(推斷列子與規(guī)律如下表所示)
| 實(shí)體類名 | 表名 | 轉(zhuǎn)換邏輯 |
|---|---|---|
UserInfo | user_info | 駝峰拆分:User + Info → 轉(zhuǎn)小寫 + 下劃線連接 → user_info |
Userinfo | userinfo | 無(wú)駝峰分隔 → 直接全小寫 → userinfo |
BookInfo | book_info | 駝峰拆分: |
如果我們?cè)O(shè)定的實(shí)體類經(jīng)上述規(guī)律推斷出來(lái)的表名與數(shù)據(jù)庫(kù)中的表名對(duì)應(yīng)不上時(shí),就會(huì)報(bào)錯(cuò),這時(shí)我們就要使用 @TableName 注解來(lái)解決問(wèn)題
代碼如下:(@TableName中填寫的是實(shí)體類對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的表名)
@Data
@TableName("user_info")//指定對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的表名
public class UserInfo {
@TableId(value="id",type=IdType.AUTO)
private Integer userid;
private String userName;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
3.1.2 @TableField
在我們不添加 @TableField注解前,MyBatis-Plus對(duì)于字段與屬性的映射關(guān)系,也和表名一樣,是通過(guò)自動(dòng)判斷轉(zhuǎn)發(fā)來(lái)的,當(dāng)轉(zhuǎn)化的名稱與數(shù)據(jù)庫(kù)中屬性名對(duì)應(yīng)不上式,我們就需要添@TableField注解,來(lái)對(duì)應(yīng)映射關(guān)系。如下面代碼所示:
@Data
@TableName("user_info")//指定對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的表名
public class UserInfo {
@TableId(value="id",type=IdType.AUTO)
private Integer userid;
private String userName;
private String password;
private Integer age;
private Integer gender;
private String phone;
@TableField("delete_flag")//只舉這一個(gè)例子
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}3.1.3 @TableId
注意:
- 在沒(méi)有添加 @TableId注解之前,MyBatis-Plus默認(rèn) id 為主鍵
- 一個(gè)實(shí)體表類中只能有一個(gè)主鍵
在執(zhí)行 testInsert() (該方法沒(méi)有傳入主鍵id的值)后,我們發(fā)現(xiàn)我們?cè)黾拥倪@條數(shù)據(jù)的主鍵并沒(méi)有自增,而是一個(gè)隨機(jī)生成的數(shù)字 ----- 原因:由于 MyBatis-Plus 默認(rèn) id為主鍵,且針對(duì)主鍵的默認(rèn)賦值策略是 IdType.ASSIGN_ID(雪花算法)—— 該策略會(huì)由 MP 自動(dòng)生成 19 位分布式唯一的隨機(jī)長(zhǎng)數(shù)字,而非依賴數(shù)據(jù)庫(kù)自增,因此最終插入的主鍵是隨機(jī)數(shù),而非數(shù)據(jù)庫(kù)自增的連續(xù)值。
如何解決:添加@TableId注解并且修改主鍵指定自增類型的主鍵策略
@TableId注解 源碼:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableId {
String value() default "";
IdType type() default IdType.NONE;
}
value:主鍵的名稱,如果實(shí)體類中主鍵的名稱與數(shù)據(jù)庫(kù)中主鍵的名稱不一致是,需通過(guò)value(其中填寫對(duì)應(yīng)數(shù)據(jù)庫(kù)中主鍵的名稱);一致時(shí)可不填寫
type:指定自增類型的主鍵策略(默認(rèn)為IdType.NONE)
| IdType 取值 | 含義 | 適用場(chǎng)景 |
|---|---|---|
AUTO | 數(shù)據(jù)庫(kù)自增生成主鍵 | 單體項(xiàng)目、表主鍵是自增字段(MySQL 的 AUTO_INCREMENT) |
ASSIGN_ID | MP 用雪花算法生成 19 位長(zhǎng)數(shù)字 | 分布式項(xiàng)目、需要全局唯一 ID |
INPUT | 手動(dòng)輸入主鍵值(MP 不生成) | 主鍵是業(yè)務(wù)編號(hào)(如訂單號(hào))、需手動(dòng)賦值的場(chǎng)景 |
NONE | 無(wú)指定(默認(rèn)兜底為 ASSIGN_ID) | 不推薦直接用,需顯式指定 AUTO/ASSIGN_ID |
將 主鍵 id 修改為自增:代碼如下
@Data
public class UserInfo {
@TableId(value="id",type=IdType.AUTO)
private Integer userid;
private String userName;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
注意:由于我們?cè)谇懊嫔闪艘粋€(gè)主鍵為隨機(jī)數(shù)的數(shù)據(jù),因此我們需要修改該表自動(dòng)遞增的起始數(shù)

再執(zhí)行一下測(cè)試用例:
@Test
void testInsert() {
UserInfo user = new UserInfo();
user.setUserName("huahua");
user.setPassword("666666");
user.setAge(11);
user.setGender(0);
user.setPhone("18610001234");
userInfoMapper.insert(user);
}執(zhí)行后數(shù)據(jù)庫(kù)----id開始自增

3.2 條件構(gòu)造器
入門程序里的使用, 都是簡(jiǎn)單的CRUD, 但是在實(shí)際的應(yīng)用場(chǎng)景中,我們還需要使用更復(fù)雜的操作, MyBatisPlus 也給我們提供了相應(yīng)的支持.
MyBatis-Plus 提供了?套強(qiáng)大的條件構(gòu)造器(Wrapper),用于構(gòu)建復(fù)雜的數(shù)據(jù)庫(kù)查詢條件.Wrapper類 允許開發(fā)者以鏈?zhǔn)秸{(diào)用的方式構(gòu)造查詢條件,無(wú)需編寫繁瑣的 SQL 語(yǔ)句, 從而提高開發(fā)效率并減少 SQL 注入的風(fēng)險(xiǎn).
以下是主要的 Wrapper 類及其功能:
| 類名 | 核心定位 | 核心特性 / 拓展功能 |
|---|---|---|
| AbstractWrapper | 抽象基類(所有 Wrapper 父類) | 提供所有 Wrapper 類共有的方法和屬性(如條件拼接、排序、分頁(yè)等基礎(chǔ)能力) |
| QueryWrapper | 通用查詢條件構(gòu)造器 | 繼承 AbstractWrapper,額外拓展 select() 方法,支持手動(dòng)指定查詢字段(如只查 id、username) |
| UpdateWrapper | 通用更新條件構(gòu)造器 | 繼承 AbstractWrapper,專注于 UPDATE 操作,支持拼接更新條件 + 手動(dòng)指定 SET 字段值 |
| LambdaQueryWrapper | Lambda 版查詢構(gòu)造器 | 基于 QueryWrapper,通過(guò) Lambda 表達(dá)式引用實(shí)體類屬性(如 User::getAge),替代硬編碼字段名 |
| LambdaUpdateWrapper | Lambda 版更新構(gòu)造器 | 基于 UpdateWrapper,通過(guò) Lambda 表達(dá)式指定更新字段和條件,替代硬編碼字段名 |
具體可查看官網(wǎng):https://baomidou.com/guides/wrapper/
接下來(lái)我們來(lái)看具體如何實(shí)現(xiàn):
3.2.1 QueryWrapper
QueryWrapper并不只用于查詢語(yǔ)句,無(wú)論是修改, 刪除, 查詢,都可以使用 QueryWrapper來(lái)構(gòu)建查詢條件.
QueryWrapper 最核心的兩大能力:指定查詢字段(select) + 構(gòu)建查詢條件(where)
完成以下SQL查詢:(查詢)
SELECT id,username,password,age FROM user_info WHERE age = 18 AND username "%min%"
測(cè)試代碼如下:
@Test
void testQueryWrapper(){
QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>()
.select("user_name","password","age")
.eq("age",18)
.like("user_name","min");//鏈?zhǔn)秸{(diào)用
List<UserInfo> userInfoList=userInfoMapper.selectList(queryWrapper);
}
完成下述SQL查詢:(更新)
UPDATE user_info SET delete_flag=? WHERE age < 20
測(cè)試代碼如下:
@Test
void testUpdateByQueryWrapper(){
QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>()
.lt("age",18); //構(gòu)造條件 where age<18
UserInfo userInfo=new UserInfo();
userInfo.setDeleteFlag(1);
userInfoMapper.update(userInfo,queryWrapper);
}
MyBatis-Plus 條件構(gòu)造器核心比較方法速查表:(注意:所有基于 AbstractWrapper 派生的條件構(gòu)造器都可以使用)
| 方法名 | 中文含義 | 對(duì)應(yīng) SQL 運(yùn)算符 |
|---|---|---|
lt | 小于 | < |
le | 小于等于 | <= |
ge | 大于等于 | >= |
gt | 大于 | > |
eq | 等于 | = |
ne | 不等于 | <>/!= |
完成下述SQL查詢:(刪除)
DELETE FROM user_info WHERE age = 18
測(cè)試代碼:
@Test
void testDeleteByQueryWrapper(){
QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>()
.eq("age",18);
userInfoMapper.delete(queryWrapper);
}3.3.2 UpdateWrapper
對(duì)于更新, 我們也可以直接使用 UpdateWrapper, 在不創(chuàng)建實(shí)體對(duì)象的情況下, 直接設(shè)置更新字段和條件.
UpdateWrapper 最核心的兩大能力:構(gòu)建字段賦值(set)+ 構(gòu)建更新條件條件(where)
完成下述SQL查詢:(基礎(chǔ)更新):
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
測(cè)試代碼:
@Test
void testUpdateByUpdateWrapper(){
UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>()
.set("delete_flag",0)
.set("age", 5)
.in("id",List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}完成下述SQL查詢:(基于SQL更新)
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
測(cè)試代碼:
@Test
void testUpdateBySQLUpdateWrapper(){
UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>()
.setSql("age=age+10")
.in("id",List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}| 對(duì)比項(xiàng) | set() 方法 | setSql() 方法 |
|---|---|---|
| 賦值方式 | 靜態(tài)值賦值(字段 = 固定值) | 自定義 SQL 片段賦值 |
| 適用場(chǎng)景 | 簡(jiǎn)單賦值(如 status = 1) | 復(fù)雜賦值(如字段自增、函數(shù)計(jì)算) |
| 語(yǔ)法 | set("字段名", 固定值) | setSql("SQL片段") |
3.3.3 LambdaQueryWrapper
QueryWrapper 和 UpdateWrapper存在?個(gè)問(wèn)題,就是需要寫死數(shù)據(jù)庫(kù)列名字段名 , 如果字段名發(fā)生變更,可能會(huì)因?yàn)闇y(cè)試不到位釀成事故. MyBatis-Plus給我們提供了?種基于Lambda表達(dá)式的條件構(gòu)造器,它通過(guò)Lambda表達(dá)式來(lái)引用實(shí)體類的屬性,從而避免了硬編碼字段名,也提高了代碼的可讀性和可維護(hù)性.
接下來(lái)我們看下具體使用:
寫法一:
@Test
void testLambdaQueryWrapper(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
queryWrapper.lambda()
.select(UserInfo::getUserName, UserInfo::getPassword,UserInfo::getAge)
.eq(UserInfo::getUserid, 1);
userInfoMapper.selectList(queryWrapper);
}寫法二:
@Test
void testLambdaQueryWrapper(){
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper=new LambdaQueryWrapper<UserInfo>()
.select(UserInfo::getUserName, UserInfo::getPassword,UserInfo::getAge)
.eq(UserInfo::getUserid, 1);
userInfoMapper.selectList(lambdaQueryWrapper);
}3.3.4 LambdaUpdateWrapper
LambdaUpdateWrapper 用法和 LambdaQueryWrapper 相似
@Test
void testLambdUpdateByUpdateWrapper(){
//同樣有兩種寫法,這里只寫一種
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>();
updateWrapper.lambda()
.set(UserInfo::getDeleteFlag, 0)
.set(UserInfo::getAge, 5)
.in(UserInfo::getUserId, List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
3.3 自定義SQL
在實(shí)際的開發(fā)中, MyBatis-Plus提供的操作不能滿足我們的實(shí)際需求, MyBatis-Plus 也提供了自定義 SQL的功能, 我們可以利用Wrapper構(gòu)造查詢條件,再結(jié)合Mapper編寫SQL
注意事項(xiàng):
• 參數(shù)命名:在自定義SQL時(shí),傳遞Wrapper對(duì)象作為參數(shù)時(shí),參數(shù)名必須為ew ,或者使用注解 @Param(Constants.WRAPPER) 明確指定參數(shù)為 Wrapper 對(duì)象.
• 使用${ew.customSqlSegment} :在SQL語(yǔ)句中,使用 ${ew.customSqlSegment} 來(lái) 引用Wrapper對(duì)象生成的SQL片段.
• 不支持基于entity的where語(yǔ)句:自定義SQL時(shí),Wrapper對(duì)象不會(huì)基于實(shí)體類自動(dòng)生成 where子句,你需要手動(dòng)編寫完整的SQL語(yǔ)句.(即必須使用占位符)
代碼示例1:
select id,username,password,age FROM user_info WHERE username = "admin"
Mapper接口:
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Select("select id,username,password,age FROM user_info ${ew.customSqlSegment}")
List<UserInfo> queryUserByCustom( @Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);//括號(hào)里等同于 Wrapper<UserInfo> ew
}測(cè)試代碼:
@Test
void queryUserByCustom() {
QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>()
.eq("username","admin");
List<UserInfo> userInfo=userInfoMapper.queryUserByCustom(queryWrapper);
System.out.println(userInfo);
}代碼示例二:
MyBatis-Plus 在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,所以也支持XML的實(shí)現(xiàn)方式上述功能也可以使用XML的方式完成
1. 配置mapper路徑
mybatis-plus: mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml
2. 定義?法
@Mapper
public interface UserInfoMapper extends BaseMapper {
List queryUserByCustom2(@Param(Constants.WRAPPER) Wrapper wrapper);
}3. 編寫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.bite.mybatis.plus.mapper.UserInfoMapper">
<select id="queryUserByCustom2">
select id,username,password,age FROM user_info ${ew.customSqlSegment}
</select>
</mapper>4. 測(cè)試:
@Test
void testQueryUserByCustom2(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
.eq("username","admin");
userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);
}
代碼示例3:
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
Mapper接口:
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Update("UPDATE user_info SET age = age+ #{addAge} ${ew.customSqlSegment}")
void updateUserByCustom(@Param("addAge") Integer add ,@Param("ew") Wrapper<UserInfo> wrapper);
}測(cè)試代碼:
@Test
void updateUserByCustom() {
QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>()
.in("id",List.of(1,2,3));
userInfoMapper.updateUserByCustom(10,queryWrapper);
}到此這篇關(guān)于MyBatis-Plus高效開發(fā)實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)MyBatis-Plus高效開發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用kotlin編寫spring cloud微服務(wù)的過(guò)程
這篇文章主要介紹了使用kotlin編寫spring cloud微服務(wù)的相關(guān)知識(shí),本文給大家提到配置文件的操作代碼,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
詳解使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像
本篇文章主要介紹了使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像,實(shí)例分析了使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04
如何在Java SpringBoot項(xiàng)目中配置動(dòng)態(tài)數(shù)據(jù)源你知道嗎
這篇文章主要介紹了SpringBoot如何在運(yùn)行時(shí)動(dòng)態(tài)添加數(shù)據(jù)源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
Springboot中登錄后關(guān)于cookie和session攔截問(wèn)題的案例分析
這篇文章主要介紹了Springboot中登錄后關(guān)于cookie和session攔截案例,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
springboot代碼,注解配置獲取yml,properties文件的map即鍵值對(duì)
這篇文章主要介紹了springboot代碼,注解配置獲取yml,properties文件的map即鍵值對(duì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot整合阿里?Druid?數(shù)據(jù)源的實(shí)例詳解
這篇文章主要介紹了SpringBoot整合阿里?Druid?數(shù)據(jù)源,主要講解了手動(dòng)配置方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
Spring3?中?RabbitMQ?的使用與常見場(chǎng)景分析
本文介紹了Spring3中RabbitMQ的使用,涵蓋了RabbitMQ的基本知識(shí)、五種模式、數(shù)據(jù)隔離、消費(fèi)者確認(rèn)、死信交換機(jī)、延遲功能、消息堆積解決方法、高可用性以及消息重復(fù)消費(fèi)問(wèn)題的解決方案,感興趣的朋友跟隨小編一起看看吧2025-02-02
java poi設(shè)置生成的word的圖片為上下型環(huán)繞以及其位置的實(shí)現(xiàn)
這篇文章主要介紹了java poi設(shè)置生成的word的圖片為上下型環(huán)繞以及其位置的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

