mybatis学习(二)---resultMap

一、基础


二、id、result

id,result标签,这两个标签的属性配置细节:

  • property: 需要映射到你所写的JavaBean 对象的属性名称。
  • column: 数据库中查询出来或者要添加进去的列名或者标签别名。
  • javaType: 一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。没有试过映射到hashmap,有时间试一下。
  • jdbcType: mybatis中resultMap标签不需要,不过select、insert等标签在传递的参数为null时需要指定jdbcType。eg:mybatis用户指南中,myBlog.setTitle(null)会报错,解决方法:insert into ... values (....#{titile jdbcType=VARCHAR},详情需要的时候自己查看。
  • typeHandler:没有用过,也没看懂。
id标签一定要有,为了标识结果集的唯一性。如果没有id,则默认第一个result为唯一性标识。
以下是我的程序,只贴关键,给自己看
<resultMap type="UtilRatePojo" id="utilrate">
		<result property="utilrate" column="utilrate" javaType="float"/>
		<association property="cmp" javaType="CmpsPojo">
			<id property="cid" column="cid"/>
			<result property="cmp" column="cmp"/>
			<result property="flr" column="floor"/>
		</association>
	</resultMap>

查询出来每个CmspPojo对应的使用率utilrate。在数据库一共查出六条数据。
Columns: cid,cmp ,floor,utilrate
 Row1: 8,蒋震,四层西2,0.01
 Row2: 11,蒋震图书馆,四层西1,0.01
 Row3: 2 ,蒋震图书馆,二层,0.03
 Row4: 6 ,蒋震,六层西2,0
 Row5: 7 ,蒋震,六层西1,0
 Row6: 3, 蒋震图书馆, 六层3,0.02
但是只显示了四条,Row1,Row3,Row4,Row6,我发现utilrate重复的数据没有显示,原因是resultMap映射出来的结果集把utilrate作为唯一性标识。因此必须指定id映射。用来标识每条结果的唯一性。

三、constructor
<resultMap type="LoginPojo" id="login">    
        <id property="lid" column="lid_db" javaType="java.lang.Integer"/>    
        <result property="logname" column="logname_db" javaType="java.lang.String"/>    
        <result property="password" column="password_db" javaType="java.lang.String"/>    
    </resultMap>

column中_db是为了标识这是数据库中的字段名
上面这个resultMap可以改为
<resultMap type="LoginPojo" id="login" >  
    <constructor>  
        <idArg javaType="integer" column="lid_db"/>  
        <arg javaType="String" column="logname_db"/>  
        <arg javaType="String" column="password_db"/>  
    </constructor>  
</resultMap>
当然LoginPojo必须要有一个相对应的构造函数
public LoginPojo(int lid,String logname,String password){}
这样mybatis直接将结果注入构造器,constructor的作用相当于
LoginPojo result=LoginPojo(lid_db,logname_db,password_db);
constructor跟id,result的不同之处在于不用指明javabean和数据库中字段的相对应性,但是constructor中arg的顺序必须跟构造函数的顺序一致。

三、association(同collection)
association一度让我纠结,因为我是在搞不明白它的column属性是用来干什么的。
例如上面第一个id为utilrate的resultMap。
<select ....resultMap="utilrate">
select ci.cid as cid,ci.cmp as cmp,ci.floor as floor,cout(log.lid)as utilrate 
			from cabinetinfo ci left join log on ci.cid=log.cid
</select>
cid,cmp,floor,utilrate分别对应于各个id和result标签的column,association的column是用来干什么的。其实这个时候association是不需要column属性的。
再看下一个
<resultMap type="UtilRatePojo" id="utilrate">
		<id property="cid" column="cid" javaType="integer"/>
		<result property="utilrate" column="utilrate" javaType="float"/>
		<association property="cmp" javaType="CmpsPojo" resultMap="cmpMap">
		</association>
	</resultMap>
<resultMap id="cmpMap" type="CmpsPojo">
		<id property="cid" column="cid"/>
		<result property="cmp" column="cmp"/>
		<result property="flr" column="floor"/>
</resultMap>
这种association也是不需要column属性的,查询出来的字段分别对应id和result标签就行了。
下下个
<resultMap type="UtilRatePojo" id="utilrate">
		<id property="cid" column="cid" javaType="integer"/>
		<result property="utilrate" column="utilrate" javaType="float"/>
		<association property="cmp" javaType="CmpsPojo"  colulmn="cid" select="selectCmp">
		</association>
	</resultMap>
select 语句:
<select ....resultMap="utilrate">
select cid ,cout(lid)as utilrate  from log 
</select>

<select  id="selectCmp" resultType="CmpsPojo">
select cid ,cmp,floor from cabinetinfo where cid=#{cid} 
</select>
这个时候我感觉就要用到column属性了,association的column属性是查到的log数据库中的cid,这个cid作为select=“selectCmp”的传入参数传给select标签




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值