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