zoukankan      html  css  js  c++  java
  • 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;
    }

    按结果嵌套处理

    按查询嵌套处理

  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/Master-Sun/p/14313379.html
Copyright © 2011-2022 走看看