mybatis left join 一对多 分页查询
时间: 2024-12-25 09:19:01 浏览: 11
### MyBatis 中实现左连接一对多分页查询
在处理数据库查询时,特别是在涉及复杂关系的数据表之间执行操作时,MyBatis 提供了强大的功能来简化开发人员的工作。对于左连接(`LEFT JOIN`)的一对多分页查询场景,可以采用如下方式:
#### SQL 查询语句设计
为了有效地获取父实体及其关联子实体列表并应用分页逻辑,在构建 `SELECT` 语句时需注意几点事项:
- 使用外键约束定义两个表之间的联系;
- 利用聚合函数如 `GROUP_CONCAT()` 或者窗口函数根据具体需求收集相关记录;
- 应用合适的索引来优化性能。
针对一对多的关系模型,假设存在两张表分别为订单(`orders`)和订单项(`order_items`),其中每条订单可能对应多个订单项,则可以通过下面的方式编写SQL:
```sql
SELECT o.*, GROUP_CONCAT(oi.item_id) AS item_ids FROM orders o
LEFT JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.status = 'active' AND (o.customer_name LIKE '%${searchText}%' OR EXISTS (
SELECT 1 FROM order_items WHERE order_id=o.order_id AND product_name LIKE '%${searchText}%'
))
ORDER BY o.create_time DESC LIMIT #{start},#{size}
```
此段代码实现了基于关键词模糊匹配的条件过滤以及按创建时间降序排列的结果集截取[^1]。
#### Mapper XML 文件配置
接着是在Mapper文件里声明相应的接口方法签名,并映射上述自定义SQL到Java对象上。这里展示了一个简单的例子用于说明如何设置resultMap属性从而完成复杂的嵌套结构转换工作:
```xml
<resultMap id="OrderWithItemsResult" type="com.example.Order">
<id property="orderId" column="order_id"/>
<!-- other columns mapping -->
<collection property="items" ofType="com.example.Item">
<id property="itemId" column="item_id"/>
<!-- other Item properties mappings -->
</collection>
</resultMap>
<select id="findOrdersByPage" resultMap="OrderWithItemsResult" parameterType="map">
${selectSqlString}
</select>
```
此处利用了 `<collection>` 标签指定集合类型的成员变量名及元素类别;而 `${}` 表达式的运用允许动态拼接部分SQL片段以适应不同上下文环境下的调用需求[^2]。
#### Java Service 层封装
最后一步就是在服务层内组装好必要的参数并通过调用DAO层暴露出来的API达成最终目的——即返回带有分页信息的对象实例给控制器层面做进一步渲染呈现:
```java
public Page<Order> findOrderByPage(String searchText, int page, int size){
Map<String,Object> params=new HashMap<>();
String selectSql= "SELECT o.*, GROUP_CONCAT(DISTINCT oi.item_id SEPARATOR ',') as items";
params.put("selectSql",selectSql);
params.put("searchText",searchText);
params.put("start",(page-1)*size);
params.put("size",size);
List<Order> list=mapper.findOrdersByPage(params);
long total=mapper.countTotalRecords(searchText); // 另一个单独的count查询
return new Page<>(list,total,page,size);
}
```
以上便是有关于MyBatis框架下实施带有限制条件的左联结一对多模式并且支持分页特性的整体解决方案概述[^3]。
阅读全文