文章目录

  • 自定义映射
  • 一.数据库字段与Java类属性名不一致
  • 二.resultMap自定义映射
  • 1.resultMap简单使用
  • 2.association联合查询
  • 3.association分步查询
  • 4.分步查询之延迟加载
  • 三.collection


自定义映射

一.数据库字段与Java类属性名不一致

三种解决方法:
i.开启驼峰转换
ii.数据库字段取别名
iii.resultMap自定义映射

二.resultMap自定义映射

1.resultMap简单使用

Emp类对象中用dept_id作为部门识别标识

public class Emp {
	private Integer eid;
	private String ename;
	private Integer age;
	private String gender;
	private Integer dept_id;
}

数据库emp表中用did作为部门识别标识

mapbatis resultMap映射的字段数量和查询你的字段数量要一致吗_ci


使用ResultMap自定义映射实现did到dept_id的映射

<select id="getEmpByEid" resultMap="myEmp">
		select
		eid,ename,age,gender,did from emp where eid=#{eid}
	</select>

	<resultMap type="com.bean.Emp" id="myEmp">
		<id column="eid" property="eid"></id>
		<result column="ename" property="ename" />
		<result column="age" property="age" />
		<result column="gender" property="gender" />
		<result column="did" property="dept_id" />
	</resultMap>

2.association联合查询

POJO中的属性可能会是一个对象,我们可以使用联合查询,并以级联的方式封装对象。使用association标签定义对象的封装规则

i.Emp类对象中Oder属性也是一个对象

public class Emp {
	private Integer eid;
	private String ename;
	private Integer age;
	private String gender;
	private Integer dept_id;
	private Dept dept;
}
public class Dept {
	private Integer did;
	private String dname;
}

ii.方法一:使用级联的方式

<select id="getEmpByEid" resultMap="myEmp">
		select
		e.eid,e.ename,e.age,e.gender,e.did,d.did,d.dname from emp e, dept d
		where e.eid=#{eid} AND d.did=e.did
	</select>

	<resultMap type="com.bean.Emp" id="myEmp">
		<id column="eid" property="eid"></id>
		<result column="ename" property="ename" />
		<result column="age" property="age" />
		<result column="gender" property="gender" />
		<result column="did" property="dept_id" />
		<result column="did" property="dept.did" />
		<result column="dname" property="dept.dname" />
	</resultMap>

iii.方法二:association方式

<select id="getEmpByEid" resultMap="myEmp2">
		select
		e.eid,e.ename,e.age,e.gender,e.did,d.did,d.dname from emp e, dept d
		where e.eid=#{eid} AND d.did=e.did
	</select>
    <resultMap type="com.bean.Emp" id="myEmp2">
        <id column="eid" property="eid"/>
        <result column="ename" property="ename"/>
        <result column="age" property="age"/>
        <result column="gender" property="gender"/>
        <result column="did" property="dept_id"/>
        <association javaType="com.bean.Dept" property="dept" >
          <id column="did" property="did"/>
          <result column="dname" property="dname"/>
        </association>
    </resultMap>

3.association分步查询

在实际开发中,每个实体类都应该具有具体的增删改查方法,即DAO层
案例:查询员工信息后,根据获得的员工部门id查询该部门,dept作为Emp类的一个属性同时也是一个实体类,所以需要采用联合查询的方式。

<select id="getEmpAndDept" resultMap="myEmpAndDept">
       select eid,ename,age,gender,did from emp where eid=#{eid}
    </select>
    <select id="getDeptByDid" resultType="com.bean.Dept">
       select did,dname from dept where did=#{did}
    </select>
    <!-- association分步查询 -->
    <resultMap type="com.bean.Emp" id="myEmpAndDept">
		<id column="eid" property="eid" />
		<result column="ename" property="ename" />
		<result column="age" property="age" />
		<result column="gender" property="gender" />
		<result column="did" property="dept_id" />                      
		<association property="dept" select="com.mapper.ResultMapMapper.getDeptByDid"
		column="did" fetchType="eager">
		</association>
	</resultMap>

4.分步查询之延迟加载

延迟加载只存在于分步查询中,本质是为第一步查询返回的Java Bean创建一个代理对象;
开启延迟加载只需在全局配置文件中设置如下两个设置:

<!-- lazyLoadingEnabled开启延时加载 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		
		<!-- aggressiveLazyLoading是否与延时加载冲突 -->
		<setting name="aggressiveLazyLoading" value="false"/>

进行如上设置之后,会为所有的分步查询都开启延迟加载的功能,那如果不想让某个分步查询开启延迟加载功能该怎么设置呢?
可通过fetchType属性来覆盖全局设置lazyLoadingEnabled的作用,设置fetchType后lazyLoadingEnabled便不再对selec起作用t。
fetchType有两个值:
i.eager:不开启
ii.lazy:开启

三.collection

POJO中的属性可能是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象。使用collection标签定义对象的封装规则
i.Dept类,有几个集合对象的属性

public class Dept {
	private Integer did;
	private String dname;
	private List<Emp> emps;
}

ii.collection联合查询

<!-- collection查询:获取部门及部门中所有员工的信息 -->
	<select id="getDeptAndEmpsByDid" resultMap="myDeptAndEmps">
		select d.did
		did,d.dname dname,e.eid eid, e.ename ename,e.age age,
		e.gender gender
		from dept d left outer join emp e on d.did=e.did
		where d.did=#{did}
	</select>
	<resultMap type="com.bean.Dept" id="myDeptAndEmps">
		<id column="did" property="did" />
		<result column="dname" property="dname" />
		<!-- property:关联的属性名 ofType:集合中元素类型 -->
		<collection property="emps" ofType="com.bean.Emp">
			<id column="eid" property="eid" />
			<result column="ename" property="ename" />
			<result column="age" property="age" />
			<result column="gender" property="gender" />
		</collection>
	</resultMap>

iii.collection分步查询

<!-- colleation分步查询:和 -->
	<select id="getDeptAndEmpsByDidStep"
		resultMap="myDeptAndEmpsStep">
		select did,dname from dept where did=#{did}
	</select>
	
	<!-- getEmpsByDid:获取某部门 -->
	<select id="getEmpsByDid" resultType="com.bean.Emp">
	    select eid,dname,age,gender,did from emp where did=#{did}
	</select>
	
	<resultMap type="com.bean.Dept" id="myDeptAndEmpsStep">
		<id column="did" property="did" />
		<result column="dname" property="dname" />
		<collection property="emps"
		select ="com.mapper.getEmpByDid" column="did"
		></collection>
	</resultMap>