上篇文章 上讲了mybatis的基本开发情况,这篇博客就说一下mybatis的映射。Hibernate有映射,同样mybatis也有映射,输入映射和输出映射。
输入映射:
parameterType:指定输入参数类型可以简单类型、pojo、hashmap。
对于综合查询,建议parameterType使用包装的pojo,有利于系统 扩展。
输出映射:
resultType:查询到的列名和resultType指定的pojo的属性名一致,才能映射成功。
reusltMap:可以通过resultMap 完成一些高级映射。如果查询到的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系)。可以完成映射。
输入映射很简单就不多说了,主要是讲解输出的映射。首先从一对一查询开始讲解。
实例需求讲解
查询订单信息同时把关联的订单的用户信息也查询出来。
订单信息与用户信息之间的关系,一对一即一个订单对应一个用户信息(单项关联是一对一)。
使用resultType进行输出映射
1.创建pojo类( Orders类)
public class Orders{
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private String username;
private String sex;
private Stringaddress;
}
说明:把查询出来的字段需要跟实体中的字段对应起来,做到名称一致。
2.创建mapper.xml
<!-- 查询订单关联查询用户信息 -->
<selectid="findOrdersUser"resultType="cn.itcast.mybatis.po.Orders">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHEREorders.user_id = user.id
</select>
3.创建mapper.java类
public interfaceOrdersMapperCustom {
//查询订单关联查询用户信息
publicList<OrdersCustom> findOrdersUser()throws Exception;
}
使用resultMap进行输出映射
1.创建pojo类( Orders类)
public class Orders{
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
}
说明:使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。
2.创建mapper.xml
<mappernamespace="cn.itcast.mybatis.mapper.OrdersMapperCustom">
<!-- 订单查询关联用户的resultMap
将整个查询的结果映射到cn.itcast.mybatis.po.Orders中
-->
<resultMaptype="cn.itcast.mybatis.po.Orders"id="OrdersUserResultMap">
<!-- 配置映射的订单信息 -->
<!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
column:订单信息的唯 一标识 列
property:订单信息的唯 一标识 列所映射到Orders中哪个属性
-->
<idcolumn="id" property="id"/>
<resultcolumn="user_id" property="userId"/>
<resultcolumn="number" property="number"/>
<resultcolumn="createtime" property="createtime"/>
<resultcolumn="note" property="note"/>
<!-- 配置映射的关联的用户信息 -->
<!-- association:用于映射关联查询单个对象的信息
property:要将关联查询的用户信息映射到Orders中哪个属性
-->
<associationproperty="user" javaType="cn.itcast.mybatis.po.User">
<!-- id:关联查询用户的唯 一标识
column:指定唯 一标识用户信息的列
javaType:映射到user的哪个属性
-->
<idcolumn="user_id" property="id"/>
<resultcolumn="username" property="username"/>
<resultcolumn="sex" property="sex"/>
<resultcolumn="address" property="address"/>
</association>
</resultMap
<!-- 查询订单关联查询用户信息,使用resultmap -->
<selectid="findOrdersUserResultMap"resultMap="OrdersUserResultMap">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHEREorders.user_id = user.id
</select>
</mapper>
说明:首先需要定义一个resultMap,然后编写statement,进行SQL语句的编写。
3.创建mapper.java类
public interfaceOrdersMapperCustom {
//查询订单关联查询用户使用resultMap
publicList<Orders> findOrdersUserResultMap()throws Exception;
}
总结
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。
resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。