目录
- 域对象(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">SELECTe.*,d.id did,d.NAME dnameFROMemployee eJOIN 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
@Testpublic 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">SELECTe.*,d.id did,d.NAME dnameFROMemployee eJOIN department d ON e.dept_id = d.id</select>
One2ManyTest
@Testpublic 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();}