目录
- 域对象(domain)之间的关系
- A 表结构上是如何设计关系的
- B 实体对象上是如何设计关系的
- 回顾多表查询
 
- 结果映射
- 多对一/一对一
- Domain
- Department
- Employee
 
- Mapper
- EmployeeMapper
- EmployeeMapper_嵌套结果.xml(推荐使用)
- EmployeeMapper_嵌套查询.xml
 
- Many2OneTest
 
- 一对多
- domain
- Department
- Employee
 
- mapper
- DepartmentMapper
- DepartmentMapper_嵌套查询.xml(建议使用)
- DepartmentMapper_嵌套结果.xml
 
- One2ManyTest
 
 
- 缓存
 
 
域对象(domain)之间的关系
关系:java对象之间的关系
 分类:1. 一对多,2. 多对一,3. 一对一,4. 多对多,
A 表结构上是如何设计关系的

 
 
B 实体对象上是如何设计关系的

回顾多表查询
先查出宽表,取别名,然后做自定义映射
 
结果映射
为什么要使用结果映射
 原因一:解决表字段名和对象属性名不一样的情况.
 原因二:关联对象查询,在mybatis不会默认查询出来,需要自己查询结果并且通过resultMap来配置
关联映射处理方式
 嵌套查询和嵌套结果
 
多对一/一对一
Domain
Department
@Data
public class Department {
    private Long id;
    private String name;
}
Employee
@Data
public class Employee {
    private Integer id;
    private String name;
    /*在多对一种:通过对象引用来表明关系*/
    private Department dept;
}
Mapper
EmployeeMapper
public interface EmployeeMapper {
    List<Employee> loadAll();
}
EmployeeMapper_嵌套结果.xml(推荐使用)
   <!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="employeeMap" type="cn.itsource.many2one.domain.Employee">
        <!--id:主键       property:Employee对象里的属性     column:宽表列名-->
        <id property="id" column="id"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="name"/>
        <!--association:绑定一个对象  javaType:申明引用属性的类型-->
        <association property="dept" javaType="cn.itsource.many2one.domain.Department">
            <id property="id" column="did"/>
            <result property="name" column="dname"/>
        </association>
    </resultMap>
    
    <!--resultMap 我们自定义的结果集映射,作用:用来绑定对应引用属性值的-->
    <select id="loadAll" resultMap="employeeMap">
        SELECT
            e.*,
            d.id did,
            d.NAME dname
        FROM
            employee e
        JOIN department d ON e.dept_id = d.id
    </select>
EmployeeMapper_嵌套查询.xml
    <!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="employeeMap" type="cn.itsource.many2one.domain.Employee">
        <!--id:主键       property:Employee对象里的属性     column:宽表列名-->
        <id property="id" column="id"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="name"/>
        <!-- association:绑定一个对象     column:外层sql查询出来的列名     select:指明要使用的sql-->
        <association property="dept"
                     column="dept_id"
                     select="cn.itsource.many2one.mapper.EmployeeMapper.loadDeptById"
                     javaType="cn.itsource.many2one.domain.Department">
        </association>
    </resultMap>
    <!--1.查询出员工数据-->
    <select id="loadAll" resultMap="employeeMap">
        SELECT * from employee
    </select>
    <!--2.根据员工表中的dept_id 查询出部门数据-->
    <select id="loadDeptById" parameterType="long" resultType="cn.itsource.many2one.domain.Department">
        SELECT * from department where id = #{id}
    </select>
Many2OneTest
    @Test
    public void testMany2One() {
        //1.获取连接
        SqlSession session = MybatisUtil.getSession();
        //2.得到mapper对象
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        //3.执行操作
        mapper.loadAll().forEach(a -> {
            System.out.println(a);
        });
        //4.释放资源
        session.close();
    }
一对多
domain
Department
@Data
public class Department {
    private Long id;
    private String name;
    /*在一对多中:通过集合引用属性来表明关系*/
    private List<Employee> employees;
}
Employee
@Data
public class Employee {
    private Long id;
    private String name;
}
mapper
DepartmentMapper
public interface DepartmentMapper {
    List<Department> loadAll();
}
DepartmentMapper_嵌套查询.xml(建议使用)
	<!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="departmentMap" type="cn.itsource.one2many.domain.Department">
        <!--id:主键       property:Department对象里的属性     column:宽表列名-->
        <id property="id" column="id"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="name"/>
        <!--collection:对应多个对象  ofType:申明集合引用属性类型-->
        <collection property="employees"
                    column="id"
                    select="loadEmpsByDeptId"
                    ofType="cn.itsource.one2many.domain.Employee">
        </collection>
    </resultMap>
    <!--resultMap 我们自定义的结果集映射,作用:用来绑定对应引用属性值的-->
    <select id="loadAll" resultMap="departmentMap">
        select * from department
    </select>
    <!--通过部门ID查询出部门下的员工-->
    <select id="loadEmpsByDeptId" parameterType="long" resultType="cn.itsource.one2many.domain.Employee">
        select * from employee where dept_id = #{id}
    </select>
DepartmentMapper_嵌套结果.xml
    <!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="departmentMap" type="cn.itsource.one2many.domain.Department">
        <!--id:主键       property:Department对象里的属性     column:宽表列名-->
        <id property="id" column="did"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="dname"/>
        <!--collection:对应多个对象  ofType:申明集合引用属性类型-->
        <collection property="employees" ofType="cn.itsource.one2many.domain.Employee">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
        </collection>
    </resultMap>
    
    <!--resultMap 我们自定义的结果集映射,作用:用来绑定对应引用属性值的-->
    <select id="loadAll" resultMap="departmentMap">
        SELECT
            e.*,
            d.id did,
            d.NAME dname
        FROM
            employee e
        JOIN department d ON e.dept_id = d.id
    </select>
One2ManyTest
    @Test
    public void testOne2Many() {
        //1.获取连接
        SqlSession session = MybatisUtil.getSession();
        //2.得到mapper对象
        DepartmentMapper mapper = session.getMapper(DepartmentMapper.class);
        //3.执行操作
        mapper.loadAll().forEach(a -> {
            System.out.println(a);
        });
        //4.释放资源
        session.close();
    }
缓存







![[C语言]深入浅出,带你构建C语言宏观框架](https://img-blog.csdnimg.cn/7b3b2a8dece74c6ab5131ca5de08712a.png)












