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 不能很好描述一个领域模型,那样你的应用程序将会使用JavaBeansPOJOS(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可以被映射到结果集,就像映射到HashMapy一行简单。

<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>

如果世界总是这么简单就好了。