1.说明
条件构造器就是指的是mybatisPlus的条件筛选,通过mybatisPlus的条件构造器对数据进行筛选,让mybatisPlus执行where语句。
2.条件构造器的体系图(3.0x版本以上)
3.语法
方法名 | 说明 | 用法实例 | 等价SQL |
---|---|---|---|
eq | 等于 = | 例:eq(“name”,“唐”) | name = ‘唐’ |
ne | 不等于<> | 例:ne(“name”,“唐”) | name <> ‘唐’ |
gt | 大于> | 例:gt(“age”,18) | age > 18 |
ge | 大于等于>= | 例:ge(“age”,18) | age >= 18 |
lt | 小于< | 例:lt(“age”,18) | age < 18 |
le | 小于<= | 例:le(“age”,18) | age <= 18 |
between | between 值1 and 值2 | 例:between(“age”,18,30) | age between 18 and 30 |
notBetween | not between 值1 and 值2 | 例:notBetween(“age”,18,30) | age not between 18 and 30 |
like | like ‘%值%’ | 例:like(“name”,“唐”) | name like ‘%唐%’ |
notLike | not like ‘%值%’ | 例:notLike(“name”,“唐”) | name not like ‘%唐%’ |
likeLeft | like ‘%值’ | 例:likeLeft(“name”,“唐”) | name like ‘%唐’ |
likeRight | like ‘值%’ | 例:likeRight(“name”,“唐”) | name like ‘唐%’ |
isNull | 字段 is null | 例:isNull(“name”) | name is null |
isNotNull | 字段 is not null | 例:isNotNull(“name”) | name is not null |
in | 字段 in (值1,值2) | 例:.in(“age”,18,20) | age in (18,20) |
notIn | 字段 not in (值1,值2) | 例:notIn(“age”,18,20) | age not in (18,20) |
inSql | 字段 in (sql语句) | 例:inSql(“id”,“select id from table where id < 3”) | id in (select id from table where id < 3) |
notInSql | 字段 not in (sql语句) | 例:notInSql(“id”,“select id from table where id < 3”) | id not in (select id from table where id < 3) |
groupBy | 分组:group by 字段1,字段2 | 例:groupBy(“id”,“name”) | group by id,name |
orderByAsc | 排序:order by 字段1,字段2 asc | 例:orderByAsc(“id”,name) | order by id asc,name asc |
orderBydesc | 排序:order by 字段1,字段2 desc | 例:orderByDesc(“id”,“name”) | order by id desc,name desc |
orderBy | 排序:order by 字段 | 例:.orderBy(true, true, “id”, “name”) PS:第一个true是开启orderby,true开启,false关闭;第二个true是开启asc还是desc,true为asc,false为desc; | order by id asc,name asc |
having | having(sql语句) | 例:.having(“sum(age) > 10”) PS:要和groupBy一起使用 | having sum(age) > 10 |
or | 拼接or | 例:eq(“id”,1).or().eq(“name”,“唐”) PS:主动调用or 表示紧接着下一个方法不是用and 连接!(不调用or 则默认为使用and 连接) | id = 1 or name = ‘唐’ |
or嵌套 | 拼接or嵌套 | 例:or(i -> i.eq(“name”, “李白”).ne(“state”, 0)) | or (name = ‘李白’ and status <> 0) |
and嵌套 | 拼接and嵌套 | 例:and(i -> i.eq(“name”, “李白”).ne(“state”,0)) | and (name = ‘李白’ and state <> 0) |
apply | 拼接sql | 例:apply(“id = 1”) | id = 1 |
apply函数 | apply函数使用 | 例:apply(“date_format(dateColumn,‘%Y-%m-%d’) = ‘2008-08-08’”) | date_format(dateColumn,‘%Y-%m-%d’) = ‘2008-08-08’") |
last | 直接拼接sql | 例:last(“limit 1”) PS:无视优化规则直接拼接到 sql 的最后,只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用 | limit 1 |
exists | 拼接exists(sql语句) | 例:exists(“select id from table where age = 1”) | exists (select id from table where age = 1) |
notExists | 拼接not exists(sql语句) | 例:notExists(“select id from table where age = 1”) | not exists (select id from table where age = 1) |
nested | 正常嵌套 不带 AND 或者 OR | 例:nested(i -> i.eq(“name”, “李白”).ne(“state”, 0)) | (name = ‘李白’ and state<> 0) |
4.条件构造器的分类
1.QueryWrapper()
1.说明
对象封装操作类,用于查询;
3.x的版本才有QueryWrapper,EntityWrapper继承AbstractWrapper抽象父类,来让用户自由的构建查询条件,简单编辑、提高开发效率
PS:使用的是数据库字段、不是Java属性
2.测试代码
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("user_name",userName);
List<User> list = baseMapper.selectList(wrapper);
2.EntityWrapper
1.说明
对象封装操作类,用于查询;
3.x以下版本才有EntityWrapper,EntityWrapper继承Wrapper抽象父类
2.测试代码
EntityWrapper<User> wrapper = new EntityWrapper<>();
wrapper.eq("user_name",userName);
List<User> list = baseMapper.selectList(wrapper);
Wrapper<User> wrapper = new EntityWrapper<>();
wrapper.eq("user_name",userName);
List<User> list = baseMapper.selectList(wrapper);
3.UpdateWrapper
1.说明
条件封装操作类,用于更新。
和QueryWrapper(),EntityWrapper条件构造器相比,区别就是可以设置字段值
2.测试代码
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("user_id", user.getUserId());
wrapper.set("password",null);
baseMapper.update(user, wrapper);
4.LambdaQueryWrapper
1.说明
利用lambda表达式的一个用法(类::静态方法)获得属性对应字段,可防止写错字段名,用于查询。
2.测试代码
public void selectList4(){
//多条件拼接,有条件就拼接
String name="";
Integer agebegin = 20;
Integer ageend=21;
LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
//利用lambda表达式的一个用法(类::静态方法)获得属性
lambdaQueryWrapper.like(StringUtils.isNotBlank(name),User_plus::getName,name)
.ge(agebegin!=null,User_plus::getAge,agebegin)
.le(ageend!=null,User_plus::getAge,agebegin);
List<User> userlist = user_plusDAO.selectList(lambdaQueryWrapper);
userlist.forEach(System.out::println);
}
5.LambdaUpdateWrapper
1.说明
Update 条件封装,利用lambda表达式的一个用法(类::静态方法)获得属性对应字段,可防止写错字段名,,用于更新。
和LambdaQueryWrapper条件构造器相比,区别就是可以设置字段值
2.测试代码
public void updateWrapper(){
User_plus user=new User_plus();
LambdaUpdateWrapper<User_plus> lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
//设置更新字段
lambdaUpdateWrapper.set(User_plus::getName,"张飞");
//设置更新条件
lambdaUpdateWrapper.eq(User_plus::getId,1);
int i = user_plusDAO.update(user,lambdaUpdateWrapper);
System.out.println(i);
}