在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型属性是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
看到这些是不是有些绕呢???不急不急,接下来通过一个案例来展示。
package com.wz.po;
/**
* 客户持久化类
*/
public class Customer {
private Integer id; // 主键id
private String username; // 客户名称
private String jobs; // 职业
private String phone; // 电话
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer [id=" + id + ", username=" + username +
", jobs=" + jobs + ", phone=" + phone + "]";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace表示命名空间 -->
<mapper namespace="com.wz.mapper.UserMapper">
<resultMap type="com.wz.po.User" id="userResultMap">
<id property="id" column="t_id"/>
<result property="username" column="t_username"/>
<result property="jobs" column="t_jobs"/> //这里是重点resultmap
<result property="phone" column="t_phone"/>
</resultMap>
<select id="findAllUser" resultMap="userResultMap">
select * from t_user
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace表示命名空间 -->
<mapper namespace="com.wz.mapper.CustomerMapper">
<!--根据客户编号获取客户信息 -->
<select id="findCustomerByld" parameterType="Integer"
resultType="com.wz.po.Customer"> //这里是重点resultype
select * from t_customer where id = #{id}
</select>
</mapper>
●**元素**:配置文件的根元素
●namespace属性:命名空间,即com.wz.mapper.CustomerMapper
●**子元素**:执行查询操作
id属性:元素在映射文件中的唯一标识
parameterType:传入参数的类型
resultType:返回结果类型
SQL查询语句中“#{}”标识一个占位符,“#{id}” 标识该占位符接收参数名为id的值
其实不难看出,如果使用Resultype,要求DAO层的属性名与表格字段名一一对应;而Resultmap却不然,将实体类的属性名与表格字段名进行一一映射。
ResultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。