mybatis高级映射一对多查询实现代码
发布时间 - 2026-01-11 00:41:47 点击率:次1.需求分析:

在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息
2.sql语句实现
2.1确定主查询表:订单表
2.2确定关联查询表:用户表, 订单明细表
sql语句如下:
select orders.*, t_user.address, t_user.name, t_user.brithday, orderdetail.id orderdetail_id, orderdetail.orderid, orderdetail.itemsid from orders, t_user, orderdetail where orders.userid=t_user.id AND orderdetail.orderid=orders.id;
查询结果如下:
映射要求:
不能出现重复的订单信息
3.编码实现
在orders.java中添加属性,List<OrdersDetail> ordersDetails 。类比hibernate学习,代码如下:
public class Orders {
private int id;
private String note;
private Date dateTime;
private String number;
private int userId;
private User user;
private List<OrdersDetail> ordersDetails;//看这里
}
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders的ordersDetails集合中,从上面查询结果图中可以看出最终的订单信息将为2条(orders信息不重复),每个订单orders中的属性存储了该订所对应的订单明细。
4.编写mapper.java和mapper.xml文件
代码如下:
package com.djp.config.mapper;
import com.djp.pojo.Orders;
import com.djp.pojo.OrdersCustom;
import java.util.List;
public interface OrdersCustomMapper {
/**
* 查询订单关联查询用户信息和订单明细信息
*
* @return
*/
List<Orders> findOrderAndOrderDetailResultMap();
/**
* 查询订单关联查询用户信息
*
* @return
*/
List<OrdersCustom> findOrderUser() throws Exception;
/**
* 使用resultMap映射
*
* @return
* @throws RuntimeException
*/
List<Orders> findOrderUserResultMap() throws RuntimeException;
}
对于mapper.xml的解释加在了代码中 ,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.djp.config.mapper.OrdersCustomMapper">
<!--订单查询关联用户和订单明细的信息的resultMap-->
<resultMap id="orderAndOrderDetailResultMap" type="orders" extends="ordersUserResultMap">
<!--配置订单信息 使用继承下面的-->
<!--配置订单关联的用户信息 使用继承下面的-->
<!--配置订单关联的订单明细信息
一条订单关联查询出了多条明细,要使用collection进行映射
collection :对关联查询到多条记录映射到集合中
property:将关联查询到的多条记录映射到com.djp.pojo.Orders中的哪个属性
ofType:指定映射到list集合属性中的pojo的类型
-->
<collection property="ordersDetails" ofType="OrdersDetail">
<!--
id:订单明细的唯一标示
property:将订单明细的唯一标示映射到com.djp.pojo.OrdersDetail中的哪个属性
-->
<id column="orderdetail_id" property="id"/>
<result column="orderid" property="orderId"/>
<result column="itemsid" property="itemsId"/>
</collection>
</resultMap>
<!--查询订单明细关联查询用户信息和订单明细信息的statement-->
<select id="findOrderAndOrderDetailResultMap" resultMap="orderAndOrderDetailResultMap">
select
orders.*,
t_user.address,
t_user.name,
t_user.brithday,
orderdetail.id orderdetail_id,
orderdetail.orderid,
orderdetail.itemsid
from
orders,
t_user,
orderdetail
where
orders.userid=t_user.id AND orderdetail.orderid=orders.id
</select>
<!--订单查询关联用户的resultMap
将整个查询结果映射到com.djp.pojo.Orders中
-->
<resultMap id="ordersUserResultMap" type="com.djp.pojo.Orders">
<!--配置映射的订单信息
result:普通列
id:指定查询列中的唯一标示,订单信息中的唯一标示,如果有多个列组成多个唯一标示,配置多个id
column:订单信息的唯一标示
property:订单信息的唯一标示,列所映射到Orders中的哪个属性
-->
<id column="id" property="id"/>
<result column="note" property="note"/>
<result column="dateTime" property="dateTime"/>
<result column="number" property="number"/>
<result column="userId" property="userId"/>
<!--配置订单关联的用户信息
association:用于映射关联查询单个用户的信息
property:将要关联查询的用户信息映射到orders中的哪个属性
javaType:指定的类型,可以使用别名
-->
<association property="user" javaType="user">
<!--
id :关联查询用户的唯一标示
column:指定表示用户信息的列
property:对应user.java中的哪个属性
-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="pwd"/>
<result column="address" property="address"/>
<result column="brithday" property="brithday"/>
</association>
</resultMap>
<!-- 查询订单关联查询用户信息 使用resultMap-->
<select id="findOrderUserResultMap" resultMap="ordersUserResultMap">
select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
</select>
<!--查询订单关联查询用户信息-->
<select id="findOrderUser" resultType="OrdersCustom">
select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id
</select>
</mapper>
代码有点多,不怕得,下面的是之前的一对一的,注意继承至之前写好的resultMap。
5 写测试代码:
/**
* 查询订单关联查询用户信息和订单明细信息
*/
@Test
public void testFindOrderAndOrderDetailResultMap() {
try {
System.out.println("start.................");
//通过得到的SqlSessionFactory打开回话sqlSession
SqlSession sqlSession = SqlSessionFactory.openSession();
//通过会话得到用户的代理
OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper.class);
List<Orders> list = ordersCustomMapper.findOrderAndOrderDetailResultMap();
for (Orders item : list) {
System.out.println("订单+用户+订单明细:"+item);
}
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果如下:
从图中可看出我们需要的订单信息,关联查询出的用户信息,关联查询出的订单明细信息都出来了!
6 .总结
mybatis使用resultMap实现一对多查询用collection对关联查询出的多条记录映射到一个list集合中
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# mybatis
# 高级映射
# 映射
# 一对多
# MyBatis高级映射学习教程
# MyBatis高级映射和查询缓存
# Mybatis高级映射、动态SQL及获得自增主键的解析
# 基于mybatis高级映射多对多查询的实现
# javaMybatis映射属性
# 高级映射详解
# 解析Mybatis延迟加载问题
# MyBatis延迟加载与立即加载案例教程
# MyBatis高级映射ResultMap解决属性问题
# Mybatis中的延迟加载
# 以及原理分析
# MyBatis实现高级映射的示例代码
# 详解MyBatis延迟加载是如何实现的
# MyBatis高级映射及延迟加载的实现
# 多个
# 多条
# 查询结果
# 图中
# 的是
# 所对应
# 出了
# 可以使用
# 可以看出
# 一个问题
# 将为
# 会将
# 要使
# 写好
# 中会
# 大家多多
# 加在
# 级联
# 出来了
# number
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在局域网内绑定自建网站域名?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
如何破解联通资金短缺导致的基站建设难题?
七夕网站制作视频,七夕大促活动怎么报名?
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Laravel如何实现数据库事务?(DB Facade示例)
WEB开发之注册页面验证码倒计时代码的实现
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
nginx修改上传文件大小限制的方法
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
如何在 React 中条件性地遍历数组并渲染元素
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何在自有机房高效搭建专业网站?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
详解CentOS6.5 安装 MySQL5.1.71的方法
网站建设整体流程解析,建站其实很容易!
黑客如何利用漏洞与弱口令入侵网站服务器?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
如何在阿里云虚拟主机上快速搭建个人网站?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel如何实现用户注册和登录?(Auth脚手架指南)
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Android GridView 滑动条设置一直显示状态(推荐)
Laravel Session怎么存储_Laravel Session驱动配置详解
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel怎么调用外部API_Laravel Http Client客户端使用
如何快速登录WAP自助建站平台?
如何解决hover在ie6中的兼容性问题
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
香港服务器WordPress建站指南:SEO优化与高效部署策略
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
上一篇:yii怎么设置默认访问首页
上一篇:yii怎么设置默认访问首页

