自定义映射resultMap

332 阅读2分钟

resultMap标签介绍

当字段名和实体类中的属性名不一致的时候,可以通过resultMap设置自定义映射.

resultMap标签的属性

  • id:表示自定义映射的唯一标识,不能重复(通过id来引入resultMap标签)

  • type:查询的数据对应的实体类的类型

  • 子标签:

  • id:设置主键的映射关系

    • result:设置普通字段的映射关系

    • 子标签属性:

    • property:设置对应实体类中的属性名

      • column:设置对应表中的字段名

resultMap的使用

resultMap 一般使用在查询语句中。当字段名和实体类中的属性仅仅是名称不一样时resultMap的使用比较简单粗暴,具体使用:在resultMap标签中的子标签id设置主键的对应关系,子标签result中的property中设置对应java对象的属性名称,在column设置对应数据库中表的字段名,最后再在select标签中通过resultMap引入即可。此类使用比较简单,下面重点介绍多对一映射处理中resultMap的使用.

对一映射处理中resultMap的使用

员工和部门的关系:多对一

image.png
需求:查询员工信息以及员工所对应的部门信息

1.级联方式处理映射关系

在resultMap中直接采用对象.属性名的方式进行对应。

`<resultMap id="empAndDeptResultMapOne" 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>
	<result property="dept.did" column="did"></result>
	<result property="dept.deptName" column="dept_name"></result>
</resultMap>`

select标签中引入resultMap,写入对应的SQL语句

<select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">
	select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
</select>

2使用association处理映射关系

  • association:处理多对一的映射关系
  • property:需要处理多对的映射关系的属性名
  • javaType:该属性的类型 在resultMap标签内部加入association子标签,通过对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="dept" javaType="Dept">
		<id property="did" column="did"></id>
		<result property="deptName" column="dept_name"></result>
	</association>    //association标签 内部id result同resultMap标签中的使用
</resultMap>

同样引入resultMap标签

<select id="getEmpAndDept" resultMap="empAndDeptResultMapTwo">
	select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
</select>

3分步查询

通过先查询员工信息,进而根据员工信息来查询部门信息的方法叫做分布查询 分布查询也采用associattion标签,只不过在association标签内部,使用的是property,select,column三个属性.

  • property属性同上
  • select:设置分布查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
  • column:设置分步查询的条件
3.1查询员工信息(该方法在员工类中设置)
<resultMap id="empAndDeptByStepResultMap" 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="dept"
				 select="com.wqy.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
				 column="did"></association>
</resultMap>
<!--Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);-->
<select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
	select * from t_emp where eid = #{eid}
</select>
3.2查询部门信息(该方法在部门类中设置)
<resultMap id="EmpAndDeptByStepTwoResultMap" type="Dept">
	<id property="did" column="did"></id>
	<result property="deptName" column="dept_name"></result>
</resultMap>
<!--Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);-->
<select id="getEmpAndDeptByStepTwo" resultMap="EmpAndDeptByStepTwoResultMap">
	select * from t_dept where did = #{did}
</select>