MyBatis基礎篇之對映檔案---如何通過select返回Map
阿新 • • 發佈:2019-01-24
一、前言
本文主要通過程式碼講解對映檔案中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自定義結果對映。