Mybatis连3表查询数据resultMap结果映射

Mybatis连结3表查询数据resultMap结果映射

一、前言                                                                                                                                    

Mybatis实现了sql与java代码的分离,达到了解耦合的目的,配置sql语句时有个resultType=""的属性,用于定义sql查询返回结果数据类型,但它有局限性,就是当连表查询的时候,你很难说定义返回的是某一个类型,这时就需要用到一个标签了,那就是resultMap,结果映射.

二、从sql查询结果到模型实体                                                                                                     

在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程。

  1. 通过JDBC查询得到ResultSet对象

  2. 遍历ResultSet对象并将每行数据暂存到HashMap实例中,以结果集的字段名或字段别名为键,以字段值为值

  3. 根据ResultMap标签的type属性通过反射实例化领域模型

  4. 根据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回

三、ResultMap标签                                                                                                                 

id属性:标识resultMap,通过它去识别.

type属性:返回值类型,类的全定向名.

autoMapping属性:值为true(默认)|false,是否自动映射。自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在`resultMap`内明确注明映射关系才会调用对应的setter方法。

四、ResultMap中子标签                                                                                                          

在讲标签时先讲述下数据库中表数据的对应关系,如一对一,一对多,多对多等关系,具体来说,如有一个俱乐部表,一个全员表,一个俱乐部里有许多球员,而许多球员对应一个俱乐部,则俱乐部与球员之间的关系就是一对多与多对一的关系。


<collection>子标签:对应表格关系中的多

<association>子标签:对应表格关系中的一

五、联结三表示例                                                                                                                       

示例是联结三表,查询结果作为示范,就算联结再多表也能举一反三。这三个表的关系如下图

sql语句联结:http://download.csdn.net/detail/sunrise_zhu/9687991
核心代码:
clubMapper.xml中结果映射
<!-- 结果映射 -->
<resultMap type="com.sxt.entity.Club" id="clubBean" autoMapping="true">
<!--column指向数据库列名   property指向pojo对象中字段名-->
	<result column="cid" property="cid"/>
	<result column="cname" property="cname"/>
	<result column="city" property="city"/>
	<!-- property指的是在bean中字段名 ofType类的全定向名 -->
	<collection property="players" ofType="com.sxt.entity.Player">
		<result column="pid" property="pid"/>
		<result column="pname" property="pname"/>
		<result column="position" property="position"/>
		<result column="cid" property="cid"/>
		<association property="abilities" javaType="com.sxt.entity.Abilities">
			<result column="aid" property="aid"/>
			<result column="pid" property="pid"/>
			<result column="shoot" property="shoot"/>
		</association>
	</collection>
</resultMap>
clubMapper.xml中sql语句
<select id="joinTwo" resultMap="clubBean">
	select c.*,p.*,a.* 
	from clubs c 
	join player p
	on c.cid = p.cid 
	join abilities a 
	on a.pid = p.pid;
</select>
playerMapper.xml中的结果映射:
<!-- 结果映射 -->
	<resultMap type="com.sxt.entity.Player" id="playerBean">
		<!--column指向数据库列名 property指向pojo对象中字段名 -->
		<result column="pid" property="pid" />
		<result column="pname" property="pname" />
		<result column="position" property="position" />
		<result column="cid" property="cid" />
		<association property="club" javaType="com.sxt.entity.Club">
			<result column="cid" property="cid" />
			<result column="cname" property="cname" />
			<result column="city" property="city" />
		</association>
		<association property="abilities" javaType="com.sxt.entity.Abilities">
			<result column="aid" property="aid"/>
			<result column="pid" property="pid"/>
			<result column="shoot" property="shoot"/>
		</association>
	</resultMap>
abilitiesMapper.xml结果映射
<!-- 结果映射 -->
	<resultMap type="com.sxt.entity.Abilities" id="abilitiesBean">
		<!--column指向数据库列名 property指向pojo对象中字段名 -->
		<result column="aid" property="aid"/>
		<result column="pid" property="pid"/>
		<result column="shoot" property="shoot"/>
		<association property="player" javaType="com.sxt.entity.Player">
			<result column="pid" property="pid"/>
			<result column="pname" property="pname"/>
			<result column="position" property="position"/>
			<result column="cid" property="cid"/>
		</association>

五、参考文件                                                                                                                           

http://www.cnblogs.com/fsjohnhuang/p/4076592.html








  • 19
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
MyBatis自连接三级联动和resultMap三级映射是一种常见的数据查询映射方式。下面我来解释一下。 首先,自连接三级联动是指在数据库中,存在一个,其中的某些字段关联到该的自身字段。通常情况下,我们需要使用连续的JOIN语句来实现多级联动查询。在MyBatis中,可以使用XML配置文件或注解来定义SQL语句,然后使用resultMap进行结果的映射。 在XML配置文件中,可以使用<resultMap>元素来定义映射关系。对于自连接的情况,可以使用嵌套的<association>或<collection>元素来示关联关系。例如: ```xml <resultMap id="userMap" type="User"> <id property="id" column="id" /> <result property="name" column="name" /> <association property="manager" javaType="User"> <id property="id" column="manager_id" /> <result property="name" column="manager_name" /> <collection property="subordinates" ofType="User"> <id property="id" column="subordinate_id" /> <result property="name" column="subordinate_name" /> ... </collection> </association> </resultMap> ``` 上述代码中,定义了一个名为userMapresultMap映射了User对象及其关联的manager和subordinates字段。 在实际查询时,可以使用嵌套的SELECT语句或连续的JOIN语句来实现自连接的多级联动查询。例如: ```xml <select id="getUserWithManagerAndSubordinates" resultMap="userMap"> SELECT u.id, u.name, m.id AS manager_id, m.name AS manager_name, s.id AS subordinate_id, s.name AS subordinate_name FROM user u LEFT JOIN user m ON u.manager_id = m.id LEFT JOIN user s ON u.id = s.manager_id WHERE u.id = #{id} </select> ``` 上述代码中,使用了连续的LEFT JOIN语句来查询用户及其关联的上级经理和下级员工信息。 通过以上的配置和查询,就可以实现MyBatis中的自连接三级联动和resultMap三级映射。希望能对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值