MyBatis一对多,多对一,多对多

2023-11-17

MyBatis中的一对多和对多一,多对多
主要就是resultMap中
association(关联) – 一个复杂的类型关联;许多结果将包成这种类型(多对一)
嵌套结果映射 – 关联本身可以是一个 resultMap 元素,或者从别处引用一个
collection(集合) – 复杂类型的集合(一对多)
嵌套结果映射 – 集合本身可以是一个 resultMap 元素,或者从别处引用一个

更多详细信息,在mybatis官方文档就能找到,建议大家可以直接看官方文档
mybatis官方文档
什么是关联:
在mybatis中是用来处理"has a"关系,比如一个员工有一个部门,即一个员工关联一个部门,所以association能用来处理我们数据中所谓的一对一,多对一关系(一个部门有多个员工,但是对于员工来说,一个员工只能关联一个部门)。
什么是集合:
将嵌套映射的结果集合到一个list中,比如一个部门有多个员工,即1个部门对应多个员工,对于部门来说,一个部门有多个员工。
可以看到,在处理我们数据关系的时候,就是对这2个属性的使用,而一对多和多对一都是相互的,只是各自站的角度不同。
实例:
这个实例只说这2个属性的使用方法,具体的配置和运行结果在SSM环境搭建文章中写出。
1.首先是数据库,沿用之前员工管理系统的数据库设计点击这里,上面是之前写过的一篇数据库设计,包含sql语句。

2.实体类:
我这里只列要实现映射功能用到的类user,role,department。department和user,是1对多关系,1个部门拥有多个员工。
role和user是多对多关系,1个角色可能有多个员工,而1个员工也可能有多个角色。而要实现多对多,在程序中则是拆分成2个一对多,详情见下面的实体类注释。

1)User.java

public class User {
	private int user_id;
	private String user_name;
	private String user_gender;
	private String user_email;
	private String user_phone;
	private String user_address;
	private Date user_birthday;
	private int department_id;

	//一对多,1个用户可能有多个角色。
	private List<Role> roles;
	
	//一对一,1个用户属于一个部门
	private Department department;

	public User() {
		super();
	}

	public User(String user_name, String user_gender,
			String user_email, String user_phone, String user_address,
			Date user_birthday, int department_id) {
		super();
		this.user_name = user_name;
		this.user_gender = user_gender;
		this.user_email = user_email;
		this.user_phone = user_phone;
		this.user_address = user_address;
		this.user_birthday = user_birthday;
		this.department_id = department_id;
	}

	public int getUser_id() {
		return user_id;
	}

	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}

	public String getUser_name() {
		return user_name;
	}

	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}

	public String getUser_gender() {
		return user_gender;
	}

	public void setUser_gender(String user_gender) {
		this.user_gender = user_gender;
	}

	public String getUser_email() {
		return user_email;
	}

	public void setUser_email(String user_email) {
		this.user_email = user_email;
	}

	public String getUser_phone() {
		return user_phone;
	}

	public void setUser_phone(String user_phone) {
		this.user_phone = user_phone;
	}

	public String getUser_address() {
		return user_address;
	}

	public void setUser_address(String user_address) {
		this.user_address = user_address;
	}

	public Date getUser_birthday() {
		return user_birthday;
	}

	public void setUser_birthday(Date user_birthday) {
		this.user_birthday = user_birthday;
	}

	public int getDepartment_id() {
		return department_id;
	}

	public void setDepartment_id(int department_id) {
		this.department_id = department_id;
	}

	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

	public List<Role> getRoles() {
		return roles;
	}

	public void setRoles(List<Role> roles) {
		this.roles = roles;
	}

	@Override
	public String toString() {
		return "User [user_id=" + user_id + ", user_name=" + user_name
				+ ", user_gender=" + user_gender + ", user_email=" + user_email
				+ ", user_phone=" + user_phone + ", user_address="
				+ user_address + ", user_birthday=" + user_birthday
				+ ", department_id=" + department_id + ", roles=" + roles
				+ ", department=" + department + "]\n";
	}
}

2)Role.java

public class Role {
	private int role_id;
	private String role_name;
	
	//一对多,1个角色也可能被多个用户拥有,所以是list
	private List<User> users;
	
	public Role() {
		
	}
	
	public Role(int role_id, String role_name) {
		super();
		this.role_id = role_id;
		this.role_name = role_name;
	}

	public int getRole_id() {
		return role_id;
	}

	public void setRole_id(int role_id) {
		this.role_id = role_id;
	}

	public String getRole_name() {
		return role_name;
	}

	public void setRole_name(String role_name) {
		this.role_name = role_name;
	}

	public List<User> getUsers() {
		return users;
	}

	public void setUsers(List<User> users) {
		this.users = users;
	}

	@Override
	public String toString() {
		return "Role [role_id=" + role_id + ", role_name=" + role_name
				+ ", users=" + users + "]";
	}

}

