Mybatis——plus我大致整理出两种方案:

第一种:第三方mybatis-plus 插件,注解式开发

Mybatis-Plus-Relation ( mprelation ) : mybatis-plus 一对一、一对多、多对一、多对多的自动关联查询,注解方式。

  1. <dependency>
  2. <groupId>com.github.dreamyoung</groupId>
  3. <artifactId>mprelation</artifactId>
  4. <version>0.0.3.2-RELEASE</version>
  5. </dependency>
  • 使用简单,通过在实体类上添加@OneToOne / @OneToMany / @ManyToOne / @ManyToMany 等注解即可*

使用要点

  1. 使用注意点:
  2. ServiceImpl内置的业务查询,配置事务管理,减少SqlSession的创建。
  3. 实体上可用注解@AutoLazy(true/false)来标注是否自动触发延迟加载,该注解只针对需要延迟的属性。
  4. true或无值的话,则获取延迟的关联属性时自动关联。但每一个延迟属性的获取都消耗一个SqlSession。适合于只有一个延迟属性的情况。
  5. false或者不标注该注解的话,需要手动通过initialize()方法对延迟的关联属性进行获取,否则不会自动关联获取,此时关联为空。适合于有多个延迟属性的情况。
  6. 如果可以,不使用延迟加载(延迟加载的使用是在SqlSession关闭后执行的,需要重新创建SqlSession)。
  7. 如果确实需要延迟加载,可使用ServiceImpl AutoMapper 相关的initialize方法一次性加载所有需要的被延迟的属性(只需要创建额外的一个SqlSession,毕竟SqlSession之前已经关闭)

具体使用

  1. @Data
  2. public class Company {
  3. @TableId(value = "company_id")
  4. private Long id;
  5. private String name;
  6. //一对多
  7. @TableField(exist = false)
  8. @OneToMany //一对多默认为延迟加载,即@Lazy/@Lazy(true)/或此时不标注
  9. @JoinColumn(name="company_id",referencedColumnName = "company_id")//@TableId与一方相关属性中@TableField名称保持一致时@JoinColumn可省略
  10. private Set<Man> employees;
  11. }
  1. @Data
  2. public class Man {
  3. @TableId(value = "man_id")
  4. private Long id;
  5. private String name;
  6. //多对一
  7. @TableField("company_id")
  8. private Long companyId;
  9. @TableField(exist = false)
  10. @ManyToOne //多对一默认为立即加载,即@Lazy(false)或此时不标注
  11. @JoinColumn(name = "company_id", referencedColumnName = "company_id") //相关的@TableField与多方的@TableId名称一致时@JoinColumn可省略
  12. private Company company;
  13. }

一对多(多对一)表结构: company: (compnay_id, name) man: (man_id, name, company_id)

方式二:java实体类加入 关联对象(可以是单个,也可以是集合)

  1. package com.gton.person.entity;
  2. import com.baomidou.mybatisplus.annotation.FieldFill;
  3. import com.baomidou.mybatisplus.annotation.IdType;
  4. import com.baomidou.mybatisplus.annotation.TableField;
  5. import com.baomidou.mybatisplus.annotation.TableId;
  6. import io.swagger.annotations.ApiModel;
  7. import io.swagger.annotations.ApiModelProperty;
  8. import lombok.Data;
  9. import lombok.EqualsAndHashCode;
  10. import org.springframework.format.annotation.DateTimeFormat;
  11. import java.io.Serializable;
  12. import java.time.LocalDateTime;
  13. import java.util.List;
  14. /**
  15. * <p>
  16. *
  17. * </p>
  18. *
  19. * @author GuoTong
  20. * @since 2020-12-24
  21. */
  22. @Data
  23. @EqualsAndHashCode(callSuper = false)
  24. @ApiModel(value = "StudentActivity对象", description = "活动表")
  25. public class StudentActivity implements Serializable {
  26. private static final long serialVersionUID = 1L;
  27. @ApiModelProperty(value = "活动表的ID")
  28. @TableId(value = "id", type = IdType.ASSIGN_ID)
  29. private String id;
  30. @ApiModelProperty(value = "活动名称")
  31. private String activityName;
  32. /**
  33. * 在添加的时候插入时间
  34. */
  35. @ApiModelProperty(value = "创建时间")
  36. @TableField(fill = FieldFill.INSERT)
  37. private LocalDateTime createTime;
  38. /**
  39. * 在修改或者第一次添加的时候自动填充
  40. */
  41. @ApiModelProperty(value = "修改时间")
  42. @TableField(fill = FieldFill.INSERT_UPDATE)
  43. private LocalDateTime updateTime;
  44. @ApiModelProperty(value = "活动结束时间")
  45. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  46. private LocalDateTime endTime;
  47. @ApiModelProperty(value = "活动详情")
  48. private String activityDesc;
  49. @ApiModelProperty(value = "活动发起人")
  50. private String openUserId;
  51. @ApiModelProperty(value = "是否开启加权投票")
  52. private Integer isShow;
  53. @ApiModelProperty(value = "活动LOGO地址")
  54. private String activityImage;
  55. /**
  56. * 参加活动的密码
  57. */
  58. @ApiModelProperty(value = "参加活动的密码")
  59. private String activityPassword;
  60. //:@TableField(exist = false)表示该属性不为数据库表字段,但又是必须使用的。反之必须使用
  61. @ApiModelProperty(value = "关系:1:oo")
  62. @TableField(exist = false)
  63. private List<StudentActivityItems> items;
  64. }
