select_resultMap_关联查询_association定义关联对象封装规则,关联查询_分步查询&延迟加载

来源:互联网 发布:mac ftp 看不到文件夹 编辑:程序博客网 时间:2024/06/05 04:52
<?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"><mapper namespace="com.atguigu.mybatis.dao.EmployeeMapperPlus"><!--自定义某个javaBean的封装规则type:自定义规则的Java类型id:唯一id方便引用  --><resultMap type="com.atguigu.mybatis.bean.Employee" id="MySimpleEmp"><!--指定主键列的封装规则id定义主键会底层有优化;column:指定哪一列property:指定对应的javaBean属性  --><id column="id" property="id"/><!-- 定义普通列封装规则 --><result column="last_name" property="lastName"/><!-- 其他不指定的列会自动封装:我们只要写resultMap就把全部的映射规则都写上。 --><result column="email" property="email"/><result column="gender" property="gender"/></resultMap><!-- resultMap:自定义结果集映射规则;  --><!-- public Employee getEmpById(Integer id); --><select id="getEmpById"  resultMap="MySimpleEmp">select * from tbl_employee where id=#{id}</select><!-- 场景一:查询Employee的同时查询员工对应的部门Employee===Department一个员工有与之对应的部门信息;id  last_name  gender    d_id     did  dept_name (private Department dept;) -->  <!--联合查询:级联属性封装结果集  --><resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDifEmp"><id column="id" property="id"/><result column="last_name" property="lastName"/><result column="gender" property="gender"/><result column="did" property="dept.id"/><result column="dept_name" property="dept.departmentName"/></resultMap><!-- 使用association定义关联的单个对象的封装规则; --><resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDifEmp2"><id column="id" property="id"/><result column="last_name" property="lastName"/><result column="gender" property="gender"/><!--  association可以指定联合的javaBean对象property="dept":指定哪个属性是联合的对象javaType:指定这个属性对象的类型[不能省略]--><association property="dept" javaType="com.atguigu.mybatis.bean.Department"><id column="did" property="id"/><result column="dept_name" property="departmentName"/></association></resultMap><!--  public Employee getEmpAndDept(Integer id);--><select id="getEmpAndDept" resultMap="MyDifEmp">SELECT e.id id,e.last_name last_name,e.gender gender,e.d_id d_id,d.id did,d.dept_name dept_name FROM tbl_employee e,tbl_dept dWHERE e.d_id=d.id AND e.id=#{id}</select><!-- 使用association进行分步查询:1、先按照员工id查询员工信息2、根据查询员工信息中的d_id值去部门表查出部门信息3、部门设置到员工中; -->  <!--  id  last_name  email   gender    d_id   --> <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmpByStep"> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <!-- association定义关联对象的封装规则 select:表明当前属性是调用select指定的方法查出的结果 column:指定将哪一列的值传给这个方法  流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性  --> <association property="dept"  select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById" column="d_id"> </association> </resultMap> <!--  public Employee getEmpByIdStep(Integer id);--> <select id="getEmpByIdStep" resultMap="MyEmpByStep"> select * from tbl_employee where id=#{id} <if test="_parameter!=null"> and 1=1 </if> </select>  <!-- 可以使用延迟加载(懒加载);(按需加载) Employee==>Dept: 我们每次查询Employee对象的时候,都将一起查询出来。 部门信息在我们使用的时候再去查询; 分段查询的基础之上加上两个配置:  --><!-- ==================association============================ --><!-- 场景二:查询部门的时候将部门对应的所有员工信息也查询出来:注释在DepartmentMapper.xml中 --><!-- public List<Employee> getEmpsByDeptId(Integer deptId); --><select id="getEmpsByDeptId" resultType="com.atguigu.mybatis.bean.Employee">select * from tbl_employee where d_id=#{deptId}</select><!-- =======================鉴别器============================ --><!-- <discriminator javaType=""></discriminator>鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为封装Employee:如果查出的是女生:就把部门信息查询出来,否则不查询;如果是男生,把last_name这一列的值赋值给email; --> <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmpDis"> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <!-- column:指定判定的列名 javaType:列值对应的java类型  --> <discriminator javaType="string" column="gender"> <!--女生  resultType:指定封装的结果类型;不能缺少。/resultMap--> <case value="0" resultType="com.atguigu.mybatis.bean.Employee"> <association property="dept"  select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById" column="d_id"> </association> </case> <!--男生 ;如果是男生,把last_name这一列的值赋值给email; --> <case value="1" resultType="com.atguigu.mybatis.bean.Employee"> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="last_name" property="email"/> <result column="gender" property="gender"/> </case> </discriminator> </resultMap></mapper>

0 0