解决多对一的映射
加入我们在做公司管理系统的时候,我们员工的实体类和部门的实体类肯定是分开创建的呀,但如果此时我们现在想同时查出员工和他所在的部门信息,没有实体类来接收我们的映射,那怎么解决这样的问题呢?
级联属性赋值
第一步:Emp实体类里面添加一个Dept对象:
第二步:EmpMapper接口添加接口方法:
第三步:EmpMapper映射文件:
Assocaition
Assocaition是relaultMap里面自带的一种专门负责处理多对一映射关系的标签,如果说上面这个方法是创建了专门的属性来接收,那这个方法就是专门创建了对象
第一步:Emp实体类里面添加一个Dept对象:
第二步:EmpMapper接口添加接口方法:
第三步:EmpMapper映射文件:
<!--处理多对一映射关系方式二:association--> <resultMap id="empAndDeptResultMapTWO" type="Emp"> <id property="eid" column="eid"></id> <result property="empName" column="emp_name"></result> <result property="age" column="age"></result> <result property="sex" column="sex"></result> <result property="email" column="email"></result> <!-- association:处理多对一的映射关系 property:需要处理多对的映射关系的属性名 javaType:该属性的类型 --> <association property="dept" javaType="Dept"> <id property="did" column="did"></id> <result property="deptName" column="dept_name"></result> </association> </resultMap> <!-- Emp getEmpAndDept(@Param("eid") Integer eid);--> <select id="getEmpAndDept" resultMap="empAndDeptResultMapTWO"> select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid = #{eid} </select>
分步查询
分步分步,顾名思义,将一个原本一下就干完的一件事情,我们分成两件事情来干,相同,那对于查询,我们是不是也可以把一句sql分成两句来执行,例如:
等价于
那么如何实现呢?
第一步:Emp实体类里面添加一个Dept对象:
第二步:EmpMapper接口添加接口方法:
第三步:EmpMapper映射文件:
第四步:DeptMapper接口添加接口方法:
第五步:DeptMapper映射文件:
延迟加载
什么是延迟加载?
看到我们上面提到的分布查询方法,我们是不是都会想,为什么还要那么麻烦?还要多此一举分成两步来解决这个问题呢?直接了当的一句它不香吗?其实你仔细想想如果分成两步,我们不单单只可以用它来解决那一个问题呀,如果我们直接想用其中的某一步方法对于Dept的那步方法来说我们可以直接调用,但对于Emp里面的那个方法他执行的时候不顺带把Dept里面的方法也执行了吗?
延迟加载:当前我们访问哪些信息,我们就会执行哪些sql语句
怎么样开启延迟加载呢?
第一步:配置文件
第二步:映射文件里面association标签里面修改fetchType属性:
解决一对多的映射
当你想查询一个部门的同时,顺带查出这个部门所有成员的信息
Collection
第一步:Dept实体类:
第二步:DeptMapper接口添加接口方法:
第三步:DeptMapper映射文件:
分布查询
第一步:Dept实体类:
第二步:DeptMapper接口添加接口方法:
第三步:DeptMapper映射文件:
第四步:EmpMapper接口添加接口方法:
第五步:EmpMapper映射文件:
总之总结一句话:多对一创对象,一对多创集合