Mybatis-Plus的條件構(gòu)造器QueryWrapper & UpdateWrapper示例詳解
1. 引言
在數(shù)據(jù)庫(kù)操作中,條件查詢(xún)和條件更新是非常常見(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)化開(kāi)發(fā),提高效率。它提供了豐富的功能,包括代碼生成器、性能優(yōu)化、條件構(gòu)造器等。其中,條件構(gòu)造器是Mybatis-Plus中的一個(gè)核心功能,用于構(gòu)建靈活的查詢(xún)和更新條件。
3. QueryWrapper
3.1 基本用法
QueryWrapper
用于構(gòu)建查詢(xún)條件,可以通過(guò)鏈?zhǔn)秸{(diào)用的方式組裝各種查詢(xún)條件。
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"); // 模糊查詢(xún) 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ò)不同的方法添加等值、不等值、范圍、模糊等查詢(xún)條件,同時(shí)支持Lambda表達(dá)式。
3.2 動(dòng)態(tài)條件拼接
在實(shí)際應(yīng)用中,我們經(jīng)常需要根據(jù)不同條件的存在與否來(lái)動(dòng)態(tài)構(gòu)建查詢(xún)條件。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)拼接查詢(xún)條件,使得代碼更加靈活。
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í)體類(lèi)的屬性名而不是字符串,使得代碼更加健壯和易維護(hù)。
4. UpdateWrapper
UpdateWrapper
用于構(gòu)建更新條件,與QueryWrapper
類(lèi)似,也支持鏈?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"); // 模糊查詢(xún) 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
類(lèi)似,可以通過(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í)體類(lèi)的屬性名,使得代碼更加簡(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的編寫(xiě),可以通過(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
類(lèi),開(kāi)發(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
為開(kāi)發(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)大的功能和特性的加入。希望本文能夠幫助開(kāi)發(fā)者更好地利用Mybatis-Plus進(jìn)行數(shù)據(jù)庫(kù)操作,提高開(kāi)發(fā)效率。
到此這篇關(guān)于Mybatis-Plus的條件構(gòu)造器QueryWrapper & UpdateWrapper詳解的文章就介紹到這了,更多相關(guān)Mybatis-Plus QueryWrapper & UpdateWrapper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Redis的zset統(tǒng)計(jì)在線(xiàn)用戶(hù)信息
這篇文章主要介紹了SpringBoot使用Redis的zset統(tǒng)計(jì)在線(xiàn)用戶(hù)信息,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-04-04sun?unsafe類(lèi)功能及使用注意事項(xiàng)詳解
這篇文章主要為大家介紹了unsafe類(lèi)的功能及在使用中需要注意的事項(xiàng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-01-01java二維數(shù)組指定不同長(zhǎng)度實(shí)例方法
在本篇內(nèi)容里小編給大家分享了一篇關(guān)于java二維數(shù)組指定不同長(zhǎng)度實(shí)例方法,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03JDK動(dòng)態(tài)代理,代理接口沒(méi)有實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)動(dòng)態(tài)代理方式
這篇文章主要介紹了JDK動(dòng)態(tài)代理,代理接口沒(méi)有實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)動(dòng)態(tài)代理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08一文帶你熟練掌握J(rèn)ava中的日期時(shí)間相關(guān)類(lèi)
我們?cè)陂_(kāi)發(fā)時(shí),除了數(shù)字、數(shù)學(xué)這樣的常用API之外,還有日期時(shí)間類(lèi),更是會(huì)被經(jīng)常使用,比如我們項(xiàng)目中必備的日志功能,需要記錄異常等信息產(chǎn)生的時(shí)間,本文就帶各位來(lái)學(xué)習(xí)一下相關(guān)的日期時(shí)間類(lèi)有哪些2023-05-05Mybatis用注解寫(xiě)in查詢(xún)的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis用注解寫(xiě)in查詢(xún)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07基于java TCP網(wǎng)絡(luò)通信的實(shí)例詳解
本篇文章是對(duì)java中TCP網(wǎng)絡(luò)通信的實(shí)例進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05