部门和员工的关系,一个部门多个员工,一个员工属于一个部门
我们可以采取两种方式来维护关系,一种在“一”的一方,一种在“多”的一方!
数据库设计
CREATE TABLE `dept` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) INSERT INTO dept VALUES (1, '欣知开发四部'); CREATE TABLE `employee` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `did` INT(10) DEFAULT NULL, PRIMARY KEY (`id`), CONSTRAINT `fk_did` FOREIGN KEY (`did`) REFERENCES `dept` (`id`) ) INSERT INTO employee VALUES (1, '邸智伟', 1); INSERT INTO employee VALUES (2, '成虹', 1); INSERT INTO employee VALUES (3, '康永亮', 1); INSERT INTO employee VALUES (4, '杨春旺', 1); INSERT INTO employee VALUES (5, '陈建强', 1);
三种方式
1、自己手动维护
自己维护,多写几个语句,使用java组装,有时候使用mybatis维护关系反而复杂,不如自己维护。
(1)先搜索部门
(2)根据部门搜索员工
(3)手动拼装
2、在多的一方维护关系
准备工作:
(1) 编写实体类
部门Dept
员工Employee
@Data public class Dept { private int id; private String name; }
@Data public class Employee { private int id; private String name;
//维护关系!!!!!!!!!!!!!!!!!!!!!!!!!!!! private Dept dept; }
(2)编写实体类对应的Mapper接口
public interface DeptMapper { }
public interface EmployeeMapper { }
(3)编写Mapper接口对应的 mapper.xml配置文件
DeptMapper.xml
<?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="com.xinzhi.dao.DeptMapper"> </mapper>
EmploteeMapper.xml
<?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="com.xinzhi.dao.EmployeeMapper"> </mapper>
按查询嵌套,级联查询处理,就像SQL中的子查询
(1)写方法
/** * 获取所有的员工 * @return */ List<Employee> findAllEmployees();
(2)mapper处理
<?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="com.xinzhi.dao.EmployeeMapper"> <resultMap id="EmployeeDept" type="com.xinzhi.entity.Employee"> <!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名--> <association property="dept" column="dId" javaType="com.xinzhi.entity.Dept" select="getDept"/> </resultMap> <select id="findAllEmployees" resultMap="EmployeeDept"> select * from employee </select> <select id="getDept" resultType="com.xinzhi.entity.Dept"> select * from dept where id = #{id} </select> </mapper>
(3)编写完毕去Mybatis配置文件中,注册Mapper
(4)测试
@Test public void testFindAllEmployees() { EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); List<Employee> allEmployees = mapper.findAllEmployees(); for (Employee allEmployee : allEmployees) { System.out.println(allEmployee); } }
按结果嵌套处理,就像SQL中的联表查询
1、接口方法编写
List<Employee> findAllEmployees2();
2、编写对应的mapper文件
<select id="findAllEmployees2" resultMap="EmployeeDept2" > select e.id eid,e.name ename, d.id did,d.name dname from employee e,dept d where d.id = e.did </select> <resultMap id="EmployeeDept2" type="com.xinzhi.entity.Employee"> <id property="id" column="eid"/> <result property="name" column="ename"/> <!--关联对象property 关联对象在Student实体类中的属性--> <association property="dept" javaType="com.xinzhi.entity.Dept"> <id property="id" column="did"/> <result property="name" column="dname"/> </association> </resultMap>
3、去mybatis-config文件中配置
<mapper resource="com/xinzhi/dao/DeptMapper.xml"/> <mapper resource="com/xinzhi/dao/EmployeeMapper.xml"/>
4、测试
@Test public void testFindAllEmployees2() { EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); List<Employee> allEmployees = mapper.findAllEmployees2(); for (Employee allEmployee : allEmployees) { System.out.println(allEmployee); } }
3、在一的一方维护关系
实体类:
@Data public class Dept { private int id; private String name; //用于关系维护!!!!!!!!!!!!!!!!!!!!! List<Employee> employees; }
@Data public class Employee { private int id; private String name; }
按结果嵌套处理
按查询嵌套处理