mybatis-plus高级应用

225 阅读3分钟

“携手创作,共同成长!这是我参与「掘金日新计划 · 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"1830)--->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 Plusadd()方法

  • 如果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