最近项目用到中间表,则遇到如何联查映射的问题,之前一直都是一个表头,多个明细或者一对一这样的关系,没遇到这样的问题,所以趁机找了下资料解决了这个问题。

表结构设计如下:

主表:

CREATE TABLE `process_line_detail` (
`id` char(32) NOT NULL COMMENT 'ID',
`serial_no` int(11) NOT NULL COMMENT '序号',
`process_id` char(32) DEFAULT '' COMMENT '工序id'
)

中间表:

REATE TABLE `process_line_detail_device` (
`process_line_detail_id` char(32) NOT NULL COMMENT '工序线详情id',
`device_id` char(32) NOT NULL COMMENT '设备id'
)
CREATE TABLE `process_line_detail_mould` (
`process_line_detail_id` char(32) NOT NULL COMMENT '工序线详情id',
`mould_id` char(32) NOT NULL COMMENT '模具id'
)

中间表关联表:

CREATE TABLE `device` (
`id` char(32) NOT NULL COMMENT 'ID',
`name` varchar(32) NOT NULL COMMENT '名称'
)
CREATE TABLE `mould` (
`id` char(32) NOT NULL COMMENT 'ID',
`code` varchar(64) NOT NULL COMMENT '编码',
`serial_no` varchar(32) DEFAULT '' COMMENT '序列号',
`name` varchar(32) DEFAULT '' COMMENT '模具名称',
`model` varchar(64) DEFAULT '' COMMENT '模具型号'
)

一对一的关联表:

CREATE TABLE `process` (
`id` char(32) NOT NULL COMMENT 'ID',
`name` varchar(64) DEFAULT '' COMMENT '工序名称'
)

实体类则不需要关联表,只需要在主表中添加关联表的集合或者单个对象即可(简写,省略 get,set):

public class ProcessLineDetail{
private String id;
private String serialNo; // 序号
private Process process; // 工序
private List<Device> deviceList = Collections.emptyList();
private List<Mould> mouldList = Collections.emptyList();
}
public class Device  {
private String name; // 名称
private String id; // id
}
public class Mould {
private String id;
private String code; // 编码
private String serialNo; // 序列号
private String name; // 模具名称
private String model; // 模具型号
}
public class Process  {
private String id; // id
private String name; // 工序名称

mybatis映射文件如下(简写,没包含具体实体的路径):

<sql id="baseColumns">
a.id,
a.serial_no,
a.process_id,
process.name AS "process_name",
device.name AS "device_name",
device.id AS "device_id",
mould.id AS "mould_id",
mould.name AS "mould_name"
</sql>
<resultMap id="AllResultMap" type="ProcessLineDetail">
<id property="id" column="id" />
<result property="serialNo" column="serial_no" />
<association property="process" column="process_id" javaType="Process">
<id column="process_id" property="id" />
<result column="process_name" property="name" />
</association>
<collection property="deviceList" ofType="Device" >
<id column="device_id" property="id" />
<result column="device_name" property="name"/>
</collection>
<collection property="mouldList" ofType="Mould">
<id column="mould_id" property="id" />
<result column="mould_name" property="name" />
</collection>
</resultMap>
<sql id="allJoins">
left join process_line_detail_device detailDevice on detailDevice.process_line_detail_id = a.id
left join device device on device.id = detailDevice.device_id
left join process_line_detail_mould detailMould on detailMould.process_line_detail_id = a.id
left join mould mould on mould.id = detailMould.mould_id
left join process process ON process.id = a.process_id
</sql>
<select id="get" resultMap="AllResultMap" >
SELECT
<include refid="baseColumns"/>
FROM process_line_detail a
<include refid="allJoins"/>
WHERE a.id = #{id}
</select>

如此即可,mybaits会自动将各数据集合一一对应上。

mybatis 多个中间表查询映射的更多相关文章

  1. MyBatis中实现多表查询

    如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1  业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...

  2. Mybatis学习——一对一关联表查询

    1.SQL语句建表 CREATE TABLE teacher( t_id ) ); CREATE TABLE class( c_id ), teacher_id INT ); ALTER TABLE ...

  3. MyBatis总结-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  4. MyBatis学习之多表查询

    一对多需求:即一张表class中又含有多张表(teacher,student)内容.现根据class_id 来获取对应的班级信息(包括学生和老师信息) 方式一:嵌套结果 使用嵌套结果映射来处理重复的联 ...

  5. 在Mybatis中使用连表查询的一次实际应用

    以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下. 关联表介绍: 分别是属性表attr_info.属性值表 ...

  6. Mybatis中的多表查询 多对多

    示例:用户和角色 一个用户可以有多个角色 一个角色可以赋予多个用户 步骤: 1.建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系. 需要使用中间表,中间表中包含各自的主键,在中间表中是外键 ...

  7. Mybatis中的多表查询 多对一,一对多

    示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...

  8. mybatis一对多联表查询的两种常见方式

    1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为 ...

  9. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...

随机推荐

  1. Java为什么没有指针

    为了摒弃指针带来的风险(当然了,也就放弃了指针带来的效率). 1.C/C++为什么有指针? 这个很简单,程序都是在内存中运行的,只要有内存,就有内存地址,有地址,就必然有指针,只是C++对内存地址的访 ...

  2. 欢迎来到地狱 WriteUp(2019暑假CTF第一周misc)

    目录 0707,0708,0709 题目地址:欢迎来到地狱 1.地狱伊始.jpg 1.5地狱之声.wav 2.第二层地狱.docx 3.快到终点了.zip 参考 0707,0708,0709 题目地址 ...

  3. DB proxy, mysql proxy

    db proxy 在大型互联网站的数据库部署中,部署最多的数据库为MySQL.随着MySQL中Innodb存储引擎对事物的支持,MySQL在互联网公司部署中,应用量越来越多.典型应用MySQL的公司有 ...

  4. jmeter 参数化大数据取唯一值方式

    jmeter 参数化大数据取唯一值方式 一.用时间函数: 因为时间戳永远没有重复,jmeter参数化,而且要取唯一值,可以考虑用时间函数加上其他函数一起: # 以13位的时间戳作为 userID no ...

  5. springboot自动装配redis在pool下偶尔出现连接异常的问题

    jedis pool的配置其实是采用 org.apache.commons.pool2.impl.GenericObjectPoolConfig类的配置项. jedis 2.9版本代码如下: pack ...

  6. 阿里云服务器 nginx 公网 IP 无法访问 浏览器

    配置完成 nginx 后, 在浏览器输入:http://ip,正常的话,会有页面,welcome to nginx但是浏览器显示访问失败 主要从两个方面找原因,一个是阿里云的安全组和服务器的防火墙是否 ...

  7. javascript数组遍历的几种常用方法性能分析对比

    前言: 数组遍历有很多种方法,虽然不同方法有不同的特性及适用环境,除了普通飞for循环之外,for...in能直接输出数组元素的索引,for...of能直接输出数组元素的值,map则可以直接生成新的数 ...

  8. linux设置程序运行超时时间

    在某些情况下,我们需要限制程序的运行时间(比如cronjob等),这里简单介绍下使用信号及timeout的实现方法 1. 假如有如下代码(test_timout.sh): #!/bin/bash wh ...

  9. 运行okvis-mono

    ./build/okvis_app_synchronous config/config_fpga_p2_euroc1.yaml ../mav0

  10. Linux MySQL 5.6.43 安装

    [注意] 1.首先安装在默认目录 /usr/local/mysql,如需更改数据存储目录,进行2.3两步 2.如果需要修改数据目录,将my.nf 中的 datadir=/usr/local/mysql ...