通过 collection 就是查询的几个表里面的字段名不能有重复的 可以别名
  1. <!--手动数据库字段和实体类映射-->
  2. <resultMap id="resMap" type="com.gton.person.entity.StudentActivity">
  3. <id column="id" property="id"></id>
  4. <result property="activityName" column="activity_name"></result>
  5. <result property="createTime" column="create_time"></result>
  6. <result property="updateTime" column="update_time"></result>
  7. <result property="endTime" column="end_time"></result>
  8. <result property="activityDesc" column="activity_desc"></result>
  9. <result property="openUserId" column="open_user_id"></result>
  10. <result property="isShow" column="is_show"></result>
  11. <result property="activityImage" column="activity_image"></result>
  12. <!--一对多,方式一{就是查询的几个表里面的字段名不能有重复的}-->
  13. <collection property="items" ofType="com.gton.person.entity.StudentActivityItems">
  14. <id column="item_id" jdbcType="VARCHAR" property="id"/>
  15. <result column="activity_id" jdbcType="INTEGER" property="activityId"/>
  16. <result column="count" jdbcType="VARCHAR" property="count"/>
  17. <result column="item_desc" jdbcType="VARCHAR" property="itemDesc"/>
  18. <result column="head_img" jdbcType="VARCHAR" property="headImg"/>
  19. <result column="item_name" jdbcType="TIMESTAMP" property="itemName"/>
  20. </collection>
  21. </resultMap>
  22. <!--one To Many||注意一对多关系不能有相同的列,如果有相同的取别名,然后映射别名就可以了-->
  23. <select id="getByOneToMany" resultMap="resMap">
  24. select a.*,i.id as item_id,i.count,i.item_desc,i.item_name,i.head_img
  25. from student_activity_items i,student_activity a
  26. where i.activity_id = #{activeId}
  27. and i.activity_id = a.id
  28. </select>
然后这样做会把mybatis-plus原本的自动映射方式破坏:,会报错坏sql

解决方式 :::忽视该字段与数据库字段映射, @TableField(exist = false)

  1. //:@TableField(exist = false)表示该属性不为数据库表字段,但又是必须使用的。反之必须使用
  2. @ApiModelProperty(value = "关系:1:oo")
  3. @TableField(exist = false)
  4. private List<StudentActivityItems> items;

就这样搞定了

Mybatis——Plus :表与表之间的关系:1对多和多对一的更多相关文章

  1. MySQL表与表之间的关系详解

    外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...

  2. MyBatis学习(二)---数据表之间关联

    想要了解MyBatis基础的朋友可以通过传送门: MyBatis学习(一)---配置文件,Mapper接口和动态SQL http://www.cnblogs.com/ghq120/p/8322302. ...

  3. PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

    看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我 ...

  4. PostgreSQL表空间、模式、表、用户/角色之间的关系

    PostgreSQL表空间.模式.表.用户/角色之间的关系是本文我们主要要介绍的内容,表空间,数据库,模式,表,用户,角色之间的关系到底是怎样的呢?接下来我们就开始介绍这一过程. 实验出角色与用户的关 ...

  5. SSAS的维度表之间的关系只能有一个不能有多个

    我们在SSAS中创建维度的时候,有时候可能一个维度需要用到多个表的字段作为维度属性,那么这多个表之间势必存在关联关系,但是切记维度表之间的关联关系有且只能有一个不能有多个,下面我们来看一个例子. 现在 ...

  6. mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决

    ※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...

  7. MySQL如何找到表与表之间的关系?

    如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...

  8. 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系

    基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库 ...

  9. MySQL表与表之间的关系

    表与表之间的关系 表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以 ...

  10. 获取完全一样的数据库,包括表与表之间的外键关系,check,default表结构脚本

    今天公司给了一个任务,某一个项目由于数据过大,造成Sql Server 2012 的运行占用很大内存,于是要把之前的不常用的数据分开.要求写个脚本,要求: 1.能获取原来数据库中的表结构,主键一致.表 ...

随机推荐

  1. Java学习笔记:基本输入、输出数据操作实例分析

    Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...

  2. 使用Steamwork.Net 接入Steam一点心得

    1.  前言 这是我在开发过程中使用的一点总结,目前使用的东西包含基础登录功能,存档功能,成就系统,以及DLC安装功能.Steamwork不仅仅有这些功能还有游戏内交易,排行榜,数据传输等功能,这些功 ...

  3. Openstack neutron:SDN现状

    目录 - SDN现状 - (一)SDN现状 - SDN诞生的背景 - SDN的介绍 - (二)SDN领域的相关组织和发展现状 - 1.ONF - 2.OpenDaylight - 3. IETF -  ...

  4. Kubernetes中使用ClusterDNS进行服务发现

    在k8s集群中,服务是运行在Pod中的,Pod的发现和副本间负载均衡是我们面临的问题.我们使用Service解决了负载均衡的问题,但是集群环境中,service经常伴随着ip的变动而变动,得益于kub ...

  5. 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...

  6. PostgreSQL 删除表格

    PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据.规则.触发器等,所以删除表格要慎重,删除后所有信息就消失了. 语法 DROP TABLE 语法格式如下: DROP TA ...

  7. 不安装运行时运行 .NET 程序 - NativeAOT

    大家好,先祝大家国庆快乐.不过大家看到这篇文章的时候估计已经过完国庆了 . 上一篇我们写了如何通过 SelfContained 模式发布程序(不安装运行时运行.NET程序)达到不需要在目标机器上安装 ...

  8. 关于click和onclick的区别

    click()和onclick()的区别: 1.onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么 click本身是方法作用是触发onclick事件,只要执行了元素的click()方法,就会触 ...

  9. 方法的重写(override / overwrite)

    1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作 2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法. 重写的规 ...

  10. 第一种方式:使用form表单将前端数据提交到servelt(将前端数据提交到servlet)

    第二种使用Ajax的形式将前台的数据传输到后台:https://blog.csdn.net/weixin_43304253/article/details/120335657 1.form表单 引入了 ...