mybatis-plus查询相关
公司里mp的使用非常高,但是queryWrapper对于我来说不是那么好理解,遇到很多Bug, mark一下。
配置那些省略,着重于业务代码。
分页查询
-
最常见功能。
-
实体类结构
Entity.class //原生数据库映射类 继承BasePo EntityDTO.class //结果返回集 //dto :数据传输对象层 , 可扩展,当实体对象改变,可避免前端改变 EntityQuery.class //封装查询条件 继承BaseQuery //BaseQuery定义查询共同条件 如分页pageSize,pageNum,排序方式,防sql注入等...
//设置每页条数
Page<Entity> page = new Page<>();
page.setCurrent(EntityQuery.getPageNum());
page.setSize(EntityQuery.getPageSize());
//wrapper封装
//一般分页都需要多条件查询
QueryWrapper<Entity> Wrapper = new QueryWrapper<>();
Wrapper
//StringUtils判断是否传参,如果为null,不执行此sql语句
.apply(StringUtils.isNotBlank(EntityQuery.getTitle()),
" title ilike {0}",EntityQuery.getTitle())
//排序 null默认最大,逆序可能显示在最前面,不符需求。
// 1. nulls last 空值排最后, nulls first 反之。(适用于asc)
.orderByDesc(" age")
.last(" nulls last ");
-
开发遇到问题描述
-
apply理解不够,生成sql语句报错
apply作用于拼接where语句,会默认自带 ‘AND’,eg.
apply(" order by age desc"); ----- select * from Table where title like #{title} and order by age desc 报错: order附近bad sql,因为 order是关键字,不可和and连用。 建议:使用 last();
-
排序问题
关于null 值的排序,解决方案:
-
最后加上 nulls last/first
-
字段前加上 ‘-’ 号
wrapper.orderByDesc(" -age ");
-
select name, age is null as ageNull from table
order by ageNotNull,age
or
select * form table order by isnull(age),age
-
-
参数为Integer类型不适用StringUtils.isNotBlank()
建议使用isEmpty(),注意 StringUtils导的不同的包
org.springframework.util.StringUtils.isEmpty (age)
mp QueryWrapper存在极大简化开发,但也降低可读性。
项目中可以通过配置,生成对应sql语句以供排错。
目前所遇的问题就是这些。
持续更新ing…
-