Mybatis-Plus的條件構(gòu)造器QueryWrapper & UpdateWrapper示例詳解
1. 引言
在數(shù)據(jù)庫(kù)操作中,條件查詢和條件更新是非常常見(jiàn)的需求。為了簡(jiǎn)化代碼,Mybatis-Plus提供了強(qiáng)大的條件構(gòu)造器——QueryWrapper和UpdateWrapper。本文將深入探討這兩個(gè)條件構(gòu)造器的使用方法,并通過(guò)示例代碼幫助讀者更好地理解和應(yīng)用。
2. Mybatis-Plus簡(jiǎn)介
Mybatis-Plus 是基于Mybatis的一個(gè)增強(qiáng)工具庫(kù),旨在簡(jiǎn)化開發(fā),提高效率。它提供了豐富的功能,包括代碼生成器、性能優(yōu)化、條件構(gòu)造器等。其中,條件構(gòu)造器是Mybatis-Plus中的一個(gè)核心功能,用于構(gòu)建靈活的查詢和更新條件。

3. QueryWrapper
3.1 基本用法
QueryWrapper用于構(gòu)建查詢條件,可以通過(guò)鏈?zhǔn)秸{(diào)用的方式組裝各種查詢條件。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public class QueryWrapperExample {
public static void main(String[] args) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 等值條件
queryWrapper.eq("name", "John");
// 不等值條件
queryWrapper.ne("age", 25);
// 大于條件
queryWrapper.gt("create_time", "2022-01-01");
// 小于等于條件
queryWrapper.le("update_time", "2023-01-01");
// 模糊查詢
queryWrapper.like("email", "@gmail.com");
// 排序
queryWrapper.orderByAsc("age");
// 使用Lambda表達(dá)式
queryWrapper.lambda().eq(User::getName, "Alice");
// 打印SQL語(yǔ)句
System.out.println("SQL: " + queryWrapper.getSqlSelect());
}
}上述代碼演示了QueryWrapper的基本用法,通過(guò)不同的方法添加等值、不等值、范圍、模糊等查詢條件,同時(shí)支持Lambda表達(dá)式。
3.2 動(dòng)態(tài)條件拼接
在實(shí)際應(yīng)用中,我們經(jīng)常需要根據(jù)不同條件的存在與否來(lái)動(dòng)態(tài)構(gòu)建查詢條件。QueryWrapper提供了一系列的條件拼接方法,例如and、or、nested等。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public class DynamicQueryWrapperExample {
public static void main(String[] args) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 動(dòng)態(tài)條件拼接
queryWrapper.and(wrapper -> wrapper.eq("name", "John").ne("age", 25))
.or(wrapper -> wrapper.gt("create_time", "2022-01-01").le("update_time", "2023-01-01"));
// 打印SQL語(yǔ)句
System.out.println("SQL: " + queryWrapper.getSqlSelect());
}
}在上述代碼中,通過(guò)and和or方法,我們可以根據(jù)需要?jiǎng)討B(tài)拼接查詢條件,使得代碼更加靈活。
3.3 Lambda表達(dá)式的高級(jí)用法
QueryWrapper支持Lambda表達(dá)式,可以進(jìn)一步簡(jiǎn)化代碼,提高可讀性。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public class LambdaQueryWrapperExample {
public static void main(String[] args) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// Lambda表達(dá)式
queryWrapper.lambda().eq(User::getName, "John")
.ne(User::getAge, 25)
.like(User::getEmail, "@gmail.com");
// 打印SQL語(yǔ)句
System.out.println("SQL: " + queryWrapper.getSqlSelect());
}
}通過(guò)lambda方法,我們可以使用實(shí)體類的屬性名而不是字符串,使得代碼更加健壯和易維護(hù)。
4. UpdateWrapper
UpdateWrapper用于構(gòu)建更新條件,與QueryWrapper類似,也支持鏈?zhǔn)秸{(diào)用和Lambda表達(dá)式。
4.1 基本用法
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
public class UpdateWrapperExample {
public static void main(String[] args)
{
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 等值條件
updateWrapper.eq("name", "John");
// 不等值條件
updateWrapper.ne("age", 25);
// 大于條件
updateWrapper.gt("create_time", "2022-01-01");
// 小于等于條件
updateWrapper.le("update_time", "2023-01-01");
// 模糊查詢
updateWrapper.like("email", "@gmail.com");
// 使用Lambda表達(dá)式
updateWrapper.lambda().set(User::getName, "Alice").eq(User::getAge, 30);
// 打印SQL語(yǔ)句
System.out.println("SQL: " + updateWrapper.getSqlSet());
}
}UpdateWrapper的基本用法與QueryWrapper類似,可以通過(guò)鏈?zhǔn)秸{(diào)用添加等值、不等值、范圍、模糊等更新條件。
4.2 動(dòng)態(tài)條件拼接
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
public class DynamicUpdateWrapperExample {
public static void main(String[] args) {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 動(dòng)態(tài)條件拼接
updateWrapper.and(wrapper -> wrapper.eq("name", "John").ne("age", 25))
.or(wrapper -> wrapper.gt("create_time", "2022-01-01").le("update_time", "2023-01-01"));
// 打印SQL語(yǔ)句
System.out.println("SQL: " + updateWrapper.getSqlSet());
}
}通過(guò)and和or方法,我們可以動(dòng)態(tài)拼接更新條件,更好地適應(yīng)各種業(yè)務(wù)場(chǎng)景。
4.3 Lambda表達(dá)式的高級(jí)用法
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
public class LambdaUpdateWrapperExample {
public static void main(String[] args) {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// Lambda表達(dá)式
updateWrapper.lambda().set(User::getName, "Alice")
.eq(User::getAge, 30)
.like(User::getEmail, "@gmail.com");
// 打印SQL語(yǔ)句
System.out.println("SQL: " + updateWrapper.getSqlSet());
}
}通過(guò)lambda方法,我們可以使用實(shí)體類的屬性名,使得代碼更加簡(jiǎn)潔和可讀。
5. 拓展功能與未來(lái)展望
5.1 動(dòng)態(tài)SQL的使用
QueryWrapper和UpdateWrapper提供了豐富的條件構(gòu)造方法,但對(duì)于一些特定、復(fù)雜的業(yè)務(wù)場(chǎng)景,可能需要使用動(dòng)態(tài)SQL。Mybatis-Plus也支持動(dòng)態(tài)SQL的編寫,可以通過(guò)@SqlParser注解來(lái)實(shí)現(xiàn)。
@SqlParser(filter = true)
public interface UserMapper extends BaseMapper<User> {
@Select("<script> SELECT * FROM user WHERE 1=1 "
+ "<if test=\"name != null\"> AND name = #{name} </if>"
+ "<if test=\"age != null\"> AND age = #{age} </if>"
+ "</script>")
List<User> selectUsers(@Param("name") String name, @Param("age") Integer age);
}5.2 自定義條件構(gòu)造器
在某些場(chǎng)景下,可能需要根據(jù)具體業(yè)務(wù)需求自定義條件構(gòu)造器。Mybatis-Plus提供了AbstractWrapper類,開發(fā)者可以繼承并實(shí)現(xiàn)自己的條件構(gòu)造器。
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
public class CustomWrapper<T> extends AbstractWrapper<T, CustomWrapper<T>> {
public CustomWrapper() {
super();
}
// 自定義條件構(gòu)造方法
public CustomWrapper<T> customCondition(String condition) {
sql.WHERE(condition);
return this;
}
}6. 總結(jié)
Mybatis-Plus的條件構(gòu)造器QueryWrapper和UpdateWrapper為開發(fā)者提供了強(qiáng)大、靈活的條件構(gòu)建工具,能夠大大簡(jiǎn)化數(shù)據(jù)庫(kù)操作的代碼。通過(guò)本文的介紹,讀者可以更加深入地理解這兩個(gè)條件構(gòu)造器的使用方法,并在實(shí)際項(xiàng)目中靈活應(yīng)用。在未來(lái),隨著Mybatis-Plus的不斷更新和完善,我們可以期待更多更強(qiáng)大的功能和特性的加入。希望本文能夠幫助開發(fā)者更好地利用Mybatis-Plus進(jìn)行數(shù)據(jù)庫(kù)操作,提高開發(fā)效率。
到此這篇關(guān)于Mybatis-Plus的條件構(gòu)造器QueryWrapper & UpdateWrapper詳解的文章就介紹到這了,更多相關(guān)Mybatis-Plus QueryWrapper & UpdateWrapper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud之熔斷器Hystrix的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud之熔斷器Hystrix的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決
這篇文章主要介紹了關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實(shí)現(xiàn)
本篇文章主要介紹了OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的案例詳解
這篇文章主要介紹了Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
mybatis配置mapper-locations位置的三種方式小結(jié)
這篇文章主要給大家介紹了關(guān)于mybatis配置mapper-locations位置的三種方式,Mybatis-Plus的初衷是為了簡(jiǎn)化開發(fā),而不建議開發(fā)者自己寫SQL語(yǔ)句的,但是有時(shí)客戶需求比較復(fù)雜,需要的朋友可以參考下2023-08-08
淺析Spring容器原始Bean是如何創(chuàng)建的
這篇文章主要是想和小伙伴們一起聊聊?Spring?容器創(chuàng)建?Bean?最最核心的?createBeanInstance?方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-08-08

