ResultMap – 是最复杂也是最强大的元素
它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
半自动映射
当数据库某些字段名称和实体类属性命名不同时候(大小写不同不需要,因为sql语句不分大小写),可以使用ResultMap让实体类和字段名映射
- property:指定对象的属性名
- javaType:指定要映射的对象的类型。
<resultMap type="Orders" id="orders">
<!-- 可以半自动映射 只写不同的 -->
<result column="user_id" property="userId"/>
<!-- 主键配id,可以提高MyBatis性能 -->
<!-- 手动映射 <id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/> -->
</resultMap>
<select id="selectOrdersList" resultMap="orders">
Select id,user_id,number,createtime,note from orders
</select>
复杂结果映射
联表查询是需要得到一个复杂结果的数据,需要ResultMap把需要的数据映射
一对一关联查询
- association专门用来建立1对1关联关系。
<!-- 一对一关联查询 -->
<resultMap type="Orders" id="order">
<result column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<!-- Order内里面还有一个类变量user,并且order与user是一对一的关系 -->
<!-- javaType="User"指明类变量的类型 -->
<!-- 类变量的属性一一映射 -->
<association property="user" javaType="User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
</association>
</resultMap>
<!-- 第二种方式-->
<resultMap type="User" id="userMap">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
</resultMap>
<resultMap type="Orders" id="order">
<result column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<!-- 类变量直接映射层一个map -->
<association property="user" javaType="User" resultMap="userMap"/>
</resultMap>
<!-- 查询语句 -->
<select id="selectOrders" resultMap="order">
select
o.id,o.user_id,o.number,o.createtime,
u.username
from orders o
left join e_user u on o.user_id = u.id
</select>
上述的实体类
public class Orders implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//附件对象
private User user;
//get、set方法省略
一对多关联查询
- collection专门用来建立1对1关联关系。
<resultMap type="User" id="UserAddressMap">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<!-- 一个人有多个地址 -->
<collection property="addressList" ofType="Address">
<id property="id" column="aId"/>
<result property="postCode" column="postCode"/>
<result property="contact" column="contact"/>
<result property="addressDesc" column="addressDesc"/>
</collection>
</resultMap>
<!-- 第二种方式 -->
<resultMap type="Address" id="AddressMap">
<id property="id" column="aId"/>
<result property="postCode" column="postCode"/>
<result property="contact" column="contact"/>
<result property="addressDesc" column="addressDesc"/>
</resultMap>
<resultMap type="User" id="UserAddressMap2">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<!-- 一个人有多个地址 -->
<collection property="addressList" ofType="Address" resultMap="AddressMap"/>
</resultMap>
<!-- 查询语句 -->
<select id="getUserByUserId3" resultMap="UserAddressMap2">
select u.*,a.id aId,a.postCode,a.contact,a.addressDesc from smbms_user u inner join smbms_address a
on u.id = a.userId
where u.id = #{userId}
</select>
上述实体类
public class User {
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer gender; //性别
private Date birthday; //出生日期
private String phone; //电话
private String address; //地址
private Integer userRole; //用户角色
private String userRoleName;
//角色对象
private Role role;
//地址集合对象
private List<Address> addressList;
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
//get、set方法省略