三种方式:

①业务装配
对两个表编写单表查询语句,在业务层(Serivce)把查询的两个结果进行关联
②使用Auto Mapping特性
在实现两表联合查询时通过别名完成映射,使用Maybatis的<resultMap>元素进行实现

多表查询时,类中包含另一个类对象

①单个对象
如:一个工人对应一个公司
②集合对象
如:一个公司包含多个工人

<resultMap>元素

<resultMap id="" type=""><id  property="属性名" column="查询结果列名"/>   //主键使用id<result property=""/ column=""> //其余使用result
</resultMap>

实现关联单个对象查询(N+1方式)
使用子元素:
<association property="" javaType=“对象类型”(可省略) select=“另一个select元素的引用” column=“传入参数”/>
Ps:需要传入多个参数时,column="{“key”:property,“key”:property},实质为map
例(一个产品有一个生产工厂):通过接口绑定
public Goods selGoodsUseNadd1(@Param(“id”)int id);

<!--resultMap元素-->
<resultMap id="GoodsNadd1" type="Goods"><id property="id" column="id"/><result property="name" column="name"/><result property="produce" column="produce"/><association property="manufactory" select="com.mfqh.mapper.UnionMapper.selManu" column="produce"></association>
</resultMap>
<!--被引用的查询-->
<select id="selManu" resultType="Manufactory">SELECT * FROM manufactory WHERE id=#{0}
</select>
<!--主查询-->
<select id="selGoodsUseNadd1" resultMap="GoodsNadd1">SELECT * FROM goods WHERE id=#{id}
</select>

结果:

实现关联多个对象查询(N+1方式)
使用子元素:
<collection property="" select = “另一个select元素的引用” javaType=“集合类型”(可省略) ofType=“集合的范型”(可省略) column=“传入参数”/>
例(一个工厂生产多个产品):通过接口绑定

<!-- rsultMap查询结果处理 -->
<resultMap id="ManufactoryNadd1" type="Manufactory"><id property="id" column="id"/><result property="name" column="name"/><result property="local" column="local"/><collection property="goods" select="com.mfqh.mapper.UnionMapper.selGoods" column="id"></collection>
</resultMap><!-- 副查询 -->
<select id="selGoods" resultType="Goods">SELECT * FROM goods WHERE produce = #{0}
</select><!-- 主查询 -->
<select id="selManuUseNadd1" resultMap="ManufactoryNadd1">SELECT * FROM manufactory WHERE name = #{name}
</select>

结果:

与业务装配的区别:service中执行的代码,在mybatis中完成
Ps:如果列名和属性名相同可以不配置,但是要进行传参的列必须进行配置

实现关联单个对象查询(联合查询)
将<association>元素扩展开:

<associatetion properity="" javaType="对象类型><id  property="" column=""/>   //主键使用id<result property=""/ column=""> //其余使用result
</associatetion>

此时在SELECT中直接使用多表查询语句
例(一个产品有一个生产工厂):通过接口绑定
public Goods selGoodsUseUnion(int id);

<!-- rsultMap查询结果处理 -->
<resultMap id="GoodsUseUnion" type="Goods"><id property="id" column="id"/><result property="name" column="name"/><result property="produce" column="produce"/><association property="manufactory" javaType="Manufactory"><id property="id" column="fid"/><result property="name" column="fname"/><result property="local" column="flocal"/></association>
</resultMap>
<!-- 查询 -->
<select id="selGoodsUseUnion" resultMap="GoodsUseUnion">SELECT g.*,f.id fid,f.name fname,f.local flocal FROM goods g LEFT OUTER JOIN manufactory f ON g.produce=f.id WHERE g.id=#{0}
</select>

Ps:此处若两个表有相同的字段名称,则需起别名
结果:

实现关联多个对象查询(联合查询)
多个对象(mybatis可根据主键判断对象是否创建):

<collection property="" ofType="集合的范型”><id  property="" column=""/>   //主键使用id<result property=""/ column=""> //其余使用result
</collection>

例(一个生产工厂有多个产品):通过接口绑定
public Manufactory selMaunUseUnion(String name);

<!-- rsultMap查询结果处理 -->
<resultMap id="ManuUseUnion" type="Manufactory"><id property="id" column="id"/><result property="name" column="name"/><result property="local" column="local"/><collection property="goods" ofType="Goods"><id property="id" column="gid"/><result property="name" column="gname"/><result property="produce" column="gproduce"/></collection>
</resultMap>
<!-- 查询 -->
<select id="selMaunUseUnion" resultMap="ManuUseUnion">SELECT f.*,g.id gid,g.name gname,g.produce gproduce FROM goods g LEFT OUTER JOIN manufactory f ON g.produce=f.id WHERE f.name=#{param1}
</select>

结果:

联合查询和N+1方式的对比

N+1:需求不明确,含义为得出结果需要N+1条sql语句;效率低;适用场景不一定两个表都需要查时
联合查询:需求中确定两个表都一定查询

Auto Mapping结合别名实现多表查询

