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

表结构设计如下:

主表:

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. c博客作业01——顺序 分支结构

    本章学习总结 1.1 学习内容总结 ·学习switch分支的使用,switch后加括号(),括号内填一个变量或字符 如 switch (a) { case 2: case 3: default: } ...

  2. ICEM-圆角正方体

    原视频下载地址:https://pan.baidu.com/s/1c2cNgJm 密码: rci8

  3. java中&& 的运算优先级高于||

    public class First { public static void main(String[] args) { boolean a = false; boolean b = true; b ...

  4. 【Qt开发】vs2017+qt5.x编译32位应用

    概述 最近有同学私信我,问如何使用vs2017+qt5.10编译出32位的应用,需要使用msvc2017_x86的插件,然而qt官网并没有提供,只能使用源码编译生成msvc2017_x86插件,使用n ...

  5. HIDL概述【转】

    本文转载自:https://blog.csdn.net/u013357557/article/details/84561457 HIDL背景Treble 是 Google Android 团队的一项重 ...

  6. N以内的素数计算(Java代码)

    列出小于N的所有素数 普通计算方式, 校验每个数字 优化的几处: 判断是否整除时, 除数使用小于自身的平方根的素数 大于3的素数, 都在6的整数倍两侧, 即 6m - 1 和 6m + 1 publi ...

  7. java.io.IOException: Input is binary and unsupported

    十一月 16, 2019 11:49:47 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() f ...

  8. DuplicateHandle进程间句柄复制

    转载:https://blog.csdn.net/u012372584/article/details/78740365 1.   BOOL DuplicateHandle(   HANDLE hSo ...

  9. Linux 上安装 appium

    在linux 环境下安装需要以下几步:1.安装node.js, 通过  uname -a  命令查看到我的Linux系统位数是64位(备注:x86_64表示64位系统, i686 i386表示32位系 ...

  10. 「中山纪中集训省选组D2T1」书堆 欧拉常数

    题目描述 蚂蚁是勤劳的动物,他们喜欢挑战极限.现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边缘.蚂蚁喜欢整洁的布置,所以 ...