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.能获取原来数据库中的表结构,主键一致.表 ...
随机推荐
- Java学习笔记:基本输入、输出数据操作实例分析
Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...
- 使用Steamwork.Net 接入Steam一点心得
1. 前言 这是我在开发过程中使用的一点总结,目前使用的东西包含基础登录功能,存档功能,成就系统,以及DLC安装功能.Steamwork不仅仅有这些功能还有游戏内交易,排行榜,数据传输等功能,这些功 ...
- Openstack neutron:SDN现状
目录 - SDN现状 - (一)SDN现状 - SDN诞生的背景 - SDN的介绍 - (二)SDN领域的相关组织和发展现状 - 1.ONF - 2.OpenDaylight - 3. IETF - ...
- Kubernetes中使用ClusterDNS进行服务发现
在k8s集群中,服务是运行在Pod中的,Pod的发现和副本间负载均衡是我们面临的问题.我们使用Service解决了负载均衡的问题,但是集群环境中,service经常伴随着ip的变动而变动,得益于kub ...
- 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...
- PostgreSQL 删除表格
PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据.规则.触发器等,所以删除表格要慎重,删除后所有信息就消失了. 语法 DROP TABLE 语法格式如下: DROP TA ...
- 不安装运行时运行 .NET 程序 - NativeAOT
大家好,先祝大家国庆快乐.不过大家看到这篇文章的时候估计已经过完国庆了 . 上一篇我们写了如何通过 SelfContained 模式发布程序(不安装运行时运行.NET程序)达到不需要在目标机器上安装 ...
- 关于click和onclick的区别
click()和onclick()的区别: 1.onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么 click本身是方法作用是触发onclick事件,只要执行了元素的click()方法,就会触 ...
- 方法的重写(override / overwrite)
1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作 2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法. 重写的规 ...
- 第一种方式:使用form表单将前端数据提交到servelt(将前端数据提交到servlet)
第二种使用Ajax的形式将前台的数据传输到后台:https://blog.csdn.net/weixin_43304253/article/details/120335657 1.form表单 引入了 ...