mybatis 13: 一对多关联查询
业务背景
根据客户id查询客户基本信息,以及客户存在的订单信息
两张数据表
- 客户表
- 订单表
实体类
- 客户实体类:Customer
private Integer id;
private String name;
private Integer age;
//封装存在的订单信息
List<Order> orders = new ArrayList<>();
- 订单实体类:Order
private Integer id;
private String orderNumber;
private Double orderPrice;
CustomerMapper.java接口
//根据客户id查询客户基本信息,以及客户存在的订单信息
Customer getCustomerById(Integer id);
CustomerMapper.xml映射文件
<!--
//根据客户id查询客户基本信息,以及客户存在的订单信息
Customer getCustomerById(Integer id);
Customer实体类:
private Integer id;
private String name;
private Integer age;
List<Order> orders = new ArrayList<>();
Order实体类:
private Integer id;
private String orderNumber;
private Double orderPrice;
-->
<!-- 查询结果的映射规则-->
<resultMap id="customerMap" type="customer">
<!-- 主键映射 -->
<id property="id" column="cid"/>
<!-- 非主键映射 -->
<result property="name" column="name"/>
<result property="age" column="age"/>
<!-- 定义数据容器的映射规则 -->
<collection property="orders" ofType="order">
<!-- 容器中元素的映射规则 -->
<id property="id" column="oid"/>
<result property="orderNumber" column="orderNumber"/>
<result property="orderPrice" column="orderPrice" />
</collection>
</resultMap>
<!-- 核心标签 -->
<select id="getCustomerById" parameterType="int" resultMap="customerMap">
select
c.id cid, name, age, o.id oid, orderNumber, orderPrice, customer_id
from
customers c
left join
orders o
on
c.id=o.customer_id
where
c.id=#{id}
</select>
测试
//SqlSession对象
SqlSession sqlSession;
//获取CustomerMapper的mybatis动态代理对象
CustomerMapper customerMapper;
//获取SqlSession
@Before
public void getSqlSession() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession
sqlSession = factory.openSession();
//获取各Mapper接口的mybatis动态代理对象
customerMapper = sqlSession.getMapper(CustomerMapper.class);
}
//归还SqlSession
@After
public void closeSession(){
sqlSession.close();
}
//测试查询标签
@Test
public void testGetCustomerById(){
Customer customer = customerMapper.getCustomerById(1);
System.out.println(customer);
}
结果
==> Preparing:
select
c.id cid, name, age, o.id oid, orderNumber, orderPrice, customer_id
from
customers c
left join
orders o
on
c.id=o.customer_id
where
c.id=?
==> Parameters: 1(Integer)
<== Columns: cid, name, age, oid, orderNumber, orderPrice, customer_id
<== Row: 1, 荷包蛋, 22, 11, 20, 22.22, 1
<== Row: 1, 荷包蛋, 22, 12, 60, 16.66, 1
<== Total: 2
Customer{id=1,
name='荷包蛋',
age=22,
orders=[
Order{id=11, orderNumber='20', orderPrice=22.22},
Order{id=12, orderNumber='60', orderPrice=16.66}
]
}
结果分析
- sql语句的查询结果
<== Columns: cid, name, age, oid, orderNumber, orderPrice, customer_id
<== Row: 1, 荷包蛋, 22, 11, 20, 22.22, 1
<== Row: 1, 荷包蛋, 22, 12, 60, 16.66, 1
<== Total: 2
- 实际注入到实体类中的数据
Customer{id=1,
name='荷包蛋',
age=22,
orders=[
Order{id=11, orderNumber='20', orderPrice=22.22},
Order{id=12, orderNumber='60', orderPrice=16.66}
]
}
- mybatis框架对查询结果会自动去重,按照查询结果的映射规则,完成数据向实体类的注入操作
- 将"1, 荷包蛋, 22 "分别注入到实体类Customer的前三个简单属性中,只注入一组
- 将关联查询到的两条订单数据分别注入到Order实体类中的对应属性中
- 并将Order对象封装到集合中
- 最后将Customer的三个属性值和orders集合封装成一个Customer对象返回
- 由于在数据映射标签中没有指明对customer_id的映射规则,所以在查询时会显示该字段数据,但是并没有被注入到实体类中
注意
在一对多关联查询时,注意根据实际业务需求选择合适的连接查询语句,在本例中选择:左外连接
如果选择内连接,当用户未下订单时,查询不到用户信息
- 外连接查询结果:无订单信息,且用户信息可以正常显示
==> Preparing: select c.id cid, name, age, o.id oid, orderNumber, orderPrice, customer_id from customers c left join orders o on c.id=o.customer_id where c.id=?
==> Parameters: 3(Integer)
<== Columns: cid, name, age, oid, orderNumber, orderPrice, customer_id
<== Row: 3, 小张, 24, null, null, null, null
<== Total: 1
Customer{id=3, name='小张', age=24, orders=[]}
- 内连接查询结果:无订单信息,则用户信息也无法正常显示
==> Preparing: select c.id cid, name, age, o.id oid, orderNumber, orderPrice, customer_id from customers c join orders o on c.id=o.customer_id where c.id=?
==> Parameters: 3(Integer)
<== Total: 0
null
mybatis 13: 一对多关联查询的更多相关文章
- MyBatis:一对多关联查询
MyBatis从入门到放弃四:一对多关联查询 前言 上篇学习了一对一关联查询,这篇我们学习一对多关联查询.一对多关联查询关键点则依然是配置resultMap,在resultMap中配置collecti ...
- mybatis collection 一对多关联查询,单边分页的问题总结!
若想直接通过sql实现多级关联查询表结构得有2 个必不可少的字段:id ,parentId,levelId id:主键id, parentId:父id levelId:表示第几级(表本身关联查询的时候 ...
- MyBatis初级实战之六:一对多关联查询
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 7.mybatis一对多关联查询
和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...
- MyBatis从入门到放弃四:一对多关联查询
前言 上篇学习了一对一关联查询,这篇我们学习一对多关联查询.一对多关联查询关键点则依然是配置resultMap,在resultMap中配置collection属性,别忽略了ofType属性. 搭建开发 ...
- MyBatis关联查询,一对多关联查询
实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collect ...
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- MyBatis多对一,一对多,多对多,一对多关联查询
一.Person实体类 1 public class Person { 2 private Integer personId; 3 private String name; 4 private Int ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
随机推荐
- 【仿真】Carla介绍与基本使用 [1] (附代码 基础版)
0. 参考与前言 主要介绍无人驾驶的仿真环境CARLA,开源社区维护,以下为相关参考链接: Carla官方文档 建议后续找的时候 先按好版本号,有些功能/api 是新版本里有的 Carla官方gith ...
- 深入浅出Nginx实战与架构
本文主要内容如下(让读者朋友们深入浅出地理解Nginx,有代码有示例有图): 1.Nginx是什么? 2.Nginx具有哪些功能? 3.Nginx的应用场景有哪些? 4.Nginx的衍生生态有哪些? ...
- CabloyJS也有工作流引擎了,是你想要的吗?
前言 众所周知,NodeJS作为后端开发语言和运行环境,样样都好,就差一个NodeJS工作流引擎.CabloyJS 4.0重点开发了NodeJS工作流引擎,并作为内置的基础核心模块,近一步拓展了Nod ...
- JavaScript之创建八个对象过520
马上又到了一年一度的520了,程序猿们赶紧创建对象过520吧!!! JavaScript创建对象的几种方式: 一:字面量方式: var obj = {name: '程序猿'}; 二:通过new操作符: ...
- Windows系统重置用户登录密码
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年8月23日. 方法一.使用带有密码恢复功能的PE盘 买一张 PE光盘 或 自制PE启动盘,这里推荐微PE. 准备 ...
- Vmware 10~16激活码/序列号 汇总
Vmware 16 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 ...
- 一文带你搞懂 JWT 常见概念 & 优缺点
在 JWT 基本概念详解这篇文章中,我介绍了: 什么是 JWT? JWT 由哪些部分组成? 如何基于 JWT 进行身份验证? JWT 如何防止 Token 被篡改? 如何加强 JWT 的安全性? 这篇 ...
- Xilinx DMA的几种方式与架构
DMA是direct memory access,在FPGA系统中,常用的几种DMA需求: 1. 在PL内部无PS(CPU这里统一称为PS)持续干预搬移数据,常见的接口形态为AXIS与AXI,AXI与 ...
- Python基础学习笔记_01
Python的介绍 1989年圣诞节创造,1991年正真出生,目前更新到3.0版本 具有最庞大的"代码库",人称"胶水语言",无所不能 一种跨平台的计算机程序设 ...
- SAP OOALV- 合计
TYPES: BEGIN OF ty_mara, srno LIKE adrc-name1, " Storing the total text matnr LIKE mara-matnr, ...