Mybatis框架总结五---自定义映射

自定义映射

一.数据库字段与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作为部门识别标识
员工信息设计表
使用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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值