Bootstrap

如何通过条件构造器 书写 MybatisPlus 复杂 SQL 语句?

哈喽,大家好,我是指北君。
之前有一篇文章,我们介绍过通过 Mybatis Plus 进行增删改查。如下这段代码:

/**
 * 根据id修改
 * UPDATE user SET user_name=?, user_age=? WHERE (id = ?)
 */
@Test
public void testudpateById(){
    User user = new User();
    user.setUserAge("25");
    user.setUserName("test update");
    UpdateWrapper updateWrapper = new UpdateWrapper();
    updateWrapper.eq("id","3");
    int num = userMapper.update(user, updateWrapper);
    System.out.println("修改的记录数为:"+num);
}
     
/**
 * 查询指定记录
 * SELECT id,user_name,user_age FROM user WHERE (user_name = ?)
 */
@Test
public void testSelectWrapper(){
    QueryWrapper wrapper = new QueryWrapper();
    wrapper.eq("user_name","IT可乐");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(x-> System.out.println(x.getId()+"-"+x.getUserName()+"-"+x.getUserAge()));
}

上面两个方法分别是根据id修改表记录,和根据user_name查询记录。构造的条件使用了 UpdateWrapper 和 QueryWrapper ,那么这是什么呢?其实 mybatis plus 通过条件构造器可以组成复杂的SQL语句。本篇博客我们将详细介绍。

1、Wrapper

Mybatis Plus 提供的几种条件构造器,关系如下:

我们主要通过 QueryWrapper 和 UpdateWrapper 进行条件构造,这两个和 LambdaQueryWrapper、LambdaUpdateWrapper 差不多是等价的,只不过后者采用了 JDK1.8 提供的lambda 语法,使用起来更简洁。

2、语法详情总结

关于条件构造器的各个用法介绍,可以参考官网:https://mp.baomidou.com/guide/wrapper.html#abstractwrapper

这里我们做一下总结:

方法名说明用法实例等价SQL官网地址https://mp.baomidou.com/guide/wrapper.html#abstractwrapper----::----:allEq(Map<R, V> params)全部等于map.put("id","3");map.put("user_name","IT可乐");allEq(map)user_name = "IT可乐" AND id = 3eq(R column, Object val)等于 =eq("id","3")id = 3ne(R column, Object val)不等于 <>ne("id", "3")id <> 3gt(R column, Object val)大于 >gt("user_age","18")user_age > 18ge(R column, Object val)大于等于 >=ge("user_age","18")user_age >= 18lt(R column, Object val)小于 <lt("user_age","18")user_age < 18le(R column, Object val)小于等于 <=le("user_age","18")user_age <= 18between(R column, Object val1, Object val2)BETWEEN 值1 AND 值2between("user_age","18","25")user_age BETWEEN 18 AND 25notBetween(R column, Object val1, Object val2)NOT BETWEEN 值1 AND 值2notBetween("user_age","18","25")user_age NOT BETWEEN 18 AND 25like(R column, Object val)LIKE '%值%'like("user_name","可乐")like ‘%可乐%’notLike(R column, Object val)NOT LIKE '%值%'notLike("user_name","可乐")not like ‘%可乐%’likeLeft(R column, Object val)LIKE '%值'likeLeft("user_name","可乐")like ‘%可乐’likeRight(R column, Object val)LIKE '值%'likeRight("user_name","可乐")like ‘可乐%’isNull(R column)字段 IS NULLisNull("user_name")user_name IS NULLisNotNull(R column)字段 IS NOT NULLisNotNull("user_name")user_name IS NOT NULLin(R column, Collection<?> value)字段 IN (value.get(0), value.get(1), ...)in("user_age",{1,2,3})user_age IN (?,?,?)notIn(R column, Collection<?> value)字段 NOT IN (value.get(0), value.get(1), ...)notIn("user_age",{1,2,3})user_age NOT IN (?,?,?)inSql(R column, String inValue)字段 IN ( sql语句 )inSql("id","select id from user")id IN (select id from user)notInSql(R column, String inValue)字段 NOT IN ( sql语句 )notInSql("id","select id from user where id > 2")id NOT IN (select id from user where id > 2groupBy(R... columns)分组:GROUP BY 字段, ...groupBy("id","user_age")GROUP BY id,user_ageorderByAsc(R... columns)排序:ORDER BY 字段, ... ASCorderByAsc("id","user_age")ORDER BY id ASC,user_age ASCorderByDesc(R... columns)排序:ORDER BY 字段, ... DESCorderByDesc("id","user_age")ORDER BY id DESC,user_age DESCorderBy(boolean condition, boolean isAsc, R... columns)ORDER BY 字段, ...orderBy(true,true,"id","user_age")ORDER BY id ASC,user_age ASChaving(String sqlHaving, Object... params)HAVING ( sql语句 )having("sum(user_age)>{0}","25

;