当前位置:网站首页>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博客
边栏推荐
- LayaBox---TypeScript---Three slash instructions
- 博云入选Gartner中国DevOps代表厂商
- ECCV22|PromptDet:无需手动标注,迈向开放词汇的目标检测
- Alibaba CTO Cheng Li: Alibaba Open Source History, Concept and Practice
- 如何安装dosbox(pycharm详细安装教程)
- R language ggplot2 visualization: use the ggbarplot function of the ggpubr package to visualize the horizontal column chart (bar chart), use the orientation parameter to set the column chart to be tra
- Shell脚本实现多选DNS同时批量解析域名IP地址(新更新)
- 21天学习挑战赛--第一天打卡(屏幕密度)
- MySQL百万数据优化总结 一
- 字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....
猜你喜欢
随机推荐
突破边界,华为存储的破壁之旅
记一次mysql查询慢的优化历程
qq邮箱日发5万邮件群发技术(qq邮箱怎样定时发送邮件)
logo 图标(php图片加文字水印)
LayaBox---TypeScript---声明合并
Jay Chou's new song is released, crawl the "Mojito" MV barrage, and see what the fans have to say!
外包学生管理系统架构文档
利用二维数据学习纹理三维网格生成(CVPR 2020)
Hello, my new name is "Bronze Lock/Tongsuo"
3年测试在职,月薪还不足2w,最近被裁员,用亲身经历给大家提个醒...
LayaBox---TypeScript---Symbols
从众多接口中脱颖而出的最稳定的接口——淘宝详情api
TimerTask(addin timer语音)
currentstyle 织梦_dede currentstyle属性完美解决方案
3 d laser slam: LeGO - LOAM - ground point extracting method and the analysis of the code
众城优选系统开发功能
周杰伦新歌发布,爬取《Mojito》MV弹幕,看看粉丝们都说的些啥!
Rear tube implements breadcrumb function
深度学习100例 —— 卷积神经网络(CNN)实现mnist手写数字识别
SVN如何删除文件名包含空格的文件









