MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實(shí)現(xiàn)
1、前言
在使用MyBatis框架時(shí),不可避免的需要和各種數(shù)據(jù)來(lái)打交道 ,可能的形式有查詢出來(lái)一個(gè)實(shí)體對(duì)象,一個(gè)列表,一個(gè)map或者直接是一個(gè)基本類型。
為了方便說(shuō)明,把所有能查的數(shù)據(jù)類型都用一個(gè)接口來(lái)進(jìn)行定義:
public interface SelectMapper { /** * 根據(jù)id查詢用戶信息 */ User getUserById(@Param("id") Integer id); /** * 查詢所有用戶信息 */ List<User> getAllUser(); /** * 查詢用戶信息的總記錄數(shù) */ Integer getCount(); /** * 根據(jù)id查詢用戶信息為一個(gè)map集合 */ Map<String, Object> getUserByIdToMap(Integer id); /** * 查詢所有用戶信息為map集合 */ // List<Map<String, Object>> getAllUserToMap(); @MapKey("id") Map<String, Object> getAllUserToMap(); }
2、查詢一個(gè)實(shí)體類對(duì)象
查詢一個(gè)實(shí)體對(duì)象的SelectMapper
接口定義
public interface SelectMapper { /** * 根據(jù)id查詢用戶信息 */ User getUserById(@Param("id") Integer id); }
對(duì)應(yīng)的配置文件內(nèi)容
<!-- User getUserById(@Param("id") Integer id);--> <select id="getUserById" resultType="User"> select * from t_user where id = #{id} </select>
resultType
寫(xiě)的就是返回值的類型
測(cè)試類:
/** * MyBatis的各種查詢功能: * 1。 若查詢出的數(shù)據(jù)只有一條,可以通過(guò)實(shí)體類對(duì)象 / list集合 / map集合 來(lái)接收 * 2。 若查詢處的數(shù)據(jù)有多條,一定不能通過(guò)實(shí)體類對(duì)象來(lái)接收,此時(shí)會(huì)拋出TooManyResultsException */ @Test public void testGetUserById(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); User userById = mapper.getUserById(4); System.out.println(userById); }
字段名和屬性名無(wú)法映射處理
由于字段名和屬性名不一致,而且沒(méi)有創(chuàng)建映射關(guān)系,java中是駝峰的命名方式,而我們mysql中是下劃線的命名方式,所以這時(shí),我們就需要一些操作來(lái)將它們進(jìn)行對(duì)應(yīng)。
比如我們查詢到的數(shù)據(jù)是;
Emp{empId=null,empName='null',age=20,gender='男'}
一般我們有三種手段來(lái)保持一致;
- 為查詢的字段設(shè)置別名,和屬性名保持一致
- 當(dāng)字段符合MySQL的要求使用_,而屬性符合java的要求使用駝峰
此時(shí)可以在Mybatis的核心配置文件中設(shè)置一個(gè)全局配置,可以自動(dòng)將下劃線映射為駝峰emp_id--》empId ,emp_name--》empName
- 使用
resultMap
自定義映射處理
方式一:起別名
select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
方式二:使用全局配置文件配置映射規(guī)則
<select id="getEmpByEmpId" resultType="Emp"> select * from t_emp where emp_id = #{empId} </select>
<select id="getEmpByEmpId" resultType="Emp"> select * from t_emp where emp_id = #{empId} </select>
方式三:自定義resultmap
resultMap:設(shè)置自定義映射resultMap
所有屬性
id | 表示自定義映射的唯一標(biāo)識(shí) |
type | 查詢的數(shù)據(jù)要映射的實(shí)體類的類型 |
子標(biāo)簽:
id | 設(shè)置主鍵的映射關(guān)系 |
result | 設(shè)置普通字段的映射關(guān)系 |
association | 設(shè)置多對(duì)一的映射關(guān)系(處理集合類型的屬性) |
collection | 設(shè)置一對(duì)多的映射關(guān)系(處理集合類型的屬性) |
屬性:
property | 設(shè)置映射關(guān)系中實(shí)體類中的屬性名,必須是處理的實(shí)體類類型中的屬性名 |
column | 設(shè)置映射關(guān)系中表中的字段名,必須是sql查詢出的某個(gè)字段 |
代碼示例: |
<resultMap id="empResultMap" type="Emp"> <id column="emp_id" property="empId"></id> <result column="emp_name" property="empName"></result> <result column="age" property="age"></result> <result column="gender" property="gender"></result> </resultMap> <!-- Emp getEmpByEmpId(@Param("empId") Integer empId);--> <select id="getEmpByEmpId" resultMap="empResultMap"> select * from t_emp where emp_id = #{empId} </select>
3、查詢一個(gè)list集合
SelectMapper接口:
public interface SelectMapper { /** * 查詢所有用戶信息 */ List<User> getAllUser(); }
配置文件
<!-- List<User> getAllUser();--> <select id="getAllUser" resultType="User"> select * from t_user </select>
測(cè)試類:
/** * MyBatis的各種查詢功能: * 1。 若查詢出的數(shù)據(jù)只有一條,可以通過(guò)實(shí)體類對(duì)象 / list集合 / map集合 來(lái)接收 * 2。 若查詢處的數(shù)據(jù)有多條,一定不能通過(guò)實(shí)體類對(duì)象來(lái)接收,此時(shí)會(huì)拋出TooManyResultsException */ @Test public void testGetUserById(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); List<User> allUser = mapper.getAllUser(); allUser.forEach(user -> System.out.println(user)); }
4、查詢單個(gè)數(shù)據(jù)
SelectMapper接口:
public interface SelectMapper { /** * 查詢用戶信息的總記錄數(shù) */ Integer getCount(); }
配置文件:
<!-- Integer getCount();--> <!-- integer寫(xiě)大小寫(xiě)都可以,寫(xiě) Integer/integer/_int/_integer 都可以,都是java.lang.Integer的別名--> <select id="getCount" resultType="java.lang.Integer"> select count(*) from t_user </select>
測(cè)試類:
/** * 獲取記錄數(shù) * * MyBatis中設(shè)置了默認(rèn)的類型別名 * Java.lang.Integer -> int, integer * int -> _int, _integer * Map -> map * List -> list */ @Test public void testGetCount(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getCount()); }
其實(shí)對(duì)于很多基本類型數(shù)據(jù),都有對(duì)應(yīng)的別名,在returnType
中不用寫(xiě)全類名,直接寫(xiě)對(duì)應(yīng)的別名也是一樣的。
而對(duì)于自己自定義的實(shí)體,也可以通過(guò)在全局配置文件
中配置。配置形式有一下兩種;
第一種方法,給單獨(dú)的某個(gè)實(shí)體類配置別名,如同下面的形式
<!--為實(shí)體類com.demo.dao.User配置一個(gè)別名User--> <typeAliases> <typeAlias type="com.demo.dao.User" alias="User"/> </typeAliases>
第二種方法,批量為某個(gè)包下的所有實(shí)體類設(shè)置別名,配置形式如下
<!-- 為com.demo.dao包下的所有實(shí)體類配置別名, MyBatis默認(rèn)的設(shè)置別名的方式就是去除類所在的包后的簡(jiǎn)單的類名, 比如com.demo.dao.User這個(gè)實(shí)體類的別名就會(huì)被設(shè)置成User --> <typeAliases> <package name="com.demo.dao"/> </typeAliases>
5、查詢一條數(shù)據(jù)為map集合
SelectMapper接口:
public interface SelectMapper { /** * 根據(jù)id查詢用戶信息為一個(gè)map集合 */ Map<String, Object> getUserByIdToMap(Integer id); }
配置文件
<!-- Map<String, Object> getUserByIdToMap(Integer id);--> <select id="getUserByIdToMap" resultType="map"> select * from t_user where id = #{id} </select>
測(cè)試類:
/** * 如果沒(méi)有實(shí)體類對(duì)象,就把它映射成map集合 * 從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù),將其映射為map集合 * 例如把它傳到網(wǎng)頁(yè)端,就映射成json對(duì)象,所以轉(zhuǎn)成map很常用 * * 以字段為鍵 */ @Test public void testgetUserByIdToMap(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getUserByIdToMap(4)); }
6、 查詢多條數(shù)據(jù)為map集合
SelectMapper接口:
public interface SelectMapper { /** * 查詢所有用戶信息為map集合,每一條記錄是一個(gè)map */ Map<String, Object> getAllUserToMap(); }
配置文件:
<!-- Map<String, Object> getAllUserToMap();--> <select id="getAllUserToMap" resultType="map"> select * from t_user </select>
現(xiàn)在是查多條數(shù)據(jù)放在map集合里,我們會(huì)發(fā)現(xiàn)報(bào)錯(cuò)
我們現(xiàn)在查詢的結(jié)果有4條,但是我們返回值設(shè)置的是個(gè)Map
集合,我們一條數(shù)據(jù)轉(zhuǎn)換的就是map
,這時(shí)候4條數(shù)據(jù)轉(zhuǎn)換4
個(gè)map
,我們用一個(gè)map
集合返回值是獲取不到的。我們用的還是selectOne
方法,只能獲取一個(gè)結(jié)果,但是我們查詢出來(lái)的結(jié)果有4條。
方式一、直接使用List來(lái)接受
既然我們一條數(shù)據(jù)轉(zhuǎn)換為一個(gè)map
,多條數(shù)據(jù)則是放到一個(gè)可以存儲(chǔ)map集合的List集合中,返回值可以這樣寫(xiě)
/** * 查詢所有的用戶信息為map集合 * @return */ List<Map<String,Object>> getAllUserToMap();
@Test public void testGetAllUserToMap(){ SqlSession sqlSession = SqlSessionUtil.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); List<Map<String, Object>> list = mapper.getAllUserToMap(); System.out.println(list); }
方式二、使用Map+@MapKey(“id”)接受
我們?cè)诮涌谥械姆椒ㄟ€是可以這么寫(xiě):Map<String,Object> getAllUserToMap();
因?yàn)?code>Map集合也可以存儲(chǔ)多條數(shù)據(jù),但是map
和list
不一樣,你可以直接把每條數(shù)據(jù)轉(zhuǎn)換為的map
放在list
中,但是不能把每條數(shù)據(jù)轉(zhuǎn)換為的map
放在map
集合中,因?yàn)?code>map是鍵值對(duì),我們查出來(lái)的數(shù)據(jù)作為值,但是誰(shuí)作為鍵呢?所以說(shuō)這時(shí)候要用到一個(gè)注解@Mapkey()
,這是把我們當(dāng)前查詢的數(shù)據(jù)所轉(zhuǎn)換的map
集合,放到一個(gè)大的map
集合中,通過(guò)這個(gè)注解,可以設(shè)置map
集合的鍵。這里寫(xiě)的就是我們所查詢出來(lái)的數(shù)據(jù)的字段,比如說(shuō)我們把查詢出來(lái)的id
作為map
的鍵,值就是當(dāng)前的每一條數(shù)據(jù)所轉(zhuǎn)換為的map
集合。
@MapKey("id") Map<String,Object> getAllUserToMap();
@Test public void testGetAllUserToMap(){ SqlSession sqlSession = SqlSessionUtil.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); Map<String, Object> map = mapper.getAllUserToMap(); System.out.println(map); }
注:
若查詢的數(shù)據(jù)有多條時(shí),并且要將每條數(shù)據(jù)轉(zhuǎn)為map集合
此時(shí)有2種解決方案:
- 將
mapper
接口的方法返回值設(shè)置為泛型是map
的list
集合 - 可以將每條數(shù)據(jù)轉(zhuǎn)換的map集合放在一個(gè)大的
map
中,但是必須要通過(guò)@MapKey
注解,將查詢的某個(gè)字段的值作為大的map的鍵
@MapKey("id") Map<String, Object> getAllUserToMap();
到此這篇關(guān)于MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis類型查詢數(shù)據(jù)參數(shù)綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jackson忽略字段實(shí)現(xiàn)對(duì)字段進(jìn)行序列化和反序列化
在使用?Jackson?進(jìn)行序列化和反序列化時(shí),有時(shí)候需要對(duì)某些字段進(jìn)行過(guò)濾,以便在?JSON?數(shù)據(jù)中不包含某些敏感信息,下面就一起來(lái)了解一下Jackson忽略字段實(shí)現(xiàn)對(duì)字段進(jìn)行序列化和反序2023-10-10Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05spring接口通過(guò)配置支持返回多種格式(xml,json,html,excel)
這篇文章主要給大家介紹了關(guān)于spring接口如何通過(guò)配置支持返回多種格式(xml,json,html,excel)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中
這篇文章主要為大家介紹了如何把第三方服務(wù)注冊(cè)到spring項(xiàng)目容器中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Spring中的@RestControllerAdvice注解使用解析
這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用解析,@RestControllerAdvice?是?Spring?框架中一個(gè)用于統(tǒng)一處理控制器異常和返回結(jié)果的注解,它可以被用來(lái)定義全局異常處理程序和全局響應(yīng)結(jié)果處理程序,需要的朋友可以參考下2024-01-01SpringBoot實(shí)現(xiàn)接口冪等性的4種方案
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)接口冪等性的4種方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Springboot項(xiàng)目快速實(shí)現(xiàn)Aop功能
這篇文章主要介紹了Springboot項(xiàng)目如何快速實(shí)現(xiàn)Aop功能,對(duì)此方面感興趣的小伙伴可以詳細(xì)參考閱讀本文,本文有一定的參考價(jià)值2023-03-03JSP 開(kāi)發(fā)之 releaseSession的實(shí)例詳解
這篇文章主要介紹了JSP 開(kāi)發(fā)之 releaseSession的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07