业务背景

根据订单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: 多对一关联查询的更多相关文章

  1. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  2. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  3. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  4. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  5. 【Mybatis】MyBatis之表的关联查询(五)

    本章介绍Mybatis之表的关联查询 一对一关联 查询员工信息以及员工的部门信息 1.准备表employee员工表,department部门表 CREATE TABLE `employee` ( `i ...

  6. Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理

    找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:

  7. mybatis多对多关联查询

    多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...

  8. mybatis实现多表一对一,一对多,多对多关联查询

    原文:https://blog.csdn.net/m0_37787069/article/details/79247321 1.一对一关键字:association作用:针对pojo对象属性的映射  ...

  9. MyBatis 实践 -动态SQL/关联查询

    MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...

随机推荐

  1. Python搜索书名获取整本资源_笔趣阁

    前言 偶然一天把某项目文档传到手机上,用手机自带的阅读器方便随时拿出来查阅.看着我那好久没点开的阅读器,再看着书架上摆着几本不知道是多久之前导入的小说. 闭上眼,我仿佛看到那时候的自己.侧躺着缩在被窝 ...

  2. “极简”创建 github page 并设置域名

    最简单最详细的,创建 github page 并设置域名,没有多余的步骤,并且多图,对新手特别友好 尝试用 github page 创建博客,并设置独立域名.网上找了许多教程,都太复杂.自己的创建过程 ...

  3. k8s中label和label selector的基本概念及使用方法

    1.概述 在k8s中,有一个非常核心的概念,就是label(标签),以及对label的使用,label selector. 本文档中,我们就来看看:1.什么是标签,2.如何定义标签,3.什么是标签选择 ...

  4. 商户编号[Merchant Id]是什么

    1. Merchant Id是什么 2. Merchant Id 是有哪几个部分构成的 2.1 收单机构代码 2.2 商户地区代码 2.3 Merchant Category Code(MCC) 本文 ...

  5. C#中的CSV文件读写

    目录 CSV文件标准 文件示例 RFC 4180 简化标准 读写CSV文件 使用CsvHelper 使用自定义方法 基于简化标准的写CSV文件 使用TextFieldParser解析CSV文件 使用正 ...

  6. Error: $injector:modulerr Module Error

    Failed to instantiate module app due to://实例化失败 Error: [$injector:modulerr] http://errors.angularjs. ...

  7. Pytorch Tensor 维度的扩充和压缩

    维度扩展 x.unsqueeze(n) 在 n 号位置添加一个维度 例子: import torch x = torch.rand(3,2) x1 = x.unsqueeze(0) # 在第一维的位置 ...

  8. Linux 任务计划管理

    在某个时间点执行一次任务 at工具 作用:用于执行一次性任务,需要指定执行的时间. at工具来源于at软件包. 依赖与atd服务,需要启动才能实现at任务.#通过这个守护进程见监控at的相关内容 #选 ...

  9. 【实操填坑】在树莓派上编译 EtherCAT IgH Master 主站程序

    官网下载地址:https://etherlab.org/download/ethercat/  (可list查看文件列表)https://etherlab.org/download/ethercat/ ...

  10. EFCore高级Saas系统下一个DbContext如何支持多数据库迁移

    EFCore高级玩法单DbContext支持多数据库迁移 前言 随着系统的不断开发和迭代默认的efcore功能十分强大,但是随着Saas系统的引进efcore基于表字段的多租户模式已经非常完美了,但是 ...