mybatis 多个中间表查询映射
最近项目用到中间表,则遇到如何联查映射的问题,之前一直都是一个表头,多个明细或者一对一这样的关系,没遇到这样的问题,所以趁机找了下资料解决了这个问题。
表结构设计如下:
主表:
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 多个中间表查询映射的更多相关文章
- MyBatis中实现多表查询
		
如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1 业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...
 - Mybatis学习——一对一关联表查询
		
1.SQL语句建表 CREATE TABLE teacher( t_id ) ); CREATE TABLE class( c_id ), teacher_id INT ); ALTER TABLE ...
 - MyBatis总结-实现关联表查询
		
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
 - MyBatis学习之多表查询
		
一对多需求:即一张表class中又含有多张表(teacher,student)内容.现根据class_id 来获取对应的班级信息(包括学生和老师信息) 方式一:嵌套结果 使用嵌套结果映射来处理重复的联 ...
 - 在Mybatis中使用连表查询的一次实际应用
		
以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下. 关联表介绍: 分别是属性表attr_info.属性值表 ...
 - Mybatis中的多表查询  多对多
		
示例:用户和角色 一个用户可以有多个角色 一个角色可以赋予多个用户 步骤: 1.建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系. 需要使用中间表,中间表中包含各自的主键,在中间表中是外键 ...
 - Mybatis中的多表查询  多对一,一对多
		
示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...
 - mybatis一对多联表查询的两种常见方式
		
1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为 ...
 - 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)
		
在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...
 
随机推荐
- async、await总结
			
一.async用法 async作为一个关键字放到函数前面,用于表示函数是一个异步函数.异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 异步函数语法很简单,就是在函数前面加上async 关键字, ...
 - 详解匿名内部类 ,形参为什么要用final
			
一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部 ...
 - php 进制转换base_convert
			
16进制 转为 8进制 base_convert(number,frombase,tobase); 参数 描述 number 必需.规定要转换的数. frombase 必需.规定数字原来的进制.介于 ...
 - zookeeper安装运行(docker)
			
拉取镜像docker pull zookeeper:latest 获取镜像基本信息docker inspect zookeeper mkdir /opt/zookeeper -p vim /opt/z ...
 - golang调用  exec命令 出现too many open files
			
systemd 启动的服务, 跟系统的ulimit 没有关系. 大概的意思就是通过systemd启动的服务,不会使用ulimit中的配置,需要在systemd中或者service配置文件中定义,可以通 ...
 - 数据库事务和spring事务的区别
			
数据库事务和spring事务 本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单 ...
 - how-does-mysql-replication-really-work/ what-causes-replication-lag
			
https://www.cnblogs.com/kevingrace/p/6274073.html https://www.cnblogs.com/kevingrace/p/6261091.html ...
 - CefSharp 提示 flash player is out of date 运行此插件 等问题解决办法
			
CefSharp 提示 flash player is out of date 或者 需要手动右键点 运行此插件 脚本 等问题解决办法 因为中国版FlashPlayer变得Ad模式之后,只好用旧版本的 ...
 - IDEA查看接口的实现类
			
查找接口的实现类: 快捷键 ctrl + alt +B 再按F2查看详细文档注解 查看类或接口的继承关系: ctrl + h
 - Flutter中通过普通的点击事件修改TextFormField的值
			
import 'package:flutter/material.dart'; import 'package:zhongfa_apps/widget/public/PublicWidget.dart ...