“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情” 生命无罪,健康万岁,我是laity。
我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
mybatisplus高级查询方法
QueryWrapper 高级查询方法
1、常用
.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
2、次之
.between ---- " between 值1 and 值2 " 例:between("age",18,30)--->age .between 18 and 30
.notBetween ---- " ontBetween 值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 (v0,v1,...) " 例:in("age",{1,2,3])--->age in (1,2,3)
.notIn ---- " 字段 not in (v0,v1,...) " 例:notIn("age",1,2,3)--->age not in (1,2,3)
.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") --->age .not in (select id from table where id < 3)in
3、再次之
.groupBy分组 ---- GROUP BY 字段... 例:groupBy("id","name")--->group by id,name
.orderByAsc排序 ---- ORDER BY 字段,... ASC 例:orderByAsc("id","name")--->order by id ASC,name ASC
.orderByDesc排序 ---- ORDER BY 字段,... DESC 例:orderByDesc("id","name")--->order by id DESC,name DESC
.orderBy排序 ---- ORDER BY 字段,... --->order by id ASC.name ASC 例:orderBy(true,true,"id","name")
.having去重 ---- HAVING(sql语句) having("sum(age)>[0]",11)--->having sum(age) >11
.apply 拼接sq1 注意事项: 该方法可用于数据库函数动态入参的params对应前面sq1Having内部的 (index)部分。这样是不会有sql注入风险的,反之会有! 例: apy(~date_ format(dateColumn, '%-a-~) = {0]", *2008 -08- 08")--->date_ format (dateColumn,' %Y-Mm=-%d') = *2008 -08-08'’) 无视优化规则直接拼接到sq1的最后 注意事项: 只能调用一次,多次调用以最后-次为准有sql注入的风险,请谨慎使用 例: last("limit 1")
.last 无视优化规则直接拼接到sq1的最后
.exists 拼接EXISTS ( sq1语句) 例: exists(" select id from table where age = 1") -->exists (select id from table where age三1)
.notExists 拼接NOT EXISTS ( sq1语句) 例: notExists(" 'select id from table where age = 1") -->not exists (select id from table where age三1)
.nested 正常嵌套不带AND或者OR 正常嵌套不带AND或者OR 例: nested(i -> i.eq( "name"," 李白").ne(' 'status", ’'活着")) -->(name = '李白’and status. <>"活着’)
MyBatis-Plus 在复杂查询条件Where中加括号,多个查询条件在括号内
使用and()
方法
官方给出示例:
and(i -> i.eq("name", "李白").ne("status", "活着"))
---> sql输出结果:and (name = '李白' and status <> '活着')
QueryWrapper
无条件时
QueryWrapper<Demo> queryWrapper = new QueryWrapper<>();
queryWrapper.and(query -> query.like(StringUtils.isNotBlank(demo.getName()), "demo.name", demo.getName()).or().
like(StringUtils.isNotBlank(demo.getFrontId()), "demo.frontId", demo.getFrontId()));
------> sql输出结果:
select id, name, frontId from demo where ( turbine.name LIKE '%测%' OR turbine.frontId LIKE '%测%')
QueryWrapper
有条件时
QueryWrapper<Demo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id",demo.getId);
queryWrapper.and(query -> query.like(StringUtils.isNotBlank(demo.getName()), "demo.name", demo.getName()).or().
like(StringUtils.isNotBlank(demo.getFrontId()), "demo.frontId", demo.getFrontId()));
------> sql输出结果:
select id, name, frontId from demo where id = 1 and ( turbine.name LIKE '%测%' OR turbine.frontId LIKE '%测%')
理解MyBatis Plus
的add()
方法
- 如果
QueryWrapper
对象没有查询条件,则只会在where语句中添加()
- 如果
QueryWrapper
对象中有查询条件了,会在where语句中自动添加and(查询条件)
自己写的案例
/* 学历(0:研究生;1:本科;2:大专;3:高中;4:初中;5:小学;6:无) last limit*/
@Override
public List<Map<String, Object>> getBigEducation(String province) {
QueryWrapper<RcPerUser> queryWrapper = new QueryWrapper<>();
queryWrapper.select("education as name, COUNT(education) as value");
if (!province.equals("全国")) {
queryWrapper.eq("province", province);
}
queryWrapper.groupBy("education");
queryWrapper.last("limit 3");
// Stream<Map<String, Object>> limit = rcPerUserMapper.selectMaps(queryWrapper).stream().limit(3); 都可以实现
// System.out.println(limit);
List<Map<String, Object>> mapList = rcPerUserMapper.selectMaps(queryWrapper);
return mapList;
}
实现连表查询
-- 奖励级别(0:国家级;1:省部级;2:区局级)
-- 根据用户id group by 查询 reward_level 并count(reward_level)
SELECT
contributions.reward_level as name,
COUNT(contributions.reward_level) as value
FROM
rc_per_user per_user
LEFT JOIN
rc_amt_contributions contributions
ON
per_user.id = contributions.per_user_id
WHERE
contributions.del_flag = 0 AND per_user.province = '天津市'
GROUP BY
contributions.reward_level
sql分组查询年龄分类
SELECT
CASE
WHEN
age>=1 and age<25 THEN
'25岁下'
WHEN
age>=25 AND age<35 THEN
'35岁下'
WHEN
age>=35 AND age<45 THEN
'45岁下'
WHEN
age>=45 THEN
'45岁上'
END
AS name,
count(*) AS value
FROM rc_per_user
WHERE del_flag = 0 AND province = '天津市'
GROUP BY name