MyBatisPlus-QueryWrapper多條件查詢以及修改


gt、ge、lt、le、isNull、isNotNull

  • 大於 >
  • 例: gt("age", 18)age > 18
  • ge 大於等於 >=
  • 例: ge("age", 18)age >= 18
  • lt 小於 <
  • 例: lt("age", 18)age < 18
  • le 小於等於 <=
  • 例: le("age", 18)age <= 18
  • isNUll 字段 IS NULL
  • 例: isNull("name")name is null
  • isNotNull 字段 IS NOT NULL
  • 例: isNotNull("name")name is not null
@Test
public void queryWrapperOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.
            isNull("name")
            .ge("age", 23)
            .isNotNull("email");

    // 邏輯刪除
    int result = userMapper.delete(queryWrapper);
    System.out.println(result);

    // 最終的語句為:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL
}

eq、ne

  • eq 等於 =
  • 例: eq("name", "老王")name = '老王'
  • ne 不等於 <>
  • 例: ne("name", "老王")name <> '老王'
@Test
public void queryWrapperTwo() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "BNTang");

    // selectOne:返回的是一條記錄,當出現多條時會報錯
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}

between、notBetween

  • BETWEEN 值1 AND 值2
  • 例: between("age", 18, 30)age between 18 and 30
  • NOT BETWEEN 值1 AND 值2
  • 例: notBetween("age", 18, 30)age not between 18 and 30
@Test
public void queryWrapperThree() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.between("age", 20, 30);

    Integer count = userMapper.selectCount(queryWrapper);
    System.out.println(count);
}

allEq

  • allEq 全部 eq(或個別 isNull)

個別參數說明:

params: key 為數據庫字段名, value 為字段值

如果想表示 null isNull,則在 value 取值的時候傳入一個 null, 為 null 時調用 isNull 方法, 為false時則忽略valuenull的,也就是不拼接 value 為 null 的查詢條件字段

  • 例1: allEq({id:1,name:"老王",age:null})id = 1 and name = '老王' and age is null
  • 例2: allEq({id:1,name:"老王",age:null}, false)id = 1 and name = '老王'
@Test
public void queryWrapperFour() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    Map<String, Object> queryParamsMap = new HashMap<>();
    queryParamsMap.put("id", 1373266771933462530L);
    queryParamsMap.put("name", "BNTang");
    queryParamsMap.put("age", 23);

    queryWrapper.allEq(queryParamsMap);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

個別參數說明

filter: 過濾函數, 是否允許字段傳入比對條件中
paramsnullIsNull 同上

  • 例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})name = '老王' and age is null
  • 例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)name = '老王'

如上圖可看到,只添加了一個 id 查詢的條件因為我寫的過濾條件為要包含 i 這個字符串,所以只有第一個 key, value 包含了所以就只添加了 id

like、notLike、likeLeft、likeRight

  • LIKE '%值%'
  • 例: like("name", "王")name like '%王%'
  • NOT LIKE '%值%'
  • 例: notLike("name", "王")name not like '%王%'
  • LIKE '%值'
  • 例: likeLeft("name", "王")name like '%王'
  • LIKE '值%'
  • 例: likeRight("name", "王")name like '王%'
@Test
public void queryWrapperFive() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .notLike("name", "BNTang")
            .likeRight("email", "zq");

    // 返回值是Map列表
    List<Map<String, Object>> users = userMapper.selectMaps(queryWrapper);
    users.forEach(System.out::println);
}

in、notIn、inSql、notinSql、exists、notExists

  • 字段 IN (value.get(0), value.get(1), ...)
  • 例: in("age",{1,2,3})age in (1,2,3)
  • 字段 NOT IN (value.get(0), value.get(1), ...)
  • 例: notIn("age",{1,2,3})age not in (1,2,3)
  • 字段 IN ( sql語句 )
  • 例: inSql("age", "1,2,3,4,5,6")age in (1,2,3,4,5,6)
  • 例: inSql("id", "select id from table where id < 3")id in (select id from table where id < 3)
  • 字段 NOT IN ( sql語句 )
  • 例: notInSql("age", "1,2,3,4,5,6")age not in (1,2,3,4,5,6)
  • 例: notInSql("id", "select id from table where id < 3")id not in (select id from table where id < 3)
  • 拼接 EXISTS ( sql語句 )
  • 例: exists("select id from table where age = 1")exists (select id from table where age = 1)
  • 拼接 NOT EXISTS ( sql語句 )
  • 例: notExists("select id from table where age = 1")not exists (select id from table where age = 1)
@Test
public void queryWrapperSix() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.in("id", 1, 2, 3);
    queryWrapper.inSql("id", "select id from user where id < 3");

    // 返回值是Object列表
    List<Object> users = userMapper.selectObjs(queryWrapper);
    users.forEach(System.out::println);
}

or、and

  • 拼接 OR

注意事項:

主動調用or表示緊接着下一個方法不是用and連接!(不調用or則默認為使用and連接)

  • 例: eq("id",1).or().eq("name","老王")id = 1 or name = '老王'
  • OR 嵌套
  • 例: or(i -> i.eq("name", "李白").ne("status", "活着"))or (name = '李白' and status <> '活着')
  • AND 嵌套
  • 例: and(i -> i.eq("name", "李白").ne("status", "活着"))and (name = '李白' and status <> '活着')
@Test
public void queryWrapperSeven() {
    // 修改值
    User user = new User();
    user.setAge(99);
    user.setName("BNTang6666");

    // 修改條件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
            .like("name", "BNTang")
            .or()
            .between("age", 20, 30);
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

嵌套 or、嵌套 and

@Test
public void queryWrapperEight() {
    // 修改值
    User user = new User();
    user.setAge(99);
    user.setName("BNTang6666");

    // 修改條件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
            .like("name", "A")
            .or(i -> i.eq("name", "BNTang6666").ne("age", 20));

    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

orderBy、orderByDesc、orderByAsc

  • 排序:ORDER BY 字段, ...
  • 例: orderBy(true, true, "id", "name")order by id ASC,name ASC
  • 排序:ORDER BY 字段, ... DESC
  • 例: orderByDesc("id", "name")order by id DESC, name DESC
  • 排序:ORDER BY 字段, ... ASC
  • 例: orderByAsc("id", "name")order by id ASC,name ASC
@Test
public void queryWrapperNine() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("id");

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

last

  • 無視優化規則直接拼接到 sql 的最后

注意事項:

只能調用一次, 多次調用以最后一次為准有 sql 注入的風險, 請謹慎使用

  • 例: last("limit 1")
@Test
public void queryWrapperTen() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    queryWrapper.last("limit 1");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

指定要查詢的列

@Test
public void queryWrapperEleven() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "age");
    
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

set、setSql

  • SQL SET 字段
  • 例: set("name", "老李頭")
  • 例: set("name", "")→數據庫字段值變為空字符串
  • 例: set("name", null)→據庫字段值變為null
  • 設置 SET 部分 SQL
  • 例: setSql("name = '老李頭'")
@Test
public void queryWrapperTwelve() {
    // 修改值
    User user = new User();
    user.setAge(10);

    // 修改條件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
            .like("name", "A")
            // 除了可以查詢還可以使用set設置修改的字段
            .set("name", "BNTang")
            // 可以有子查詢
            .setSql(" email = '303158131@qq.com'");

    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM