MyBatis-Plus+mysql5.7动态拼接sql语句分页查询⾃定义sql查询条件分
组排序
在使⽤srpingboot2.x+mybatis-plus框架是遇到特殊需求时研究mybatis-plus的条件构造器动态拼接sql查询,这个查询接⼝涉及到了⾃定义sql,动态拼接sql,分页,求和,分组,排序。
可以直接看业务实现⽅法
⾸先说⼀下接⼝的需求:
⼊参JSON:
1 {
2    "from": "2020-5-29",
3    "limit": 10,
4    "offset": 0,
5    "order": "hitCount",
6    "page": 1,
7    "search": "",
8    "sort": "desc",
9    "sortDirection": "",
groupby分组10    "to": "2020-6-10"
11 }
⼊参注释说明:
{
"from": "开始查询时间",
"limit": 条数,
"offset": 0,
"order": "需要排序的字段",
"page": 页码,
"search": "查询条件",
"sort": "排序规则",
"sortDirection": "",
"to": "结束查询时间"
}
然后先写接⼝实现:
1    @PostMapping("categoryList")
2public R getCategoryList(@Validated @RequestBody QaDetailSearchVo vo){
3        RobotPage pageHelper = new Page(),vo.getLimit());
4return R.ok(iStatQaService.findQaStatCategory(pageHelper, vo));
5    }
解释:POST请求,R 是⾃定义的返回类型,RobotPage是为了实现⼀些特殊返回值继承于mybatsi-plus分页的Ipage:
1public class RobotPage<T> extends Page<T> implements Serializable {}
重点是业务实现类和mapper层:
对于⼀般的查询mybatis-plus的条件构造器已经可以满⾜了,例如:
1 SysUser sysUser = baseMapper.selectOne(Wrappers.<SysUser>lambdaQuery()
2                .select(SysUser::getUserId, SysUser::getUsername, SysUser::getPhone, SysUser::getEmail, SysUser::getPassword, SysUser::getDeptId, SysUser::getJobId, SysUser::getAvatar)
3                .eq(SysUser::getUsername, username));
但是对于⼀些需要复杂的或者多表的操作就需要⾃定义sql语句了,⽰例:
⾸先是mapper⾃定义分页查询接⼝:
1 @Select("SELECT s.category_id as id, s.category_name as category, SUM(s.hit_count) as hitCount, SUM(s.solve_count) as resolvedCount, _solve_count) as unresolvedCount " +
2            "FROM core_stat_qa as s ${ew.customSqlSegment}")
3    IPage<QaDetailCategoryListVo> findCategoryListByParams(IPage<QaDetailCategoryListVo> page, @Param(Constants.WRAPPER) QueryWrapper<StatQa> wrappers);
这部分官⽹给的有⽰例:
业务接⼝不⽤看直接是实现类:
1 @Override
2public Grid findQaStatCategory(Page<QaDetailCategoryListVo> page, QaDetailSearchVo vo) {
3//声明返回
4        Grid grid = new Grid();
5//组装查询语句
6        QueryWrapper<StatQa> qaQueryWrapper = new QueryWrapper<>();
7//模糊查询
8        qaQueryWrapper.like(StringUtils.Search()),"category_name",vo.getSearch());
9//where条件
10        ("create_time", DateUtil.From(),"yyyy-MM-dd"));
11        qaQueryWrapper.lt("create_time",DateUtil.To(), "yyyy-MM-dd"));
12//分组
13        upBy("category_id","category_name");
14//排序
15        derBy(true, !"desc".Sort()),vo.getOrder());
16//调⽤⾃定义sql语句
17        IPage<QaDetailCategoryListVo> statQaIPage = baseMapper.findCategoryListByParams(page, qaQueryWrapper);
18//抽取list
19        List<QaDetailCategoryListVo> statQaList = Records();
20        grid.setList(statQaList);
21        grid.Total());
22return grid;
23    }
需要解释的:
排序orderBy⽅法中的第⼀个true官⽹上也是给出解释的:表⽰该条件是否加⼊最后⽣成的sql中。!"desc".Sort())  是排序规则 asc和desc
调⽤mapper⾃定义sql就是:
baseMapper.findCategoryListByParams(page, qaQueryWrapper);
接⼝完成。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。