mybatis 14: 多对一关联查询
业务背景
根据订单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;
//封装订单所属的客户的基本信息
Customer customer = new Customer();
CustomerMapper.java接口
//根据订单id查询订单的信息,以及该订单所属的客户的基本信息
Order getOrderById(Integer id);
CustomerMapper.xml映射文件
<!--
//根据订单id查询订单的信息,以及该订单所属的客户的基本信息
Order getOrderById(Integer id);
Order实体类:
private Integer id;
private String orderNumber;
private Double orderPrice;
Customer customer = new Customer();
Customer实体类:
private Integer id;
private String name;
private Integer age;
-->
<resultMap id="orderMap" type="order">
<!-- 主键映射 -->
<id property="id" column="oid"/>
<!-- 非主键映射 -->
<result property="orderNumber" column="orderNumber"/>
<result property="orderPrice" column="orderPrice" />
<!-- 关于Customer实体类的映射 -->
<association property="customer" javaType="customer">
<id property="id" column="cid"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</association>
</resultMap>
<select id="getOrderById" parameterType="int" resultMap="orderMap">
select
o.id oid, orderNumber, orderPrice, customer_id, c.id cid, name, age
from
orders o
join
customers c
on
o.customer_id = c.id
where
o.id=#{id}
</select>
- 关于< association >中对Customer实体类的映射
- 这里虽然两个属性的值都是customer,但是意义不同
- property="customer":是因为Order实体类的一个成员变量的名称为customer,指明该标签的映射规则对应到哪个成员变量
- javaType="customer":是因为该成员变量的类型是Customer,由于我们在SqlMapConfig.xml为实体类注册了包级别名,这里用customer指代此类型
<!-- 关于Customer实体类的映射 -->
<association property="customer" javaType="customer">
<id property="id" column="cid"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</association>
测试
//SqlSession对象
SqlSession sqlSession;
//获取OrderMapper的mybatis动态代理对象
OrderMapper orderMapper;
//获取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动态代理对象
orderMapper = sqlSession.getMapper(OrderMapper.class);
}
//归还SqlSession
@After
public void closeSession(){
sqlSession.close();
}
//测试:根据订单id查询订单的信息,以及该订单所属的客户的基本信息
@Test
public void testGetOrderById(){
Order order = orderMapper.getOrderById(11);
System.out.println(order);
}
结果
==> Preparing:
select
o.id oid, orderNumber, orderPrice, customer_id, c.id cid, name, age
from
orders o
join
customers c
on
o.customer_id = c.id
where
o.id=?
==> Parameters: 11(Integer)
<== Columns: oid, orderNumber, orderPrice, customer_id, cid, name, age
<== Row: 11, 20, 22.22, 1, 1, 荷包蛋, 22
<== Total: 1
Order{id=11, orderNumber='20', orderPrice=22.22, customer=Customer{id=1, name='荷包蛋', age=22, orders=[]}}
结果分析
- sql语句的查询结果
<== Columns: oid, orderNumber, orderPrice, customer_id, cid, name, age
<== Row: 11, 20, 22.22, 1, 1, 荷包蛋, 22
<== Total: 1
- 实际注入到实体类中的数据
Order{id=11,
orderNumber='20',
orderPrice=22.22,
customer=Customer{
id=1,
name='荷包蛋',
age=22,
orders=[]
}
}
注意
- 由于每个订单必定对应一个客户,所以本例中连接语句使用内连接也正确
- 本例并未查询客户对应的订单信息,所以订单对应的客户的自己的订单信息都是空
- 一对一和多对多关联查询,可由一对多和多对一查询推导出
mybatis 14: 多对一关联查询的更多相关文章
- mybatis实战教程二:多对一关联查询(一对多)
多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...
- MyBatis 中两表关联查询MYSQL (14)
MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- NHibernate教程(11)--多对多关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- 【Mybatis】MyBatis之表的关联查询(五)
本章介绍Mybatis之表的关联查询 一对一关联 查询员工信息以及员工的部门信息 1.准备表employee员工表,department部门表 CREATE TABLE `employee` ( `i ...
- Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理
找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:
- mybatis多对多关联查询
多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...
- mybatis实现多表一对一,一对多,多对多关联查询
原文:https://blog.csdn.net/m0_37787069/article/details/79247321 1.一对一关键字:association作用:针对pojo对象属性的映射 ...
- MyBatis 实践 -动态SQL/关联查询
MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...
随机推荐
- 可变参数——JavaSE基础
可变参数 方法声明中,在指定参数类型后加一个省略号...即可声明可变参数 可变参数必须是参数列表的最后一个参数 声明 public void test(int... i){ System.out.pr ...
- VmWare安装Centos8注意事项
VmWare安装Centos8注意事项 1.需选择稍后安装操作系统 2.选择操作系统版本 3.修改虚拟机配置 4.配置完成点击开启虚拟机(注意要将鼠标放在屏幕中央,点击一下后才能使用上下键进行选择) ...
- Docker容器配置远程登录
Docker容器配置远程登录 前言 docker 的网络模式主要有三种,bridge.host.none: pridge是docker安装后自动创建的虚拟网卡,创建容器时默认使用此模式. host是指 ...
- Java基础-JVM篇
1.1 .线程 这里所说的线程指程序执行过程中的一个线程实体.JVM 允许一个应用并发执行多个线程.Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系.当线程本地存储. ...
- UiPath鼠标操作图像的介绍和使用
一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对图像的操作在UiPath中的使 ...
- 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的
☞☞☞ 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的 ☜☜☜ ○○○○○○○○○○○○○○○ 大家好,又见面了~ kafka作为一种高吞吐量的分布式发布订阅消息系统,在业务系统中被广泛 ...
- RS485 MODBUS RTU通信协议
1.RS485接口标准 RS485由RS232和RS422发展而来,弥补了抗干扰能力差.通信距离短.速率低的缺点,增加了多点.双向通信能力,即允许多个发送器连接在同一条主线上,同时增加了发送器的驱动能 ...
- Homebrew安装(macos)
参照大佬的博客文章:https://zhuanlan.zhihu.com/p/111014448 OSX 将下面命令复制到终端执行 /bin/zsh -c "$(curl -fsSL htt ...
- python+tkinter 的布局
from tkinter import * win = Tk() win.title("布局") # #窗口标题 win.geometry("600x500+200+20 ...
- 事务_基本演示和事务_默认自动提交&手动提交
事务的基本介绍 概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作: 开启事务:start transaction; 回滚:rollback; 提交:co ...