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.分 ...
随机推荐
- c++ 题解
43题 #include <random> #include <iostream> int main() { ][] = { {,,,}, {,,,}, {,,,}}; ; n ...
- 时间datetime模块
datetime模块 import datetime --时间加减的模块 #返回当前时间 print(datetime.datetime.now()) --2019-09-28 17:22:14.54 ...
- PHP base_convert() 函数
16进制转8进制 <?php $hex = "E196"; echo base_convert($hex,,); ?> 8进制数转换为10进制数 <?php $o ...
- 模板 - 部分C++库
__builtin系列 据说是GCC自带的系列,在本地装有 GNU GCC Compiler 的 Codeblocks 和 Codeforces 等平台都可以使用这些.但是没办法从 Codeblock ...
- Java串口通信--------基于RXTX (附带资源地址)
最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...
- MongoDB 关系型数据库表(集合)与表(集合)之间的几种关系
简述关系数据库中表与表的 3 种关系 一对一的关系:例如:一个人对应一个唯一的身份证号,即为一对一的关系. 一对多关系 :例如:一个班级对应多名学生,一个学生只能属于一个班级,即为一对多关系 多对多关 ...
- Swarm容器集群管理(超详细)
一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...
- 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World
目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...
- AdaptIS: Adaptive Instance Selection Network
AdaptIS: Adaptive Instance Selection Network 2019-09-19 12:58:07 Paper: https://arxiv.org/pdf/1909.0 ...
- asp.net core mvc 读取appsettings.config中文乱码问题
asp.net core mvc 读取appsettings.config中文乱码问题的解决方法如下: 用记事本打开appsettings.config,另存为的时候,编码设置为 “UTF-8”,