当前位置:网站首页>MP的几种查询方式
MP的几种查询方式
2022-08-02 10:36:00 【夜光下丶】
对于Mybatis而言,我们可以使用XML或者使用注解来编写我们的SQL语句
<select id="listUserByCondition" resultType="com.yang.entity.User">
select id, name, phone, email, profession, age, gender, status, create_time
from tb_user
<where>
<if test="name != null and name != ''">
and name like concat('%', #{name}, '#')
</if>
<if test="profession != null and profession != null">
and profession like concat('%', #{profession}, '%')
</if>
<if test="createTimeMin != null and createTimeMin != ''">
and create_time >= #{createTimeMin}
</if>
<if test="createTimeMax != null and createTimeMax">
and create_time < #{createTimeMax}
</if>
</where>
<if test="orderByColumn != null and orderByColumn != ''">
order by ${orderByColumn} ${isAsc}
</if>
limit ${pageNum} ${pageSize}
</select>由于业务逻辑可能会发生变化,若该表的结构在后续发生了变化,我们需要对原先编写的sql进行修改,但是由于sql是运行时才能发现,无法及时的发现所有需要修改的地方,可能会造成访问错误等问题。而且该sql的编写比较繁琐。
在MP中,我们可以使用wrapper来构造条件,用page自动进行分页操作,使用MP自带的sql语句,大大减少了我们的代码量,同时可以将经理集中在where条件中。
public PageResVO<User> list1(UserDTO userDTO) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
String orderBy = StringUtils.isBlank(userDTO.getIsAsc()) ? "" : userDTO.getIsAsc();
wrapper.like(StringUtils.isNotBlank(userDTO.getName()), User::getName, userDTO.getName())
.like(StringUtils.isNotBlank(userDTO.getProfession()), User::getProfession, userDTO.getProfession())
.ge(Objects.nonNull(userDTO.getCreateTimeMin()), User::getCreateTime, userDTO.getCreateTimeMin())
.lt(Objects.nonNull(userDTO.getCreateTimeMax()), User::getCreateTime, userDTO.getCreateTimeMax())
.last(StringUtils.isNotBlank(userDTO.getOrderByColumn()),
Constant.ORDER_BY_BLANK + StringUtils.camelToUnderline(userDTO.getOrderByColumn()) + " " + orderBy);
IPage<User> page = this.baseMapper.selectPage(new Page<>(userDTO.getPageNum(), userDTO.getPageSize()), wrapper);
return PageResVO.getBean(page, page.getRecords());
}但是在业务中,我们一般的入参是一个DTO,而返回的是一个VO,对于这种情况,有三种不同的写法
XML
Page<UserVO> list(Page<User> page, @Param("dto") UserDTO dto);<select id="list" resultType="com.yang.vo.UserVO">
select id, name, phone, email, profession, age, gender, status, create_time
from tb_user
<where>
<if test="dto.name != null and dto.name != ''">
and name like concat('%', #{dto.name}, '#')
</if>
<if test="dto.profession != null and dto.profession != null">
and profession like concat('%', #{dto.profession}, '%')
</if>
<if test="dto.createTimeMin != null and dto.createTimeMin != ''">
and create_time >= #{dto.createTimeMin}
</if>
<if test="dto.createTimeMax != null and dto.createTimeMax">
and create_time < #{dto.createTimeMax}
</if>
</where>
<if test="dto.orderByColumn != null and dto.orderByColumn != ''">
order by ${dto.orderByColumn} ${dto.isAsc}
</if>
</select>@Override
public PageResVO<UserVO> list1(UserDTO userDTO) {
Page<UserVO> page = new Page<>(userDTO.getPageNum(), userDTO.getPageSize());
Page<UserVO> list = this.baseMapper.list(page, userDTO);
return PageResVO.getBean(list);
}这种方式相对于Mybatis而言简化了分页操作,将分页交给了MP的page
XML+Wrapper
Page<UserVO> list1(Page<UserVO> page, @Param(Constants.WRAPPER) QueryWrapper wrapper);<select id="list1" resultType="com.yang.vo.UserVO">
select name, profession, age, status, create_time
from tb_user
<where>
<if test="ew.sqlSegment != null and ew.sqlSegment != ''">
${ew.sqlSegment}
</if>
</where>
</select>@Override
public PageResVO<UserVO> list1(UserDTO userDTO) {
Page<UserVO> page = new Page<>(userDTO.getPageNum(), userDTO.getPageSize());
QueryWrapper<UserDTO> wrapper = new QueryWrapper<>();
String orderBy = StringUtils.isBlank(userDTO.getIsAsc()) ? "" : userDTO.getIsAsc();
wrapper.like(StringUtils.isNotBlank(userDTO.getName()), "name", userDTO.getName())
.like(StringUtils.isNotBlank(userDTO.getProfession()), "profession", userDTO.getProfession())
.ge(Objects.nonNull(userDTO.getCreateTimeMin()), "create_time", userDTO.getCreateTimeMin())
.lt(Objects.nonNull(userDTO.getCreateTimeMax()), "create_time", userDTO.getCreateTimeMax())
.last(StringUtils.isNotBlank(userDTO.getOrderByColumn()),
Constant.ORDER_BY_BLANK + StringUtils.camelToUnderline(userDTO.getOrderByColumn()) + " " + orderBy);
Page<UserVO> list = this.baseMapper.list1(page, wrapper);
return PageResVO.getBean(list);该方法是xml负责需要查询的列,而wrapper负责查询条件的编写,不过在MP中我们可以使用wrapper.select() 列出需要的。
QueryWrapper<UserDTO> wrapper = new QueryWrapper<>();
wrapper.select("name", "profession", "create_time");由于wrapper条件中的列都是写死的,而且都是魔法值,不满足代码规范和后续修改维护,我们可以自定义一个方法来根据方法引用获取方法名。
wrapper
使用wrapper查询的结果为我们的entity实体类,所以我们还需要进行一次类型转换
public PageResVO<UserVO> list1(UserDTO userDTO) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
String orderBy = StringUtils.isBlank(userDTO.getIsAsc()) ? "" : userDTO.getIsAsc();
wrapper.like(StringUtils.isNotBlank(userDTO.getName()), User::getName, userDTO.getName())
.like(StringUtils.isNotBlank(userDTO.getProfession()), User::getProfession, userDTO.getProfession())
.ge(Objects.nonNull(userDTO.getCreateTimeMin()), User::getCreateTime, userDTO.getCreateTimeMin())
.lt(Objects.nonNull(userDTO.getCreateTimeMax()), User::getCreateTime, userDTO.getCreateTimeMax())
.last(StringUtils.isNotBlank(userDTO.getOrderByColumn()),
Constant.ORDER_BY_BLANK + com.baomidou.mybatisplus.core.toolkit.StringUtils.camelToUnderline(userDTO.getOrderByColumn()) + " " + orderBy);
IPage<User> page = this.baseMapper.selectPage(new Page<>(userDTO.getPageNum(), userDTO.getPageSize()), wrapper);
IPage<UserVO> userVOs = page.convert(u ->{
UserVO vo = new UserVO();
BeanUtils.copyProperties(u, vo);
return vo;
})
return PageResVO.getBean(userVOs, userVOs.getRecords());
}类型转换可以使用page自带的转换方法 convert 或者可以使用mapStruct
mapStruct的使用参考:MapStruct_夜光下丶的博客-CSDN博客
边栏推荐
- 循环语句综合练习
- Spearman's correlation coefficient
- Weak yen turns game consoles into "financial products" in Japan: scalpers make big profits
- 循环结构--while循环
- 利用二维数据学习纹理三维网格生成(CVPR 2020)
- 8年软件测试工程师的感悟:与薪资相匹配的永远是实力
- 配置mysql失败了,这是怎么回事呢?
- R language ggplot2 visualization: use the ggtexttable function of the ggpubr package to visualize tabular data (directly draw tabular graphs or add tabular data to images), use tbody_add_border to add
- LayaBox---TypeScript---三斜线指令
- windbg分析进程卡死
猜你喜欢

How to choose a truly "easy-to-use, high-performance" remote control software

MSYS2 QtCreator Clangd code analysis can not find mm_malloc.h problem remedy

利用二维数据学习纹理三维网格生成(CVPR 2020)

5G基础学习1、5G网络架构、网络接口及协议栈

记一次mysql查询慢的优化历程

Verilog's random number system task----$random

You Only Hypothesize Once: 用旋转等变描述子估计变换做点云配准(已开源)

Outsourced Student Management System Architecture Documentation

Why use BGP?

MySQL模糊查询性能优化
随机推荐
The heavyweights are coming!Spoilers for the highlights of the Alibaba Cloud Life Science and Intelligent Computing Summit
【面向校招】Golang面试题合集
You Only Hypothesize Once: 用旋转等变描述子估计变换做点云配准(已开源)
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法
LayaBox---TypeScript---Decorator
Hongxing, donate another million
学习笔记-支付宝支付
mysql清除binlog日志文件
38岁女儿不恋爱没有稳定工作老母亲愁哭
Shell脚本实现多选DNS同时批量解析域名IP地址(新更新)
一款优秀的中文识别库——ocr
程序员的浪漫七夕
配置mysql失败了,这是怎么回事呢?
npm ERR! 400 Bad Request - PUT xxx - Cannot publish over previously published version “1.0.0“.
MySql模糊查询大全
如何搭建威纶通触摸屏与S7-200smart之间无线PPI通信?
情景剧《重走长征路》上演
MSYS2 QtCreator Clangd code analysis can not find mm_malloc.h problem remedy
3年测试在职,月薪还不足2w,最近被裁员,用亲身经历给大家提个醒...
阿里CTO程立:阿里巴巴开源的历程、理念和实践