Mybatis——Plus :表与表之间的关系:1对多和多对一
Mybatis——plus我大致整理出两种方案:
第一种:第三方mybatis-plus 插件,注解式开发
Mybatis-Plus-Relation ( mprelation ) : mybatis-plus 一对一、一对多、多对一、多对多的自动关联查询,注解方式。
<dependency>
<groupId>com.github.dreamyoung</groupId>
<artifactId>mprelation</artifactId>
<version>0.0.3.2-RELEASE</version>
</dependency>
- 使用简单,通过在实体类上添加@OneToOne / @OneToMany / @ManyToOne / @ManyToMany 等注解即可*
使用要点
使用注意点:
非ServiceImpl内置的业务查询,配置事务管理,减少SqlSession的创建。
实体上可用注解@AutoLazy(true/false)来标注是否自动触发延迟加载,该注解只针对需要延迟的属性。
★true或无值的话,则获取延迟的关联属性时自动关联。但每一个延迟属性的获取都消耗一个SqlSession。适合于只有一个延迟属性的情况。
★false或者不标注该注解的话,需要手动通过initialize()方法对延迟的关联属性进行获取,否则不会自动关联获取,此时关联为空。适合于有多个延迟属性的情况。
如果可以,不使用延迟加载(延迟加载的使用是在SqlSession关闭后执行的,需要重新创建SqlSession)。
如果确实需要延迟加载,可使用ServiceImpl 或 AutoMapper 相关的initialize方法一次性加载所有需要的被延迟的属性(只需要创建额外的一个SqlSession,毕竟SqlSession之前已经关闭)
具体使用
@Data
public class Company {
@TableId(value = "company_id")
private Long id;
private String name;
//一对多
@TableField(exist = false)
@OneToMany //一对多默认为延迟加载,即@Lazy/@Lazy(true)/或此时不标注
@JoinColumn(name="company_id",referencedColumnName = "company_id")//@TableId与一方相关属性中@TableField名称保持一致时@JoinColumn可省略
private Set<Man> employees;
}
@Data
public class Man {
@TableId(value = "man_id")
private Long id;
private String name;
//多对一
@TableField("company_id")
private Long companyId;
@TableField(exist = false)
@ManyToOne //多对一默认为立即加载,即@Lazy(false)或此时不标注
@JoinColumn(name = "company_id", referencedColumnName = "company_id") //相关的@TableField与多方的@TableId名称一致时@JoinColumn可省略
private Company company;
}
一对多(多对一)表结构: company: (compnay_id, name) man: (man_id, name, company_id)
方式二:java实体类加入 关联对象(可以是单个,也可以是集合)
package com.gton.person.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author GuoTong
* @since 2020-12-24
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "StudentActivity对象", description = "活动表")
public class StudentActivity implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "活动表的ID")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty(value = "活动名称")
private String activityName;
/**
* 在添加的时候插入时间
*/
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 在修改或者第一次添加的时候自动填充
*/
@ApiModelProperty(value = "修改时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@ApiModelProperty(value = "活动结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
@ApiModelProperty(value = "活动详情")
private String activityDesc;
@ApiModelProperty(value = "活动发起人")
private String openUserId;
@ApiModelProperty(value = "是否开启加权投票")
private Integer isShow;
@ApiModelProperty(value = "活动LOGO地址")
private String activityImage;
/**
* 参加活动的密码
*/
@ApiModelProperty(value = "参加活动的密码")
private String activityPassword;
//:@TableField(exist = false)表示该属性不为数据库表字段,但又是必须使用的。反之必须使用
@ApiModelProperty(value = "关系:1:oo")
@TableField(exist = false)
private List<StudentActivityItems> items;
}
通过 collection 就是查询的几个表里面的字段名不能有重复的 可以别名
<!--手动数据库字段和实体类映射-->
<resultMap id="resMap" type="com.gton.person.entity.StudentActivity">
<id column="id" property="id"></id>
<result property="activityName" column="activity_name"></result>
<result property="createTime" column="create_time"></result>
<result property="updateTime" column="update_time"></result>
<result property="endTime" column="end_time"></result>
<result property="activityDesc" column="activity_desc"></result>
<result property="openUserId" column="open_user_id"></result>
<result property="isShow" column="is_show"></result>
<result property="activityImage" column="activity_image"></result>
<!--一对多,方式一{就是查询的几个表里面的字段名不能有重复的}-->
<collection property="items" ofType="com.gton.person.entity.StudentActivityItems">
<id column="item_id" jdbcType="VARCHAR" property="id"/>
<result column="activity_id" jdbcType="INTEGER" property="activityId"/>
<result column="count" jdbcType="VARCHAR" property="count"/>
<result column="item_desc" jdbcType="VARCHAR" property="itemDesc"/>
<result column="head_img" jdbcType="VARCHAR" property="headImg"/>
<result column="item_name" jdbcType="TIMESTAMP" property="itemName"/>
</collection>
</resultMap>
<!--one To Many||注意一对多关系不能有相同的列,如果有相同的取别名,然后映射别名就可以了-->
<select id="getByOneToMany" resultMap="resMap">
select a.*,i.id as item_id,i.count,i.item_desc,i.item_name,i.head_img
from student_activity_items i,student_activity a
where i.activity_id = #{activeId}
and i.activity_id = a.id
</select>
然后这样做会把mybatis-plus原本的自动映射方式破坏:,会报错坏sql
解决方式 :::忽视该字段与数据库字段映射, @TableField(exist = false)
//:@TableField(exist = false)表示该属性不为数据库表字段,但又是必须使用的。反之必须使用
@ApiModelProperty(value = "关系:1:oo")
@TableField(exist = false)
private List<StudentActivityItems> items;
就这样搞定了
Mybatis——Plus :表与表之间的关系:1对多和多对一的更多相关文章
- MySQL表与表之间的关系详解
外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...
- MyBatis学习(二)---数据表之间关联
想要了解MyBatis基础的朋友可以通过传送门: MyBatis学习(一)---配置文件,Mapper接口和动态SQL http://www.cnblogs.com/ghq120/p/8322302. ...
- PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系
看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我 ...
- PostgreSQL表空间、模式、表、用户/角色之间的关系
PostgreSQL表空间.模式.表.用户/角色之间的关系是本文我们主要要介绍的内容,表空间,数据库,模式,表,用户,角色之间的关系到底是怎样的呢?接下来我们就开始介绍这一过程. 实验出角色与用户的关 ...
- SSAS的维度表之间的关系只能有一个不能有多个
我们在SSAS中创建维度的时候,有时候可能一个维度需要用到多个表的字段作为维度属性,那么这多个表之间势必存在关联关系,但是切记维度表之间的关联关系有且只能有一个不能有多个,下面我们来看一个例子. 现在 ...
- mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决
※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...
- MySQL如何找到表与表之间的关系?
如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...
- 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系
基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库 ...
- MySQL表与表之间的关系
表与表之间的关系 表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以 ...
- 获取完全一样的数据库,包括表与表之间的外键关系,check,default表结构脚本
今天公司给了一个任务,某一个项目由于数据过大,造成Sql Server 2012 的运行占用很大内存,于是要把之前的不常用的数据分开.要求写个脚本,要求: 1.能获取原来数据库中的表结构,主键一致.表 ...
随机推荐
- 深度剖析js闭包
一.什么是闭包? 方法里面返回一个方法 二.闭包存在的意义 延长变量的生命周期 作用域链 沟通内外部方法的桥梁 闭包会常驻内存 ==>慎用闭包 闭包里的变量不会被回收 创建私有环建 例 ...
- 算法:KMP, str1字符串是否包含str2字符串
[普通解法]从左到右遍历str1的每一个字符,然后看如果 以当前字符作为第一个字符出发 是否匹配 str2字符串. [KMP算法] 1)生成一个nextArr数组,长度与str2字符串长度一样.i 的 ...
- Mysqldump 的 的 6 大使用场景的导出命令
Mysqldump 选项解析 场景描述 1. 导出 db1.db2 两个数据库的所有数据. mysqldump -uroot -p -P8635 -h192.168.0.199 --hex-blob ...
- Elasticsearch 开发入门 - Python
文章转载自:https://elasticstack.blog.csdn.net/article/details/111573923 前提条件 你需要在你的电脑上安装 python3 你需要安装 do ...
- 《Spatial-Spectral T ransformer for Hyperspectral Image Classification》论文笔记
论文题目<Spatial-Spectral T ransformer for Hyperspectral Image Classification> 论文作者:Xin He 1 , Yus ...
- PAT (Basic Level) Practice 1030 完美数列 分数 25
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- python之流程控制上-if、while
流程控制 编写程序,是将自己的逻辑思想记录下来,使得计算机能够执行的过程. 而流程控制,则是逻辑结构中十分重要的一环. 在程序中,基础的流程结构分为顺序结构.分支结构.顺序结构 顺序结构自不必多说,上 ...
- HDU4991 Ordered Subsequence (树状数组优化DP)
dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数. 方程:dp[i][j]=sum(dp[k][j-1]),a[k]<a[i],1<=k<i. 求解目标:sum(dp[k ...
- 【博学谷学习记录】超强总结,用心分享|Linux修改文件权限方法总结
一.介绍 linux中"一切皆文件".每个文件都设定了针对不同用户的访问权限. 文件权限主要针对以下三种对象: 属主:拥有者 属组:所属的组 其他人:不属于上述两类 二.文件权限 ...
- LcdToos设置“自动播放”和“上电自动开机”的作用
"自动播放"功能,常用于屏演示或者老化功能,使能后,按开关点亮屏,PX01会自动按"画面定制"栏中进行自动顺序播放:开启方法如下: 打开相应的点屏工程,在&qu ...