天天看點

MyBatis資料持久化(六)resultMap使用

resultMap是MyBatis最強大也是最重要的特性,使用它我們可以將查詢結果或者sql輸入條件和一個HashMap的key進行映射,大大簡化了sql查詢條件的輸入,而且使得資料的查詢變得非常靈活。

考慮前面的例子,我們從user表中查詢出一條資料,查詢sql語句配置如下:

<select id="queryUserInfoByName" parameterType="string"  resultType="user">
        select * from User where username = #{username}
    </select>           

我們必須建立一個映射類

com.mybatis.domain.User

,它屬性和資料庫中的每一個字段對應,resultType指定為

com.mybatis.domain.User

類型,這樣才能從資料庫中擷取每個字段的内容,這種操作是比較繁瑣的,而且有時候我們并不需要查詢結果中所有的字段。

在實際使用過程中我們幾乎不采用上面這種方式,而是使用resultMap將查詢結果映射成一個HashMap,key與資料庫字段名建立映射,value為從資料庫中查詢出的結果,接下來對上面的查詢方法進行改寫:

<resultMap type="hashmap"  id="queryUserInfoByNameResult">
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="phone" column="phone"/>
    </resultMap>
    <select id="queryUserInfoByNameV1" parameterType="hashmap"  resultMap="queryUserInfoByNameResult">
        select * from User where username = #{username}
    </select>           

select标簽中有一個resultMap屬性,指定一個id為

queryUserInfoByNameResult

的映射,我們在resultMap标簽中定義該映射,property指定hashmap的key,column為映射的資料庫字段名。

然後建立一個測試類

com.mybatis.exam4.ResultMap

,testResultMap為測試方法:

package com.mybatis.exam4;

import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class ResultMap {
    private Reader reader = null;
    private SqlSessionFactory sessionFactory  = null;
    private SqlSession session = null;
    @Before
    public void before()
    {
        try {
            reader = Resources.getResourceAsReader("SqlMapConfig.xml");
            sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            //建立一個資料庫會話
             session = sessionFactory.openSession();  
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void testResultMap()
    {

        HashMap map = new HashMap();
        map.put("username", "小王");
        HashMap userInfoMap = (HashMap)session.selectOne("User.queryUserInfoByNameV1",map);
        System.out.println("username: " + userInfoMap.get("username"));
        System.out.println("password: " + userInfoMap.get("password"));
        System.out.println("phone: " + userInfoMap.get("phone"));
    }

    @After
    public void after()
    {
        if(null != session)
        {
            session.close();
        }
    }
}
           

在testResultMap方法中,由于parameterType指定參數類型為hashmap,是以selectOne方法的第二個參數必須為HashMap對象。這裡我們new了一個HashMap對象,map對象中的key對應的值會傳到sql語句相應的占位符中。

username: 小王
password: 123456a
phone: 13535999538