在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系;
对象之间关系主要是四种:
一对一 关系
一个人对应身份证id,一个QQ号对应一个QQ空间
一对多 关系
一个部门对应多个员工
多对一 关系
多个员工对应一个部门
多对多 关系
多个学生对应多个老师,多个学生对应多个课程
什么关系应该从哪个对象作为中心点来看
一对多, 以one方作为中心点
MyBatis框架支持多表查询封装对象之间关系
和上一篇 一对多N+1策略对比, 一对多-等值连接策略 可能从性能上稍微比 N+1策略对比 稍好一点
One2ManyMapper.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"> <!-- 映射标签,内部就编写具体的映射sql语句 namespace :命名空间,值 必须是 对应接口的全限定名 = 包名 +简单类名 top.abcdit.mybatis.mapper.One2ManyMapper --> <mapper namespace="top.abcdit.mybatis.mapper.One2ManyMapper"> <select id="selectByPrimaryKey" parameterType="int" resultMap="dept_map"> select e.id e_id ,e.name e_name,d.id d_id,d.name d_name from employee e,department d where e.dept_id = d.id and d.id = #{id} </select> <resultMap type="top.abcdit.mybatis.pojo.Department" id="dept_map"> <id column="id" property="id"/> <result column="name" property="name"/> <!-- 问题: private List<Employee> employees; 员工集合如何映射? 解决方案:使用 <collection>集合标签,在内部映射多方(员工)的信息 <collection property="" column="" select=""/> property :需要映射的属性 此时就是 employees ofType:需要映射集合employees 的泛型 --> <collection property="employees" ofType="top.abcdit.mybatis.pojo.Employee"> <!-- 员工对象的主键列映射 --> <id property="id" column="e_id"/> <!-- 员工对象非主键列映射 --> <result property="name" column="e_name"/> </collection> </resultMap> </mapper>
输出结果一样:
DEBUG [main] - ==> Preparing: select e.id e_id ,e.name e_name,d.id d_id,d.name d_name from employee e,department d where e.dept_id = d.id and d.id = ? DEBUG [main] - ==> Parameters: 2(Integer) TRACE [main] - <== Columns: e_id, e_name, d_id, d_name TRACE [main] - <== Row: 2, 虚竹, 2, 研发部 DEBUG [main] - <== Total: 1 Department [id=null, name=null, employees=[Employee [id=2, name=虚竹]]]