1. 程式人生 > >MyBatis基礎篇之對映檔案---如何通過select返回Map

MyBatis基礎篇之對映檔案---如何通過select返回Map

一、前言

本文主要通過程式碼講解對映檔案中select標記裡面如何返回Map,通過一個小demo說明一下。

二、案例

♦在MySQL下新建資料庫表t_user,並插入若干條資料

CREATE TABLE t_user (
  id int(10) NOT NULL AUTO_INCREMENT,
  loginId varchar(20) DEFAULT NULL,
  userName varchar(100) DEFAULT NULL,
  role varchar(255) DEFAULT NULL,
  note varchar(255) DEFAULT NULL,
  PRIMARY KEY (id
) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; INSERT INTO t_user(loginId,userName,role,note) VALUES ('queen', '奎恩', '海賊王副把手', '專門負責提鞋的。。。'); INSERT INTO t_user(loginId,userName,role,note) VALUES ('king', '金獅子', '海賊王前大海賊把手', '磁性果實能力'); INSERT INTO t_user(loginId,userName,role,note) VALUES ('Lucy'
, '路西', '路飛假扮選手', '打敗多弗朗明哥。。。');

♦Java類User.java,配置檔案mybatis-config.xml,db.properties,log4j.properties等配置檔案直接拷貝工程的檔案

♦新建介面類UserMapper.java,增加介面方法getUserByIdReturnMap,返回單條記錄存入Map

/**
 * @since 2017-08-06
 * @author queen 
 * 定義一個UserMapper介面
 *
 */
public interface UserMapper {
	
	/**
	 * 返回一條記錄的Map,key是列名,值就是對應的值
	 * @param
id * @return */
public Map<String,Object> getUserByIdReturnMap(int id); }

♦新建UserMapper.xml檔案,檔案配置如下:

<select id="getUserByIdReturnMap" resultType="map">
	select id, loginId, userName, role, note from t_user where id=#{id}
</select>

♦新建MyBatisTest.java類,新增測試方法testGetUserByIdReturnMap()

@Test
public void testGetUserByIdReturnMap() throws IOException {
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	SqlSession openSession = sqlSessionFactory.openSession();
	try {
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		Map<String,Object> map = mapper.getUserByIdReturnMap(1);
		System.out.println(map);
	} finally {
		openSession.close();
	}

}

♦測試,控制檯列印結果如下:

2017-08-06 22:57:38,473 [main] [com.queen.mybatis.mapper.UserMapper.getUserByIdReturnMap]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user where id=? 
2017-08-06 22:57:38,538 [main] [com.queen.mybatis.mapper.UserMapper.getUserByIdReturnMap]-[DEBUG] ==> Parameters: 1(Integer)
2017-08-06 22:57:38,581 [main] [com.queen.mybatis.mapper.UserMapper.getUserByIdReturnMap]-[DEBUG] <==      Total: 1
{id=1, loginId=queen, role=海賊王副把手, userName=奎恩, note=專門負責提鞋的。。。}

 從控制檯可以看到,返回了一條資料,key是列名,值就是對應的值

♦上面的例子是返回單條記錄放入Map,那如果返回多條記錄封裝成一個Map,那麼我們要怎麼配置呢?

♦修改介面類UserMapper.java,增加介面方法getAllUsersReturnMap,返回多條記錄存入Map

/**
* 多條記錄封裝成一個Map,Map<Integer,User>:鍵是這條記錄的主鍵,值是這條記錄封裝後的JavaBean
* @param id
* @return
*/
@MapKey("id")
public Map<Integer,User> getAllUsersReturnMap();

@MapKey(“id”)表示:告訴MyBatis封裝這個Map的時候使用哪個屬性作為map的key

♦修改UserMapper.xml檔案,配置如下:

<select id="getAllUsersReturnMap" resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user
</select>

注意:這裡的返回值resultType是User型別,而不是一個Map

♦修改MyBatisTest.java測試檔案,增加testGetUserByIdReturnMap測試方法如下:

@Test
public void testGetAllUsersReturnMap() throws IOException {
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	SqlSession openSession = sqlSessionFactory.openSession();
	try {
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		Map<Integer,User> map = mapper.getAllUsersReturnMap();
		System.out.println(map);
	} finally {
		openSession.close();
	}

}

♦測試,控制檯列印結果如下:

2017-08-06 23:11:20,001 [main] [com.queen.mybatis.mapper.UserMapper.getAllUsersReturnMap]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user 
2017-08-06 23:11:20,054 [main] [com.queen.mybatis.mapper.UserMapper.getAllUsersReturnMap]-[DEBUG] ==> Parameters: 
2017-08-06 23:11:20,102 [main] [com.queen.mybatis.mapper.UserMapper.getAllUsersReturnMap]-[DEBUG] <==      Total: 3
{1=User [id=1, loginId=queen, userName=奎恩, role=海賊王副把手, note=專門負責提鞋的。。。], 2=User [id=2, loginId=king, userName=金獅子, role=海賊王前大海賊把手, note=磁性果實能力], 3=User [id=3, loginId=Lucy, userName=路西, role=路飛假扮選手, note=打敗多弗朗明哥。。。]}

上述列印結果可以直觀的看到,返回多條記錄時,key是ID主鍵,value是一個User的JavaBean

♦為了驗證上述@MapKey註解的作用,我們修改一下@MapKey(“userName”)

@MapKey("userName")
public Map<Integer,User> getAllUsersReturnMap();

♦測試,控制檯列印結果如下:

2017-08-06 23:19:41,081 [main] [com.queen.mybatis.mapper.UserMapper.getAllUsersReturnMap]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user 
2017-08-06 23:19:41,136 [main] [com.queen.mybatis.mapper.UserMapper.getAllUsersReturnMap]-[DEBUG] ==> Parameters: 
2017-08-06 23:19:41,191 [main] [com.queen.mybatis.mapper.UserMapper.getAllUsersReturnMap]-[DEBUG] <==      Total: 3
{金獅子=User [id=2, loginId=king, userName=金獅子, role=海賊王前大海賊把手, note=磁性果實能力], 路西=User [id=3, loginId=Lucy, userName=路西, role=路飛假扮選手, note=打敗多弗朗明哥。。。], 奎恩=User [id=1, loginId=queen, userName=奎恩, role=海賊王副把手, note=專門負責提鞋的。。。]}

鍵變成了userName來作為Map的key

至此,我們關於MyBatis基礎篇之對映檔案—如何通過select返回Map介紹完畢。我們下一節將介紹如何通過resultMap自定義結果對映。