基于MyBatis-Plus实现复杂查询

在使用MyBatis-Plus开发过程中,不可避免的会出现有些略复杂的查询,需要熟练使用MyBatis-Plus来实现这些功能。

使用and、or

需求背景

列表搜索页,根据某个字段名称进行查询,后端存储的数据表中是包含了有效数据和无效数据,即查询的时候要在有效数据中查询,且字段名称范围编码和中文名称,就要用来查询。

直接写SQL就是这么写

select * from test from data_status = 0 and (name='测试'  or code='CS')

然后使用MyBatis-Plus来写的话,要避免以下这种写法

QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("data_status",1)
                .like("name","测试")
                .or()
                .like("name","CS");

上述写法的SQL语句是

select * from test from data_status = 0 and name='测试'  or code='CS'

这样就是错的了,跟预期不符,需要注意

正确的写法应该是!
正确的写法应该是!
正确的写法应该是!

QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("data_status",1);
        queryWrapper.and(wrapper ->
                wrapper.like("name","测试")
                .or()
                .like("name","CS"));

如此即可,按照预期查询数据。

分组,聚合统计,排序,取前5

需求背景

页面展示,需要先根据某个字段进行筛选,然后对筛选完后的数据的某个字段进行分组,之后再聚合统计每个组有多少条数据,最后再根据条数倒叙,取前五条数据。

直接写SQL就是这么写

select name,count(id) as num from test where name like '测试%'  group by name order by count(id) desc limit 5

使用MyBatis-Plus写法如下

  QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper
                .select("name","count(id) as num")
                .likeRight("name","测试")
                .groupBy("name")
                .orderByDesc("count(id)").last("limit 5");

需要注意的是num这个字段是数据表里没有的字段,但是TestEntity这个类中是需要输出的,所以也需要配置一下

 @TableField(exist = false)
 private Integer num;

上述配置就是标记该字段在数据表中没有映射的。

未完待续,后续如果有新的需求开发用到了更多MyBatis-Plus的使用技巧再继续分享…

你可能感兴趣的:(真,·,解决问题,·,小知识,mybatis,java)