普通映射一对一、一对多时,我们可以直接在<association></association>
或<collection></collection>
里写自己一一定义结果映射。但是在懒加载(延迟加载)中,却不是这样的,对于小白的我来说,一时间还真没想到。比如:
//懒加载映射配置
<resultMap id="UserOneUserInfo" type="user">
<id column="username" property="username"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<!--一对一关系映射-->
<association property="userInfo" column="id" javaType="userInfo" select="findUserInfoById" fetchType="lazy"/>
<!--一对多映射-->
<collection property="orders" column="id" javaType="list" ofType="OrderForm" select="findOrdersByUserId" fetchType="lazy"/>
</resultMap>
<!--通过id查询用户扩展信息-->
<select id="findUserInfoById" resultType="UserInfo">
SELECT * FROM user_info WHERE id=#{uid};
</select>
<!--通过用户id查询用户所有订单-->
<select id="findOrdersByUserId" resultType="OrderForm">
SELECT * FROM order_form WHERE user_id=#{uid};
</select>
// 订单信息类
public class OrderForm implements Serializable {
private Integer oid;
private String number2;
private Timestamp createTime;
private String note;
private Integer userId;
......
}
// 用户的扩展信息类
public class UserInfo implements Serializable {
private Integer id;
private double height;
private double weight;
private boolean married;
......
}
以上如果只是数据库的下划线和Java的驼峰式命名的问题的话,那么直接在核心配置文件中添加全局设置
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
就ok了。但是如果有些就算修改了也没有用,比如OrderForm类里的number2,而数据库里的列名(字段名)是number,那就要一一对应映射了。
那怎么一一映射呢?
这时需要再定义一个<resultMap></resultMap>
就可以了:
<!--添加一个OrderForm类的resultMap映射 -->
<resultMap id="abc" type="OrderForm">
<id column="oid" property="oid"/>
<result column="number" property="number"/>
<result column="create_time" property="createTime"/>
<result column="note" property="note"/>
<result column="user_id" property="userId"/>
</resultMap>
<!-- 查询语句中修改-->
<select id="findOrdersByUserId" resultType="OrderForm" resultMap="abc">
SELECT * FROM order_form WHERE user_id=#{uid};
</select>