一、基础
二、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>
<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标签