MyBatis - Plus QueryWrapper 多條件查詢用法

做 Java 項目時,遇到複雜的數據庫查詢需求很常見 —— 比如既要篩選狀態,又要按時間範圍過濾,還得給結果排個序。這時候 MyBatis - Plus 的 QueryWrapper 就派上大用場了,它像個靈活的 “查詢搭積木工具”,不用寫複雜 SQL,拼幾個條件就能實現多樣的查詢邏輯,效率直接拉滿。

先從最基礎的多條件組合説起。比如要查詢 “狀態為正常(status=1)且創建時間在 2024 年 1 月 1 日之後” 的用户,用 QueryWrapper 的 eq(等於)和 ge(大於等於)方法就能輕鬆實現。這裏要注意,方法裏的字段名得和數據庫表的列名對應上,比如 “create_time” 不能寫成 “createTime”,不然會找不到字段。

// 多條件基礎查詢:狀態正常且2024年1月後創建的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 等於條件:狀態為正常
queryWrapper.eq("status", 1);
// 大於等於條件:創建時間 >= 2024-01-01 00:00:00
queryWrapper.ge("create_time", LocalDateTime.of(2024, 1, 1, 0, 0, 0));
// 執行查詢,獲取結果列表
List<User> validUserList = userMapper.list(queryWrapper);

要是遇到 “模糊查詢” 的場景,比如想找出 “用户名裏包含‘張’字,且手機號以 138 開頭” 的用户,QueryWrapper 的 like 和 likeLeft 方法就能搞定。like 是 “前後都模糊”,likeLeft 是 “左模糊”(即字段值以指定內容結尾),likeRight 則是 “右模糊”,根據需求選對應的方法就行。

// 模糊查詢:用户名含“張”且手機號以138開頭
QueryWrapper<User> likeQueryWrapper = new QueryWrapper<>();
// 模糊匹配:用户名包含“張”
queryWrapper.like("username", "張");
// 左模糊:手機號以138開頭(即字段值結尾是138,對應SQL的 like '138%')
queryWrapper.likeRight("phone", "138");
List<User> userWithZhang = userMapper.list(likeQueryWrapper);

還有排序和限制結果數量的需求,比如 “查詢狀態為正常的用户,按創建時間倒序排列,只取前 10 條”。這時候用 orderByDesc(降序)或 orderByAsc(升序)控制排序,再用 last 方法直接拼接 “LIMIT 10”,不用額外寫 SQL 片段,特別方便。不過要注意,last 方法會直接把內容拼到 SQL 末尾,使用時要確保參數安全,避免 注入。

// 排序+限制結果:正常狀態用户按創建時間倒序,取前10條
QueryWrapper<User> sortQueryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 1);
// 按創建時間降序(最新創建的排在前面)
queryWrapper.orderByDesc("create_time");
// 限制結果數量為10條
queryWrapper.last("LIMIT 10");
List<User> latest10ValidUsers = userMapper.list(sortQueryWrapper);

有時候還會用到 “in 查詢”,比如要找出 “用户 ID 在 1001、1002、1003 中的用户”,用 in 方法比寫多個 eq 條件簡潔多了。如果要排除某些值,就用 notIn 方法,比如 “排除 ID 為 1004、1005 的用户”。

// in查詢:用户ID在指定列表中
QueryWrapper<User> inQueryWrapper = new QueryWrapper<>();
List<Long> targetIds = Arrays.asList(1001L, 1002L, 1003L);
queryWrapper.in("id", targetIds);
List<User> targetUsers = userMapper.list(inQueryWrapper);

// notIn查詢:排除指定ID的用户
QueryWrapper<User> notInQueryWrapper = new QueryWrapper<>();
List<Long> excludeIds = Arrays.asList(1004L, 1005L);
queryWrapper.notIn("id", excludeIds);
List<User> otherUsers = userMapper.list(notInQueryWrapper);

這些只是 QueryWrapper 的部分常用場景,實際開發中還能組合出更復雜的邏輯 —— 比如用 and、or 方法控制條件組,用 isNull、isNotNull 判斷字段是否為空。掌握它之後,面對各種查詢需求都能遊刃有餘,不用再反覆寫 XML 裏的查詢語句,把更多時間花在業務邏輯上,開發節奏自然快很多。