业务背景

根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息)

两张数据表

  • 客户表

  • 订单表

实体类

  • 客户实体类:Customer
  1. private Integer id;
  2. private String name;
  3. private Integer age;
  4. //封装客户存在的订单信息
  5. List<Order> orders = new ArrayList<>();
  • 订单实体类:Order
  1. private Integer id;
  2. private String orderNumber;
  3. private Double orderPrice;
  4. //封装订单所属的客户的基本信息
  5. Customer customer = new Customer();

CustomerMapper.java接口

  1. //根据订单id查询订单的信息,以及该订单所属的客户的基本信息
  2. Order getOrderById(Integer id);

CustomerMapper.xml映射文件

  1. <!--
  2. //根据订单id查询订单的信息,以及该订单所属的客户的基本信息
  3. Order getOrderById(Integer id);
  4. Order实体类:
  5. private Integer id;
  6. private String orderNumber;
  7. private Double orderPrice;
  8. Customer customer = new Customer();
  9. Customer实体类:
  10. private Integer id;
  11. private String name;
  12. private Integer age;
  13. -->
  14. <resultMap id="orderMap" type="order">
  15. <!-- 主键映射 -->
  16. <id property="id" column="oid"/>
  17. <!-- 非主键映射 -->
  18. <result property="orderNumber" column="orderNumber"/>
  19. <result property="orderPrice" column="orderPrice" />
  20. <!-- 关于Customer实体类的映射 -->
  21. <association property="customer" javaType="customer">
  22. <id property="id" column="cid"/>
  23. <result property="name" column="name"/>
  24. <result property="age" column="age"/>
  25. </association>
  26. </resultMap>
  27. <select id="getOrderById" parameterType="int" resultMap="orderMap">
  28. select
  29. o.id oid, orderNumber, orderPrice, customer_id, c.id cid, name, age
  30. from
  31. orders o
  32. join
  33. customers c
  34. on
  35. o.customer_id = c.id
  36. where
  37. o.id=#{id}
  38. </select>
  • 关于< association >中对Customer实体类的映射

    • 这里虽然两个属性的值都是customer,但是意义不同
    • property="customer":是因为Order实体类的一个成员变量的名称为customer,指明该标签的映射规则对应到哪个成员变量
    • javaType="customer":是因为该成员变量的类型是Customer,由于我们在SqlMapConfig.xml为实体类注册了包级别名,这里用customer指代此类型
  1. <!-- 关于Customer实体类的映射 -->
  2. <association property="customer" javaType="customer">
  3. <id property="id" column="cid"/>
  4. <result property="name" column="name"/>
  5. <result property="age" column="age"/>
  6. </association>

测试

  1. //SqlSession对象
  2. SqlSession sqlSession;
  3. //获取OrderMapper的mybatis动态代理对象
  4. OrderMapper orderMapper;
  5. //获取SqlSession
  6. @Before
  7. public void getSqlSession() throws IOException {
  8. //读取核心配置文件
  9. InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
  10. //创建SqlSessionFactory对象
  11. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
  12. //获取SqlSession
  13. sqlSession = factory.openSession();
  14. //获取各Mapper接口的mybatis动态代理对象
  15. orderMapper = sqlSession.getMapper(OrderMapper.class);
  16. }
  17. //归还SqlSession
  18. @After
  19. public void closeSession(){
  20. sqlSession.close();
  21. }
  22. //测试:根据订单id查询订单的信息,以及该订单所属的客户的基本信息
  23. @Test
  24. public void testGetOrderById(){
  25. Order order = orderMapper.getOrderById(11);
  26. System.out.println(order);
  27. }

结果

  1. ==> Preparing:
  2. select
  3. o.id oid, orderNumber, orderPrice, customer_id, c.id cid, name, age
  4. from
  5. orders o
  6. join
  7. customers c
  8. on
  9. o.customer_id = c.id
  10. where
  11. o.id=?
  12. ==> Parameters: 11(Integer)
  13. <== Columns: oid, orderNumber, orderPrice, customer_id, cid, name, age
  14. <== Row: 11, 20, 22.22, 1, 1, 荷包蛋, 22
  15. <== Total: 1
  16. Order{id=11, orderNumber='20', orderPrice=22.22, customer=Customer{id=1, name='荷包蛋', age=22, orders=[]}}

结果分析

  • sql语句的查询结果
  1. <== Columns: oid, orderNumber, orderPrice, customer_id, cid, name, age
  2. <== Row: 11, 20, 22.22, 1, 1, 荷包蛋, 22
  3. <== Total: 1
  • 实际注入到实体类中的数据
  1. Order{id=11,
  2. orderNumber='20',
  3. orderPrice=22.22,
  4. customer=Customer{
  5. id=1,
  6. name='荷包蛋',
  7. age=22,
  8. orders=[]
  9. }
  10. }

注意

  • 由于每个订单必定对应一个客户,所以本例中连接语句使用内连接也正确
  • 本例并未查询客户对应的订单信息,所以订单对应的客户的自己的订单信息都是空
  • 一对一和多对多关联查询,可由一对多和多对一查询推导出

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. Excel导表工具-开源

    功能 支持int.float.bool.string基础类型 支持数组 支持kv 支持枚举 支持unity类型vector3,vector2,color 自动生成csharp类 单个excel中多个s ...

  2. Java到底是解释型还是编译型语言

    Java到底是解释型还是编译型语言? 定义 回答这个问题,我们首先来看下概念: 开发人员编写代码,语言是人类可理解的方式,是具有语义的,然而计算机无法理解和执行,因此需要做一层转换. 解释型语言: 运 ...

  3. MTK 平台sensor arch 介绍-scp

    架构介绍 路径:vendor/mediatek/proprietary/tinysys/scp 1.[build]编译相关 2.[driver]scp 的driver,I2C,power,eint 3 ...

  4. Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束.有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束. packag ...

  5. React + Typescript领域初学者的常见问题和技巧

    React + Typescript领域初学者的常见问题和技巧 创建一个联合类型的常量 Key const NAME = { HOGE: "hoge", FUGA: "f ...

  6. vue大型电商项目尚品汇(后台篇)day03

    今天把平台属性的管理基本完成了,后台管理做到现在基本也开始熟悉,确实就是对ElementUI的一个熟练程度. 一.平台属性管理 1.动态展示数据 先把接口弄好,应该在第三级标题选择后进行发请求 静态页 ...

  7. git stash 的一次惊心动魄的误删操作

    git stash 的一次惊心动魄的误删操作 简介:行走在互联网最低端的小熊 问题--源起: 小熊和所有混迹在互联网中的开发一样,公司里面用git来管理项目,由于可能经常有几个问题要开发,要频繁在多分 ...

  8. 由ASP.NET Core根据路径下载文件异常引发的探究

    前言 最近在开发新的项目,使用的是ASP.NET Core6.0版本的框架.由于项目中存在文件下载功能,没有使用类似MinIO或OSS之类的分布式文件系统,而是下载本地文件,也就是根据本地文件路径进行 ...

  9. 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾

    「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...

  10. NC24840 [USACO 2009 Mar S]Look Up

    NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...