条件构造器
Wrapper: 条件构造抽象类,最顶端父类 -> AbstractWrapper: 用于查询条件封装,生成 SQL 的 where 条件
1、QueryWrapper:封装查询条件
2、UpdateWrapper:封装 Update 条件
3、AbstractLambdaWrapper: 使用 Lambda 语法
(1)LambdaQueryWrapper:用于 Lambda 语法使用的查询
(2)WrapperLambdaUpdateWrapper:Lambda 更新封装 Wrapper
AbstractWrapper
1、用于生成 SQL 的 where 条件, entity 属性也用于生成 SQL 的 where 条件
2、注意:entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
(1)方法参数中,泛型 Param 是具体需要运行函数的类,也是 Wrapper 的子类,即当前封装条件的类(条件构造器)
Consumer<Param> consumer
3、allEq
(1)全部 eq(或个别 isNull)
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
(2)params:key 为数据库字段名,value 为字段值
(3)null2IsNull:为 true,则在 map 的 value 为 null 时,调用 isNull 方法;为 false 时,则忽略 value 为 null
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)
(4)filter:过滤函数,是否允许字段传入比对条件中
(5)params 与 null2IsNull:同上
4、eq
(1)等于 =
eq(R column, Object val)
eq(boolean condition, R column, Object val)
5、ne
(1)不等于 <>
ne(R column, Object val)
ne(boolean condition, R column, Object val)
6、gt
(1)大于 >
gt(R column, Object val)
gt(boolean condition, R column, Object val)
7、ge
(1)大于等于 >=
ge(R column, Object val)
ge(boolean condition, R column, Object val)
8、lt
(1)小于 <
lt(R column, Object val)
lt(boolean condition, R column, Object val)
9、le
(1)小于等于 <=
le(R column, Object val)
le(boolean condition, R column, Object val)
10、between
(1)BETWEEN 值1 AND 值2
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
11、notBetween
(1)NOT BETWEEN 值1 AND 值2
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
12、like
(1)LIKE '%值%'
like(R column, Object val)
like(boolean condition, R column, Object val)
13、notLike
(1)NOT LIKE '%值%'
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
14、likeLeft
(1)LIKE '%值'
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
15、likeRight
(1)LIKE '值%'
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
16、isNull
(1)字段 IS NULL
isNull(R column)
isNull(boolean condition, R column)
17、isNotNull
(1)字段 IS NOT NULL
isNotNull(R column)
isNotNull(boolean condition, R column)
18、in
(1)字段 IN (value.get(0), value.get(1), ...)
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
(2)字段 IN (v0, v1, ...)
in(R column, Object... values)
in(boolean condition, R column, Object... values)
19、notIn
(1)字段 NOT IN (value.get(0), value.get(1), ...)
notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
(2)字段 NOT IN (v0, v1, ...)
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)
20、inSql
(1)字段 IN(SQL 语句)
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
21、notInSql
(1)字段 NOT IN(SQL 语句)
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
22、groupBy
(1)分组:GROUP BY 字段, ...
groupBy(R... columns)
groupBy(boolean condition, R... columns)
23、orderByAsc
(1)升序:ORDER BY 字段, ... ASC
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
24、orderByDesc
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
25、orderBy
(1)排序:ORDER BY 字段, ...
orderBy(boolean condition, boolean isAsc, R... columns)
26、having
(1)HAVING(SQL 语句)
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
27、func
(1)func 方法:主要方便在出现 if……else 下调用不同方法能不断链
func(Consumer<Children> consumer)
func(boolean condition, Consumer<Children> consumer)
28、or
(1)拼接 OR
(2)注意:主动调用 or 表示紧接着下一个方法不是用 and 连接,不调用 or 则默认为使用 and 连接
or()
or(boolean condition)
(3)OR 嵌套
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
29、and
(1)AND 嵌套
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
30、nested
(1)正常嵌套,不带 AND 或者 OR
nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)
31、apply
(1)拼接 SQL
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
(2)注意:该方法可用于数据库函数,动态入参的 params 对应前面 applySql 内部的 {index} 部分,这样是不会有 SQL 注入风险的,反之会有
32、last
(1)无视优化规则直接拼接到 SQL 的最后
last(String lastSql)
last(boolean condition, String lastSql)
(2)注意:只能调用一次,多次调用以最后一次为准,有 SQL 注入的风险
33、exists
(1)拼接 EXISTS(SQL 语句)
exists(String existsSql)
exists(boolean condition, String existsSql)
34、notExists
(1)拼接 NOT EXISTS(SQL 语句)
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
QueryWrapper
1、继承自 AbstractWrapper,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper,可以通过 new QueryWrapper().lambda() 方法获取
2、设置查询字段
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
(1)以上方法分为两类,第二类方法为:过滤查询字段(主键除外),入参不包含 class 的调用前需要 wrapper 内的 entity 属性有值,这两类方法重复调用以最后一次为准
(2)不使用 select 则默认查询所有字段
3、封装查询条件,除了实现查询 SQL,还实现删除 SQL
UpdateWrapper
1、继承自 AbstractWrapper,自身的内部属性 entity 也用于生成 where 条件及 LambdaUpdateWrapper,可以通过 new UpdateWrapper().lambda() 方法获取
2、set
(1)SQL SET 字段
set(String column, Object val)
set(boolean condition, String column, Object val)
3、setSql
(1)设置 SET 部分 SQL
setSql(String sql)
lambda
1、获取 LambdaWrapper
(1)在 QueryWrapper 中是获取 LambdaQueryWrapper
(2)在 UpdateWrapper 中是获取 LambdaUpdateWrapper
2、可以通过 lambda 表达式,避免字段名写错
(1)LambdaQueryWrapper(示例)
@Test
public void test(){
//SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 通过lambda表达式,避免字段名写错
queryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
(2)LambdaUpdateWrapper(示例)
@Test
public void test(){
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
//User::getName:避免字段名写错
updateWrapper.like(User::getName, "a")
.and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
updateWrapper.set(User::getName, "小黑").set(User::getEmail,"abc@atguigu.com");
int result = userMapper.update(null, updateWrapper);
System.out.println("result:"+result);
}
condition
1、条件数据来源于用户输入,是可选的,因此在组装条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则不能组装,以免影响 SQL 执行的结果
2、使用带 condition 参数的重载方法构建查询条件,简化代码的编写
3、condition 为 boolean 类型,在组装条件时,可以对某条件进行判断
4、模拟输入示例
(1)原始
@Test
public void test09(){
/*
SELECT uid AS id, user_name AS name, age, email, is_deleted
FROM t_user
WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
*/
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if(StringUtils.isNotBlank(username)){
//isNotBlank判断某个字符创是否不为空字符串、不为null、不为空白符
queryWrapper.like("user_name", username);
}
// >= 年龄最小值
if(ageBegin != null){
queryWrapper.ge("age", ageBegin);
}
// <= 年龄最大值
if(ageEnd != null){
queryWrapper.le("age", ageEnd);
}
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
(2)改进
@Test
public void test10(){
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(username), "user_name", username)
.ge(ageBegin != null, "age", ageBegin)
.le(ageEnd != null, "age", ageEnd);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战