此时只能使用多表联合查询,并且只能实现一个对象的查询
别名使用:类名.列名的方式
此时直接使用resultType属性和sql联合查询语句,会进行自动映射
例:通过接口绑定
public Goods selGoodsAlias(int id);

<!-- 类名.别名方式进行查询 -->
<select id="selGoodsAlias" resultType="Goods">SELECT g.*,f.id `Manufactory.id`,f.name `Manufactory.name`,f.local `Manufactory.local` FROM goods g LEFT OUTER JOIN manufactory f ON g.produce=f.id WHERE g.id=#{0}
</select>

Ps:此处注意sql中.为关键字,需使用着重号`将别名括起来。
结果:

MyBatis框架 多表联合查询实现相关推荐

  1. 利用SSM(springmvc+spring+mybatis)实现多表联合查询

    最近在做在eclipse + maven搭建SSM框架下做一个简单的后台管理系统,因为是第一次搭建SSM项目,在mybatis进行多表连接查询的时候遇到问题,不知道如何进行处理?在网上搜了一下解决方法 ...

  2. springboot+mybatis+mysql 多表联合查询

    ###springboot+mybatis+mysql 多表查询 这里有两张表 用户表和用户信息表user.info 两个实体类展示他们一对一的关系 通过springboot注解的方式实现多表联合查询 ...

  3. mybatis学习五-mybatis的多表联合查询

    1. 一对一的关系 首先先看数据库 tb_user tb_orders 执行这条sql: 也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id 也就是说, 从后面看, 就是每 ...

  4. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。

    多表联合查询 一个根据机场查询航线的例子.有两张表,机场表包含机场信息:机场id.机场名字.机场城市. 航班包含航线信息:航班id.飞机编号.飞行时间.票价.起飞机场id.降落机场id. 需要查询的结 ...

  5. SpringBoot+MyBatis多表联合查询

    SpringBoot+MyBatis多表联合查询 写在前面 联合查询在实际工作中用的并不多,因为很多表的数据比较大,或者说未来比较大的表,都要谨慎使用联合查询 数据准备 建表语句 create tab ...

  6. MyBatis 多表联合查询及优化

    关于优化 对于优化嘛,我这里简单的提几点,大家可以考虑一下.首先,就是对表的设计,在设计表初期,不仅仅要考虑到数据库的规范性,还好考虑到所谓的业务,以及对性能的影响,比如,如果从规范性角度考虑的话,可 ...

  7. Mybatis---多表联合查询(1)

    Mybatis---多表联合查询(1) 前言 测试准备 一.一对一 新建方法 添加关联 测试 二.一对多 新建实体类 添加方法 添加关联 测试 前言 在开发过程中单表查询不能满足项目需求分析功能,对于 ...

  8. 原生php多表查询方法,ThinkPHP多表联合查询的常用方法

    ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 代码如下: firstRow.','.$p->listRow ...

  9. MyBatis-映射文件06-多表联合查询

    MyBatis-映射文件06-多表联合查询 使用标签中的标签和标签来处理多表联合查询时查询得到的字段值与JavaBean成员变量的对应问题,即多表联合查询时的封装规则 使用到的实体类的定义: //Em ...

最新文章

  1. Unity协程截图,WWWForm、WWW配合上传
  2. linux进程调度浅析
  3. 清除应用数据后,应用对应的widget的数据无法刷新
  4. 硬核推荐:博主神器OpenWrite,免费的一文多发平台,无需部署,注册即用,安全可靠!...
  5. C++ open 打开文件(含打开模式一览表)
  6. 阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性
  7. jdk1.8配置(自我速成)
  8. Exchange server 2007中启用pop3和IMAP4协议访问
  9. php 实现防盗链,php中如何实现防盗链的示例
  10. Windows Server 2008 多元密码策略之ADSIEDIT篇
  11. (三维偏序)陌上花开
  12. vscode调试时几个常用参数的含义和设置总结
  13. 深度学习:鞍点与海森矩阵的问题
  14. 一名“老”引擎程序员的昨天、今天和明天
  15. 新一代的核心路由器的发展趋势分析
  16. java生成N位随机数字
  17. 11月更新!一口气上线20+新功能,3D架构拓扑图更具趣味性~
  18. chmod的使用 czy:czy 文件名
  19. 【过关斩将】如何在工作中提高沟通能力?
  20. 素描嘴巴如何画的饱满?学学这些方法和干瘪嘴巴说再见!

热门文章

  1. EasyUI界面显示中文格式(日期中文格式)
  2. Hibernate教程
  3. 关于git pull机制和游戏开发热更新思考
  4. C#LeetCode刷题之#860-柠檬水找零(Lemonade Change)
  5. chrome 全屏截图_如何在不带扩展功能的Chrome中拍摄全屏截图
  6. hexo博客添加暗色模式_我如何将暗模式添加到我的网站
  7. php项目数据库控制器代码_如何为大型代码库组织Express控制器
  8. web应用调试工具_如何使用浏览器开发人员工具调试渐进式Web应用程序
  9. python 硬件自动化测试_村长告诉你:Python实现性能自动化测试竟然如此简单
  10. 机器学习算法(三): 基于支持向量机的分类预测