MyBatis-Plus – 条件构造器Wrapper
1.概述
在我们实际操作数据库时会涉及到很多复杂的条件,所以mp为我们提供了一个强大的条件构造器Wrapper,使用她让我们更方便的构造条件
2. 继承关系
AbstractWrapper: 用于构造where条件
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper)
的父类 用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件 注意: entity 生成的
where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
QueryWrapper: 额外提供select 方法 用于构造查询的哪些列
等价sql: select xxx,xxx,xxx from table 用于构造 xxx,xxx,xxx列
UpdateWrapper: 额外提供set方法,可以指定哪些字段进行更新
3.AbstractWrapper中的方法
3.0 须知
以下示例中比较简单的,显而易见一看就会的会一笔带过,不会写代码举例说明
以下出现第一个参数是 boolean类型的话,说明要判断第一个参数是否添加到生成的sql中,比如allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true
以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!
3.1 allEq
Eg1:
allEq(Map<R, V> params)
QueryWrapper<SysUser> query =new QueryWrapper<>();
Map<String, Object> map =new HashMap<>();
map.put(“email”,”123@qq.com”);
map.put(“user_name”,”jinxs001″);
query.allEq(map);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
4
5
6
等价sql:SELECT xxx,xxx,xxx FROM table WHERE (user_name = ‘jinxs001’ AND email = ‘123@qq.com’)
从sql中不难看出在条件构造器中的map k =字段名,v =字段值
Eg2:
allEq(Map<R, V> params, boolean null2IsNull)
QueryWrapper<SysUser> query =new QueryWrapper<>();
Map<String, Object> map =new HashMap<>();
map.put(“email”,”123@qq.com”);
map.put(“user_name”,null);
query.allEq(map,true);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
4
5
6
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name IS NULL AND email = ‘123@qq.com’)
第二个boolean的参数若为true mp就会检查map中的value值 若value为null就会在最终的sql中增加 is null 条件,若第二个参数值为false 将忽略value中参数为null的
Eg3:
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
int age =18;
QueryWrapper<SysUser> query =new QueryWrapper<>();
Map<String, Object> map =new HashMap<>();
map.put(“email”,”123@qq.com”);
map.put(“user_name”,null);
query.allEq(age>20,map,true);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
4
5
6
7
等价sql: 当第一个参数为false时等价于:SELECT xxx,xxx,xxx FROM sys_user
当第一个参数为true时等价于:SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name IS NULL AND email = ‘123@qq.com’)
总结: 所以第一个参数的意义是,当第一个参数为false时不会将后面的条件构建到最终sql里面,为true时才会
Eg4:
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
QueryWrapper<SysUser> query =new QueryWrapper<>();
Map<String, Object> map =new HashMap<>();
map.put(“email”,”123@qq.com”);
map.put(“user_name”,null);
query.allEq((k,v) -> k.contains(“a”),map);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
System.out.println(sysUsers.size());
1
2
3
4
5
6
7
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name IS NULL AND email = ‘123@qq.com’)
说明: 参数filter代表一个过滤函数,其作用是在添加这个参数后,mp会在map里面筛选key,不符合条件的key会被过滤掉,不会添加到最终执行sql中
condition,null2IsNull 用法同上,不再赘述
3.2 eq(等于 =)
Eg:
eq(R column, Object val)
eq(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.eq(“user_name”,”jinxs001″);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name = ‘jinxs001’)
说明: R column 代表表字段 ,val 值 。
3.3 ne(不等于 <>)
Eg:
ne(R column, Object val)
ne(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.ne(“user_name”,”jinxs001″);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name <> ‘jinxs001’)
3.4 gt(大于 >)
Eg:
gt(R column, Object val)
gt(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.gt(“age”,5);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (age > 5)
3.5 ge(大于等于 >=)
Eg:
ge(R column, Object val)
ge(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.ge(“age”,5);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (age >= 5)
3.6 lt (小于 <)
Eg:
lt(R column, Object val)
lt(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.lt(“age”,5);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx sys_user WHERE (age < 5)
3.7 le(小于等于 <=)
le(R column, Object val)
le(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.le(“age”,5);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (age <= 5)
3.8 between
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.between(“age”,5,6);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (age BETWEEN 5 AND 6)
3.9 notBetween
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (age not BETWEEN 5 AND 6)
3.10 like
like(R column, Object val)
like(boolean condition, R column, Object val)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.like(“user_name”,”jinxs”);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name LIKE ‘%jinxs%’)
3.11 notLike
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name NOT LIKE ‘%jinxs%’)
3.12 likeLeft
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name LIKE ‘%jinxs’)
3.13 likeRight
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (user_name LIKE ‘jinxs%’)
总结: 做模糊查询时mp会为我们拼接上%% 所以传值的时候不需要我们传入%,只传入需要匹配的值即可
3.14 isNull
isNull(R column)
isNull(boolean condition, R column)
等价sql: isNull(“name”)—>name is null
3.15 isNotNull
isNotNull(R column)
isNotNull(boolean condition, R column)
等价sql: isNotNull(“name”)—>name is not null
3.16 in
isNotNull(R column)
isNotNull(boolean condition, R column)
in(R column, Object… values)
in(boolean condition, R column, Object… values)
图中可以看出,传入的 in后面的数据可以是集合也可以是数组 所以,
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.in(“age”,1,2,3);
//===================或者是==============
//List<Integer> list =new ArrayList<>();
//list.add(4);
//list.add(5);
//list.add(6);
//query.in(“age”, list);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
4
5
6
7
8
9
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (age IN (1,2,3))
3.17 notIn
notIn(R column, Collection<?> value) notIn(boolean condition, R column, Collection<?> value)
notIn(R column, Object… values)
notIn(boolean condition, R column, Object… values)
说明: 相当于 not in 用法同上
3.18 inSql
in(sql语句)
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
等价sql: inSql(“id”, “select id from table where id < 3”)—>id in (select id from table where id < 3)
in后面的参数是String类型 可以是子查询的sql语句 也可以是一串字符串值,就像是这样
inSql(“age”, “1,2,3,4,5,6”)—>age in (1,2,3,4,5,6)
3.19 notInSql
notInSql(R column, String inValue) notInSql(boolean condition, R
column, String inValue)
说明: 使用方法同上,相当于 not in
3.20 groupBy
groupBy(R… columns)
groupBy(boolean condition, R… columns)
说明: 分组字段相当于 GROUP BY 字段
等价sql: groupBy(“id”, “name”)—>group by id,name
3.21 orderByAsc
orderByAsc(R… columns)
orderByAsc(boolean condition, R… columns)
说明: 相当于 ORDER BY 字段, … ASC 升序排序
等价sql: orderByDesc(“id”, “name”)—>order by id DESC,name DESC
3.22 orderByDesc
orderByDesc(R… columns)
orderByDesc(boolean condition, R… columns)
说明: 相当于ORDER BY 字段, … 降序排序
等价sql: orderBy(true, true, “id”, “name”)—>order by id ASC,name ASC
3.23 having
having(String sqlHaving, Object… params)
having(boolean condition, String sqlHaving, Object… params)
说明: HAVING ( sql语句 )
having(String sqlHaving, Object… params)
having(boolean condition, String sqlHaving, Object… params)
3.24 func
func(Consumer consumer)
func(boolean condition, Consumer consumer)
说明: func 方法(主要方便在出现if…else下调用不同方法能不断链)
例: func(i -> if(true) {i.eq(“id”, 1)} else {i.ne(“id”, 1)})
3.25 or
or()
or(boolean condition)
注意事项:
主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)
例: eq(“id”,1).or().eq(“name”,“老王”)—>id = 1 or name = ‘老王’
3.26 and
and(Consumer consumer)
and(boolean condition, Consumer consumer)
说明: 嵌套语法
例: and(i -> i.eq(“name”, “李白”).ne(“status”, “活着”))—>and (name = ‘李白’ and status <> ‘活着’)
3.27 nested
apply(String applySql, Object… params)
apply(boolean condition, String applySql, Object… params)
说明: 正常嵌套 不带 AND 或者 OR
例: nested(i -> i.eq(“name”, “李白”).ne(“status”, “活着”))—>(name = ‘李白’ and status <> ‘活着’)
3.28 apply
apply(String applySql, Object… params)
apply(boolean condition, String applySql, Object… params)
注意事项:
该方法可用于数据库函数 动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.apply(“date_format(create_time,’%Y-%m-%d’) = {0}”, “2020-08-08”);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user WHERE (date_format(create_time,‘%Y-%m-%d’) = ‘2020-08-08’)
3.29 last
last(String lastSql)
last(boolean condition, String lastSql)
说明: 直接将代码块拼接到最后。只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.last(“limit 1”);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT xxx,xxx,xxx FROM sys_user limit 1
3.30 exists
exists(String existsSql)
exists(boolean condition, String existsSql)
说明: 拼接exists
例: exists(“select id from table where age = 1”)—>exists (select id from table where age = 1)
3.31 notExists
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
说明: 拼接 NOT EXISTS ( sql语句 )
例: 例: notExists(“select id from table where age = 1”)—>not exists (select id from table where age = 1)
4. QueryWrapper
说明:
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取
4.1 select(设置查询字段)
说明: 这里的使用有两种形式,第一种是直接设置要查询的字段,第二种是过滤查询的字段(主键不会被过滤),入参不包含 字节码文件的的调用前需要wrapper内的entity属性有值! 这两类方法重复调用以最后一次为准
Eg1:
select(String… sqlSelect)
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.select(“user_id”,”user_name”,”age”);
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT user_id,user_name,age FROM sys_user
说明: select 用来构建查询的列
Eg2:
select(Class entityClass, Predicate predicate)
先看写源代码,代码注释中列举了几种写法
QueryWrapper<SysUser> query =new QueryWrapper<>();
query.select(SysUser.class,tableFieldInfo -> “user_name”.equals(tableFieldInfo.getColumn()));
List<SysUser> sysUsers = sysUserMapper.selectList(query);
1
2
3
等价sql: SELECT user_id,user_name FROM sys_user
5.UpdateWrapper
说明:
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!
5.1set
set(String column, Object val)
set(boolean condition, String column,Object val)
例: set(“name”, “老李头”)
例: set(“name”, “”)—>数据库字段值变为空字符串
例: set(“name”, null)—>数据库字段值变为null
5.2 setSql
说明:
setSql(String sql)
setSql(“name = ‘老李头’”)
————————————————
版权声明:本文为CSDN博主「J.XS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43807429/article/details/125267700