目录
- 域对象(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();
}