3)Department.java

public class Department {
	private int department_id;
	private String department_name;
	
	//1对多,1个部门多个用户
	private List<User> users;
	
	public Department() {
		super();
	}

	public Department(int department_id, String department_name,
			List<User> users) {
		super();
		this.department_id = department_id;
		this.department_name = department_name;
		this.users = users;
	}

	public int getDepartment_id() {
		return department_id;
	}

	public void setDepartment_id(int department_id) {
		this.department_id = department_id;
	}

	public String getDepartment_name() {
		return department_name;
	}

	public void setDepartment_name(String department_name) {
		this.department_name = department_name;
	}

	public List<User> getUsers() {
		return users;
	}

	public void setUsers(List<User> users) {
		this.users = users;
	}

	@Override
	public String toString() {
		return "Department [department_id=" + department_id
				+ ", department_name=" + department_name + ", users=" + users
				+ "]"+"\n";
	}
}

3.实体类的mapper文件
1)UserDepartmentMapper.xml,多对一,多个user对应1个department,对于每个user来说只关心自己的那个department,即每个user关联自己的department,使用association

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="employee_management.mapper.UserDepartmentMapper">
	<resultMap type="employee_management.entity.User"
		id="userDepartmentList">
		<id property="user_id" column="user_id" javaType="java.lang.Integer" />
		<result property="user_name" column="user_name" javaType="java.lang.String" />
		<result property="user_gender" column="user_gender" javaType="java.lang.String" />
		<result property="user_email" column="user_email" javaType="java.lang.String" />
		<result property="user_phone" column="user_phone" javaType="java.lang.String" />
		<result property="user_address" column="user_address" javaType="java.lang.String" />
		<result property="user_birthday" column="user_birthday"
			javaType="java.util.Date" />
		<result property="department_id" column="department_id"
			javaType="java.lang.Integer" />
			<!-- property是user实体类中department类属性的名字
			1个user有1个department-->
		<association property="department"
			javaType="employee_management.entity.Department">
			<id property="department_id" column="department_id" javaType="java.lang.Integer" />
			<result property="department_name" column="department_name"
				javaType="java.lang.String" />
		</association>
	</resultMap>
	
	<select id="getAll" resultMap="userDepartmentList">
		select u.*,d.department_name from user u left join department d on u.department_id=d.department_id;
	</select>
</mapper>

2)UserMapper.xml,一对多,使用collection,1个user对应多个role,同时也是多对多中user这一方的一对多。如果要实现多对多,还需要完成1个role对应多个user,即完成2个1对多,写法同这里,就不在赘述。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="employee_management.mapper.UserMapper">

	<!-- get user list only -->
	<resultMap type="employee_management.entity.User" id="userList">
		<id property="user_id" column="user_id" javaType="java.lang.Integer" />
		<result property="user_name" column="user_name" javaType="java.lang.String" />
		<result property="user_gender" column="user_gender" javaType="java.lang.String" />
		<result property="user_email" column="user_email" javaType="java.lang.String" />
		<result property="user_phone" column="user_phone" javaType="java.lang.String" />
		<result property="user_address" column="user_address" javaType="java.lang.String" />
		<result property="user_birthday" column="user_birthday"
			javaType="java.util.Date" />
		<result property="department_id" column="department_id"
			javaType="java.lang.Integer" />
	</resultMap>

	<!-- get user list with role -->
	<resultMap type="employee_management.entity.User" id="userRoleList"
		extends="userList">
		<!-- collection中不是javaType而是ofType,通过property也知道是list,即多个。
		extends属性,即在父resultMap的基础上再加上子resultMap的结果,在这里即再加上部门的信息。 -->
		<collection property="roles" ofType="employee_management.entity.Role">
			<id property="role_id" column="role_id" javaType="java.lang.Integer" />
			<result property="role_name" column="role_name" javaType="java.lang.String" />
		</collection>
	</resultMap>

	</resultMap>
	
<select id="getAll" resultMap="userList">
		select * from user
	</select>
<select id="getAllUserAndRole" resultMap="userRoleList">
		select u.*,r.* from
		user u left join user_role ur on u.user_id=ur.user_id
		left join role r
		on r.role_id=ur.role_id;
	</select>

结论:不管是一对多还是多对一,还是多对多,只需要知道数据是需要一对一关联还是多个结果映射到1个list,就可以很好的在实体的pojo,mapper文件中写出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis一对多,多对一,多对多 的相关文章

