系列文章目录 【Mybatis-Plus|实例(MyBatis-Plus自定义联表分页查询-动态sql实现)】第一篇:实例:MyBatis-Plus自定义分页查询
第二篇:实例:MyBatis-Plus自定义联表分页查询
第三篇:实例:MyBatis-Plus自定义联表分页查询-动态sql实现
文章目录
- 系列文章目录
- 一、简介
- 二、关键代码
- 三、总结
一、简介 高级检索所检索的项中,往往会存在对若干关联表的检索。
- 拿具体的业务来举个例子
派车单(worksheet)关联若干发货单(delivery)、车辆(vehicle)
派车单高级检索功能,名称、派车日期等检索项在派车表内,但以所配送的具体产品编号(在delivery_line中)作为检索项时,就必须做相应联表查询。
联表查询简单,但高级检索中可能不仅仅只需要做一次联表查询(例中,还可能同时检索车辆表中的信息)。此时,如何手写sql来满足任何情况下的查询呢?mybatis的动态sql可以!
文章图片
二、关键代码
- WorksheetServiceImpl.java:
/**
* 派车单高级检索
* @param param 检索项
* @return
*/
public IPage queryWorksheet(SlWorksheetQueryExeParam param) throws Exception {
Page page1 = new Page<>(param.getPage(), param.getPagesize());
return worksheetMapper.selectPageCusNew(page1, param);
}
- WorksheetMapper.java:
/**
* 派车单高级检索
* @param page1 分页对象
* @param param 检索项
* @return
*/
IPage selectPageCusNew(
Page page1,
@Param("qryPm") SlWorksheetQueryExeParam param
);
- WorksheetMapper.xml:
否则,直接指定结果类就好。用
resultType="com.xxxxx.api.model.WorksheetDetailsBean"
代替 resultMap="worksheetWithStoreAndSkuNum"
id="selectPageCusNew" resultMap="worksheetWithStoreAndSkuNum">
SELECT DISTINCT w.* FROM sl.sl_worksheet w
INNER JOIN sl.sl_vehicle v
ON v.delete_time IS NULL AND w.vehicle_id = v.id AND v.license LIKE '%${qryPm.vehicleNo}%'
INNER JOIN sl.sl_delivery dly
ON dly.delete_time IS NULL AND w.name = dly.worksheet_no
INNER JOIN sl.sl_delivery_to_line d2l
ON d2l.delete_time IS NULL AND dly.id = d2l.delivery_id
INNER JOIN sl.sl_delivery_line dl
ON dl.delete_time IS NULL AND d2l.line_id = dl.id
AND dl.code LIKE '%${qryPm.productCode}%'
AND dl.name LIKE '%${qryPm.productName}%'
WHERE w.delete_time IS NULL AND w.oid = #{qryPm.oid}
AND w.rostering_id = #{qryPm.rosteringId}
AND w.status = #{qryPm.state}
AND w.handler_partner_id IN
#{handlerPid}
AND w.create_time BETWEEN #{qryPm.startCreateTime} AND #{qryPm.endCreateTime}
AND w.name LIKE '%${qryPm.worksheetName}%'
ORDER BY w.create_time DESC, w.id DESC
通过if标签添加每一项检索
三、总结
- xml自定义sql中,通过mybatis的动态sql(标签)判断是否需要联表查询。有两处联表查询,分别检索派车单关联的车辆及配送产品。
- 上述实例联表查询的结果会产生重复问题,需使用
DISTINCT w.*
去重。
当然,如非此例的针对派车单的查询,无需去重。
文章图片
- 此例中,动态sql的意义在于处理复杂的高级检索功能、提供统一的对外接口
MyBatis相关教程:
MyBatis教程
MyBatis-Plus官方文档
推荐阅读
- Mybatis-Plus|实例(MyBatis-Plus自定义分页查询)
- ?后端|【MyBatis】ResultMap自定义映射
- 笔记|Mybatis---ResultMap自定义映射规则
- mybatis|mybatis-plus-自定义模板
- MyBatis使用resultMap自定义映射规则与关联映射
- Mybatis|Mybatis-Plus入门(Mapper CRUD接口)
- mybatis|Mybatis-plus的Mapper CRUD 接口查询数据错误
- java|Mybatis-Plus通用Mapper CRUD之select
- #springboot|springboot通过bean连接MySQL数据库