mybatis 梳理15--搭建多表环境、在“多”的一方维护、在“一”的一方维护(重要)

部门和员工的关系,一个部门多个员工,一个员工属于一个部门

我们可以采取两种方式来维护关系,一种在“一”的一方,一种在“多”的一方!

 

数据库设计

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;
}

 

 

按结果嵌套处理

 

 

 

 

 

 

 

 

 

 

按查询嵌套处理

 

posted @ 2021-01-22 15:03  Master_Sun  阅读(110)  评论(0编辑  收藏  举报