随机推荐

  • 纯前端--原生js将html页面变成pdf文件(html2canvas+jsPDF)

    一 html2canvas 将dom变成图片 下载或者安装html2canvas 官网 1 将文档放在本地 用原生js进行引用和使用 新建一个名为 html2canvas min js 的文件 并且将线上的内容进行复制 引入 js 文件 j
  • java+ssm汽车维修管理系统

    项目介绍 java ssm汽车维修管理系统 java ssm汽车维修管理系统 技术和环境 技术 ssm html jq 环境 jdk1 7 mysql5 7 tomcat8 x idea eclipse 数据库表的数量 7张 是否为mave
  • element-ui实现多级checkbox关联选择(权限管理)

    1 依赖element ui 只是使用了el checkbox 可以很轻松替换掉 效果图
  • 告诉你外汇交易中心最有可能掉入的九个坑

    一 外汇真能赚钱吗 预期目标多少才算合理 玩外汇的人越来越多 大部分人都是奔着暴利去的 但是现实很残酷 这个市场95 的人都是亏钱的 努力多年都不一定能赚多钱 所以想入坑的人 如果没有足够的经济支撑 不要参与这个残酷的游戏 外汇的难度大于期
  • SQL语句中的条件查询

    条件查询 什么是条件查询 不是将表中所有数据都查出来 而是查询出符合条件的 语法格式 select 字段1 字段2 from 表名 where 条件 具体条件有 lt lt gt gt 或 lt gt between and is null
  • NetCDF文件概要与读写

    NetCDF简介 NetCDF network Common Data Format 即网络通用数据格式 最早是由美国国家科学委员会资助之计划 Unidata 所发展 其用意是在Unidata计划中不同的应用项目下 提供一种可以通用的数据存
  • python抽学号程序_Python编写编程作业批量自动打分程序的思路与实现

    总体思路 把接口明确地告诉学生 本文后面的代码要求学生程序中必须有个函数叫做searchOnede 然后学生把Python程序文件 学号 姓名 py 以任何方式提交给老师 放到同一文件夹中 下面的代码首先由老师编写一个自己认为的最佳和最优实
  • React中的合成事件

    Synthetic Event 合成事件是围绕浏览器原生事件 充当跨浏览器包装器的对象 它们将不同浏览器的行为合并为一个API 这样做是为了确保事件再不同浏览器中显示一致的属性 合成事件的基本操作 基础语法 在JSX元素上 直接基于onXx
  • 【春秋云境】CVE-2022-2073靶场WP和CVE-2022-1014靶场WP

    春秋云境 CVE 2022 2073靶场WP 网站地址 https yunjing ichunqiu com 渗透测试 1 已知提示 Grav CMS 可以通过 Twig 来进行页面的渲染 使用了不安全的配置可以达到远程代码执行的效果 影响
  • 循环神经网络——上篇【深度学习】【PyTorch】【d2l】

    文章目录 6 循环神经网络 6 1 序列模型 6 1 1 序列模型 6 1 2 条件概率建模 6 1 2 代码实现 6 2 文本预处理 6 2 1 理论部分 6 2 2 代码实现 6 3 语言模型和数据集 6 循环神经网络 6 1 序列模型
  • 附答案

    1 什么是机器学习 简单的说 机器学习就是让机器从数据中学习 进而得到一个更加符合现实规律的模型 通过对模型的使用使得机器比以往表现的更好 这就是机器学习 对上面这句话的理解 数据 从现实生活抽象出来的一些事物或者规律的特征进行数字化得到
  • Ubuntu搭建FTP(vsftpd)文件服务器

    前言 在开始介绍ftp服务器如何搭建前 先来介绍一些名词概念 以下名词均和文件服务器有关 SSH Secure Shell ssh是加密的shell 最初是用来替代telnet等无加密的远程登陆 相应的一个服务器是sshd SSL Secu
  • 关于LaTex下插入的图片排列问题及图片与文本排列问题

    begin figure tb centering setlength abovecaptionskip 0pt setlength belowcaptionskip 0pt subfigure show Fig 1 label subfi
  • uboot下的mw写内存和md显示内存命令以及nand命令

    配置uboot参数 setenv ipaddr 192 168 0 10 setenv serverip 192 168 0 40 setenv gatewayip 192 168 0 1 setenv netmask 255 255 25
  • Linux 实操篇(CentOS7)

    关于Shell shell 可看作命令解释器 bin sh 命令 shell命令入口 uinx解释执行的程序 bourne shell 处理和用户的交互比较差一点 后来Linux在此基础上发展出bash shell bourne again
  • 初学stm32-库函数开发步骤及总结

    stm32库函数开发 一 外设常具备的几类寄存器 二 控制外设的常见操作 三 外设的初始化 四 数据传送 五 状态检查与清除 六 外设函数分类 一 外设常具备的几类寄存器 控制寄存器xxx CR Control Configuration
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • 日常错误整理

    DOMException Failed to execute setItem on Storage Setting the value of widgetCacheData exceeded the quota 在使用sessionStor
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • MyBatis一对多,多对一,多对多

    MyBatis中的一对多和对多一 多对多 主要就是resultMap中 association 关联 一个复杂的类型关联 许多结果将包成这种类型 多对一 嵌套结果映射 关联本身可以是一个 resultMap 元素 或者从别处引用一个 col