一、介紹
Java Lambda Query Wrapper(簡稱JLQ),是一款基於MyBatis-Plus的查詢構建工具,通過Lambda 表達式,優雅地構建出類型安全的 SQL 查詢條件。
JLQ 實現了基本的查詢操作,支持多表關聯查詢,還可以通過 join、groupBy、having、orderBy 等語句實現更多的複雜查詢功能。
相較於MyBatis-Plus本身的Wrapper,JLQ的Lambda查詢方式更加方便快捷,同時支持與 MyBatis-Plus 的使用相同的操作方式。
二、為什麼要使用JLQ
MyBatis-Plus封裝了很多的查詢條件構建器(Wrapper),但是在使用過程中,需要傳入字元串類型的查詢條件,容易產生打錯字元、類型不對等問題。
而JLQ使用Lambda表達式作為查詢條件,避免了構建查詢條件時發生的類型錯誤。
另外,JLQ支持多表關聯查詢,免去了手寫SQL的繁瑣,同時在查詢操作時也能實現類型安全。
最重要的是,JLQ在性能上比手寫的SQL語句具有更高的執行效率。因為JLQ是基於MyBatis-Plus的查詢構建器,使用了MyBatis-Plus本身的高效查詢邏輯。
三、如何使用JLQ
JLQ的使用方法很簡單,只需要在依賴中添加相關的Jar包,然後就可以愉快地使用了。
下面,我們舉一個簡單的例子來介紹JLQ的基本使用方法:
//實例化查詢構建器 LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); //設置查詢條件 lambdaQueryWrapper.like(User::getUsername,"admin") .ge(User::getAge,18); //執行查詢語句 List<User> userList = userMapper.selectList(lambdaQueryWrapper);
上述代碼實現了 「查詢用戶名中包含admin且年齡大於等於18歲的用戶」 的動態 SQL 操作,在Lambda表達式中,使用了 User::getUsername 和 User::getAge 來代替了字元串類型的欄位名,避免了因為打錯字元或者主/副表別名不對而導致的查詢失敗。
四、JLQ高級用法
如果只是用JLQ來實現基本的查詢操作,那麼其實用處並不大,而JLQ的高級用法則具有更加強大的功能。
1、多表關聯查詢
在查詢中,經常需要使用多表關聯來查出需要的數據,而JLQ則支持非常簡單的語法來實現多表關聯查詢,如下所示:
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.table("user") .leftJoin("user_role",UserRole::getUserId, User::getId) .eq(UserRole::getRoleId,roleId); List<User> userList = userMapper.selectList(lambdaQueryWrapper);
通過 table() 方法指定主表名,然後通過 leftJoin() 方法指定關聯表和關聯條件。查詢語句會生成如下的 SQL 語句:
SELECT user.* FROM user LEFT JOIN user_role ON user_role.user_id = user.id WHERE user_role.role_id = ?
2、複雜查詢語句
有時候需要查詢的條件非常複雜,使用MyBatis-Plus本身提供的 wrapper 無法解決時,可以使用LambdaQueryWrapper代替SQL語句直接構建查詢條件。
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.apply(aggregationCondition, null) .eq(User::getEnabled, true); List<User> userList = userMapper.selectList(lambdaQueryWrapper);
上述代碼中,apply() 方法實現了一段複雜的查詢語句,查詢語句會生成如下的 SQL 語句:
SELECT * FROM user WHERE (select count(*) from user_role where user_role.user_id = user.id) > ? AND user.enabled = true
3、通過entity屬性查詢
使用同一個Entity實現查詢操作時,可以通過 entity 屬性來進行查詢,如下所示:
User user = new User(); user.setUsername("admin"); user.setAge(18); LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(user); List<User> userList = userMapper.selectList(lambdaQueryWrapper);
上述代碼將一個 User 實例傳入 LambdaQueryWrapper 構造器中,JLQ會根據 User 的屬性進行查詢,生成如下的 SQL 語句:
SELECT * FROM user WHERE username = ? AND age = ?
五、總結
Java Lambda Query Wrapper(JLQ)作為 MyBatis-Plus 的查詢構建工具,可以很好地解決在 MyBatis-Plus 中使用 MyBatis Mapper 而經常遇到的查詢構建器(Wrapper)類型錯誤的問題。
同時,JLQ還支持在構建查詢條件時使用Lambda表達式,減少了手寫 SQL 的繁瑣,提高了執行效率。
總體來說,JLQ是一個非常優秀的 MyBatis-Plus 的擴展功能,令代碼維護更加方便,代碼可讀性也更高。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297117.html