Result Maps
ResultMap
元素是MyBatis中最重要最强大的元素,它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情,事实上,编写相似于负载语句联合映射这些等同的代码,也许可以跨过上千行的代码,ResultMap
的设计 就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
你已经看到简单映射语句的示例了,但没有明确的resultMap
比如:
<select id = "selectUsers" resultType="map">
SELECT id, username,hashedPassword
FROM some_table
WHERE id = #{id}
</select>
这样一个语句简单作用于所有列被自动映射到HashMap的键上,这由resultType
属性指定,这在很多情况下是有用的,但是HashMap
不能很好描述一个领域模型,那样你的应用程序将会使用JavaBeans
或POJOS(Plain Old Java Objects,
普通Java对象)来作用领域模型,MyBatis对两者都支持,看看下面这个JavaBean:
package com.someapp.model;
public class User {
private int id;
private String username;
private String hashedPassword;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getHashedPassword() {
return hashedPassword;
}
public void setHashedPassword(String hashedPassword) {
this.hashedPassword = hashedPassword;
}
}
基于JavaBean的规范,上面这个类有3个属性:id,username和hashPassword,这些在select语句中会精确匹配到列名。
这样的一个JavaBean可以被映射到结果集,就像映射到HashMap
y一行简单。
<select id = "selectUsers" resultType = "com.someapp.model.User>
SELECT id,username,hashedPassword
FROM some_table
WHERE id = #{id}
</select>
要记住类型别名是你的伙伴,使用它们你可以不用输入类的全路径。比如:
<!-- In mybatis-config.xml file -->
<typeAlias type="com.someapp.model.User" alias="User"/>
<!-- In SQL Mapping XML file -->
<select id="selectUsers" resultType="User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
这些情况下,MyBatis会在幕后自动创建一个ResultMap
基于属性名来映射列到javaBean的属性上,如果列名没有精确匹配,你可以在列名上使用select字句的别名(一个基本的SQL特性)来匹配标签。比如:
<select id = "selectUsers" resultType = "User">
SELECT
user_id as "id",
user_name as "username",
hashed_password as "hashedPassword"
FROM some_table
WHERE id = #{id}
</select>
ResultMap
最优秀的地方你已经了解了很多,但是你还没有真正的看到一个,这些简单的示例不需要比你看到的更多东西,只是出于示例的原因,让我们来看看最后一个示例中外部的resultMap
是什么样子的,这也是解决列名不匹配的另外一种方式。
<resultMap id = "userResultMap" type = "User">
<id property = "id" column = "user_id"/>
<result property = "username" cloumn = "user_name" />
<result propety = "password" cloumn = "password" />
</resultMap>
引用它的语句使用resultMap
属性就行了(注意我们去掉了resultType属性)。比如:
<select id = "selectUsers" resultMap = "userResultMap">
SELECT user_id,user_name,hashed_passowrd
FROM some_table
WHERE id = #{id}
</select>
如果世界总是这么简单就好了。