Mybatis 多表实现多对一查询添加操作

Posted Yan Yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 多表实现多对一查询添加操作相关的知识,希望对你有一定的参考价值。

学习内容:


1. 多对一之添加操作

1.1、需求

保存一个部门和两个员工,且这两个员工都是这个部门的。

1.2、数据库表(多对一或一对多,数据库外键都是设置在多的一方)

  • 表结构在这里插入图片描述

1.3、类设计

  • Department 实体类
package com.yy.domain;
@Setter 
@Getter 
@ToString 
public class Department { 
	private Long id; 
	private String name; 
}
  • Employee 实体类
package com.yy.domain;
@Setter 
@Getter 
@ToString 
public class Employee { 
	private Long id; 
	private String name; 
	// 关联属性 
	private Department dept; 
}

1.4、Mapper 接口和 Mapper XML 文件编写

注意: Mapper XML 放置的位置是在 resources 目录下。

  • DepartmentMapper 接口
package com.yy.mapper;
public interface DepartmentMapper { 
	void save(Department dept); 
}
  • DepartmentMapper.xml 文件
<!--
	useGeneratedKeys=true 获取数据库保存数据的的主键值 
	keyProperty="id" 主键设置设置对象的 id 属性
--> 
<insert id="save" useGeneratedKeys="true" keyProperty="id"> 
	INSERT INTO department(name) VALUES(#{name}) 
</insert>
  • EmployeeMapper 接口
package com.yy.mapper;
public interface EmployeeMapper { 
	void save(Employee employee); 
}
  • EmployeeMapper.xml 文件
<!--
	useGeneratedKeys=true 获取数据库保存数据的的主键值 
	keyProperty="id" 主键设置设置对象的 id 属性
--> 
<insert id="save" useGeneratedKeys="true" keyProperty="id"> 
	INSERT INTO employee(name, deptId) VALUES(#{name}, #{dept.id})
</insert>

1.5、编写单元测试类

public class Many2oneTest { 
	// 保存一个部门和两个员工,且这两个员工都是这个部门的 
	@Test 
	public void testSave() throws Exception { 
		Department dept = new Department(); 
		dept.setName("开发部"); 
		Employee e1 = new Employee(); 
		e1.setName("张三"); 
		e1.setDept(dept); 
		// 设置关系 
		Employee e2 = new Employee(); 
		e2.setName("李四"); 
		e2.setDept(dept); 
		// 设置关系 
		SqlSession session = MyBatisUtil.getSession(); 
		DepartmentMapper departmentMapper = session.getMapper(DepartmentMapper.class);
		EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); 
		// 先保存部门再保存员工 
		departmentMapper.save(dept); 
		employeeMapper.save(e1); 
		employeeMapper.save(e2); 
		session.commit(); 
		session.close(); 
	}
}

2. 单向多对一之额外 SQL 查询

2.1、需求

根据员工 id 查询员工,并知道该员工的所在的部门。

2.2、需要添加 Mapper 接口 和 Mapper XML

  • DepartmentMapper 接口
package com.yy.mapper;
public interface DepartmentMapper { 
	Department get(Long id);
}
  • DepartmentMapper.xml 文件
<select id="get" resultType="Department"> 
	SELECT id, name FROM department WHERE id = #{id} 
</select>
  • EmployeeMapper 接口
package com.yy.mapper;
public interface EmployeeMapper { 
	Employee get(Long id); 
}
  • EmployeeMapper.xml 文件
<select id="get" resultMap="baseResultMap"> 
	SELECT id, name, deptId FROM employee WHERE id = #{id} 
</select> 
<!-- 第一种获取 部门ID 的方式
<resultMap type="Employee" id="baseResultMap"> 
	<id column="id" property="id"/> 
	<result column="name" property="name"/> 
	<result column="deptId" property="dept.id"/> 
</resultMap>
--> 

<!-- 第二种获取 部门ID 的方式 -->
<resultMap type="Employee" id="baseResultMap"> 
	<!-- 什么列名对应值封装到对象的什么属性上 --> 
	<id column="id" property="id"/> 
	<result column="name" property="name"/> 
	<!-- 使用额外 SQL 
		association 针对的关联属性配置,非集合类型 
		select 发送什么额外 SQL 
		column 发送额外 SQL 参数取上一条 SQL 哪个列的值 
		property 封装员工对象的什么属性 
	--> 
	<association select="cn.wolfcode.mapper.DepartmentMapper.get" 
		column="deptId" property="dept" javaType="Department"/> 
</resultMap>

2.3、单元测试方法

public class Many2oneTest { 
	@Test 
		public void testGet() throws Exception { 
		SqlSession session = MyBatisUtil.getSession(); 
		EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); 
		Employee employee = employeeMapper.get(1L); 
		System.out.println(employee); session.close(); 
	} 
}

总结:

以上就是使用 Mybatis 多表实现多对一查询、添加操作了,代码仅供参考,欢迎讨论交流。

以上是关于Mybatis 多表实现多对一查询添加操作的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis多表查询(一对多,多对一,多对多)

SSM-MyBatis-15:Mybatis中关联查询(多表操作)

MyBatis多表联查

Mybatis -- Mybatis多表查询:一对一(resultmapassociation匹配)一对多(collection集合)多对多(中间表)

mybatis框架学习-多表查询

Mybatis基于注解实现多表查询