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 对查询条件进行判断,如果输入参数不为空才进行查询条 ...
随机推荐
- Excel导表工具-开源
功能 支持int.float.bool.string基础类型 支持数组 支持kv 支持枚举 支持unity类型vector3,vector2,color 自动生成csharp类 单个excel中多个s ...
- Java到底是解释型还是编译型语言
Java到底是解释型还是编译型语言? 定义 回答这个问题,我们首先来看下概念: 开发人员编写代码,语言是人类可理解的方式,是具有语义的,然而计算机无法理解和执行,因此需要做一层转换. 解释型语言: 运 ...
- MTK 平台sensor arch 介绍-scp
架构介绍 路径:vendor/mediatek/proprietary/tinysys/scp 1.[build]编译相关 2.[driver]scp 的driver,I2C,power,eint 3 ...
- Java 多线程共享模型之管程(上)
主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束.有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束. packag ...
- React + Typescript领域初学者的常见问题和技巧
React + Typescript领域初学者的常见问题和技巧 创建一个联合类型的常量 Key const NAME = { HOGE: "hoge", FUGA: "f ...
- vue大型电商项目尚品汇(后台篇)day03
今天把平台属性的管理基本完成了,后台管理做到现在基本也开始熟悉,确实就是对ElementUI的一个熟练程度. 一.平台属性管理 1.动态展示数据 先把接口弄好,应该在第三级标题选择后进行发请求 静态页 ...
- git stash 的一次惊心动魄的误删操作
git stash 的一次惊心动魄的误删操作 简介:行走在互联网最低端的小熊 问题--源起: 小熊和所有混迹在互联网中的开发一样,公司里面用git来管理项目,由于可能经常有几个问题要开发,要频繁在多分 ...
- 由ASP.NET Core根据路径下载文件异常引发的探究
前言 最近在开发新的项目,使用的是ASP.NET Core6.0版本的框架.由于项目中存在文件下载功能,没有使用类似MinIO或OSS之类的分布式文件系统,而是下载本地文件,也就是根据本地文件路径进行 ...
- 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾
「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...
- NC24840 [USACO 2009 Mar S]Look Up
NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...