MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實現(xiàn)
1、前言
在使用MyBatis框架時,不可避免的需要和各種數(shù)據(jù)來打交道 ,可能的形式有查詢出來一個實體對象,一個列表,一個map或者直接是一個基本類型。
為了方便說明,把所有能查的數(shù)據(jù)類型都用一個接口來進行定義:
public interface SelectMapper {
/**
* 根據(jù)id查詢用戶信息
*/
User getUserById(@Param("id") Integer id);
/**
* 查詢所有用戶信息
*/
List<User> getAllUser();
/**
* 查詢用戶信息的總記錄數(shù)
*/
Integer getCount();
/**
* 根據(jù)id查詢用戶信息為一個map集合
*/
Map<String, Object> getUserByIdToMap(Integer id);
/**
* 查詢所有用戶信息為map集合
*/
// List<Map<String, Object>> getAllUserToMap();
@MapKey("id")
Map<String, Object> getAllUserToMap();
}2、查詢一個實體類對象
查詢一個實體對象的SelectMapper接口定義
public interface SelectMapper {
/**
* 根據(jù)id查詢用戶信息
*/
User getUserById(@Param("id") Integer id);
}對應(yīng)的配置文件內(nèi)容
<!-- User getUserById(@Param("id") Integer id);-->
<select id="getUserById" resultType="User">
select * from t_user where id = #{id}
</select>resultType寫的就是返回值的類型
測試類:
/**
* MyBatis的各種查詢功能:
* 1。 若查詢出的數(shù)據(jù)只有一條,可以通過實體類對象 / list集合 / map集合 來接收
* 2。 若查詢處的數(shù)據(jù)有多條,一定不能通過實體類對象來接收,此時會拋出TooManyResultsException
*/
@Test
public void testGetUserById(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
User userById = mapper.getUserById(4);
System.out.println(userById);
}字段名和屬性名無法映射處理
由于字段名和屬性名不一致,而且沒有創(chuàng)建映射關(guān)系,java中是駝峰的命名方式,而我們mysql中是下劃線的命名方式,所以這時,我們就需要一些操作來將它們進行對應(yīng)。
比如我們查詢到的數(shù)據(jù)是;
Emp{empId=null,empName='null',age=20,gender='男'}一般我們有三種手段來保持一致;
- 為查詢的字段設(shè)置別名,和屬性名保持一致
- 當(dāng)字段符合MySQL的要求使用_,而屬性符合java的要求使用駝峰
此時可以在Mybatis的核心配置文件中設(shè)置一個全局配置,可以自動將下劃線映射為駝峰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)識 |
| type | 查詢的數(shù)據(jù)要映射的實體類的類型 |
子標(biāo)簽:
| id | 設(shè)置主鍵的映射關(guān)系 |
| result | 設(shè)置普通字段的映射關(guān)系 |
| association | 設(shè)置多對一的映射關(guān)系(處理集合類型的屬性) |
| collection | 設(shè)置一對多的映射關(guān)系(處理集合類型的屬性) |
屬性:
| property | 設(shè)置映射關(guān)系中實體類中的屬性名,必須是處理的實體類類型中的屬性名 |
| column | 設(shè)置映射關(guān)系中表中的字段名,必須是sql查詢出的某個字段 |
| 代碼示例: |
<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、查詢一個list集合
SelectMapper接口:
public interface SelectMapper {
/**
* 查詢所有用戶信息
*/
List<User> getAllUser();
}配置文件
<!-- List<User> getAllUser();-->
<select id="getAllUser" resultType="User">
select * from t_user
</select>測試類:
/**
* MyBatis的各種查詢功能:
* 1。 若查詢出的數(shù)據(jù)只有一條,可以通過實體類對象 / list集合 / map集合 來接收
* 2。 若查詢處的數(shù)據(jù)有多條,一定不能通過實體類對象來接收,此時會拋出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、查詢單個數(shù)據(jù)
SelectMapper接口:
public interface SelectMapper {
/**
* 查詢用戶信息的總記錄數(shù)
*/
Integer getCount();
}配置文件:
<!-- Integer getCount();-->
<!-- integer寫大小寫都可以,寫 Integer/integer/_int/_integer 都可以,都是java.lang.Integer的別名-->
<select id="getCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>測試類:
/**
* 獲取記錄數(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ù)據(jù),都有對應(yīng)的別名,在returnType中不用寫全類名,直接寫對應(yīng)的別名也是一樣的。
而對于自己自定義的實體,也可以通過在全局配置文件中配置。配置形式有一下兩種;
第一種方法,給單獨的某個實體類配置別名,如同下面的形式
<!--為實體類com.demo.dao.User配置一個別名User-->
<typeAliases>
<typeAlias type="com.demo.dao.User" alias="User"/>
</typeAliases>第二種方法,批量為某個包下的所有實體類設(shè)置別名,配置形式如下
<!-- 為com.demo.dao包下的所有實體類配置別名,
MyBatis默認(rèn)的設(shè)置別名的方式就是去除類所在的包后的簡單的類名,
比如com.demo.dao.User這個實體類的別名就會被設(shè)置成User
-->
<typeAliases>
<package name="com.demo.dao"/>
</typeAliases>
5、查詢一條數(shù)據(jù)為map集合
SelectMapper接口:
public interface SelectMapper {
/**
* 根據(jù)id查詢用戶信息為一個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>測試類:
/**
* 如果沒有實體類對象,就把它映射成map集合
* 從數(shù)據(jù)庫中查詢數(shù)據(jù),將其映射為map集合
* 例如把它傳到網(wǎng)頁端,就映射成json對象,所以轉(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集合,每一條記錄是一個map
*/
Map<String, Object> getAllUserToMap();
}配置文件:
<!-- Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>現(xiàn)在是查多條數(shù)據(jù)放在map集合里,我們會發(fā)現(xiàn)報錯

我們現(xiàn)在查詢的結(jié)果有4條,但是我們返回值設(shè)置的是個Map集合,我們一條數(shù)據(jù)轉(zhuǎn)換的就是map,這時候4條數(shù)據(jù)轉(zhuǎn)換4個map,我們用一個map集合返回值是獲取不到的。我們用的還是selectOne方法,只能獲取一個結(jié)果,但是我們查詢出來的結(jié)果有4條。
方式一、直接使用List來接受
既然我們一條數(shù)據(jù)轉(zhuǎn)換為一個map,多條數(shù)據(jù)則是放到一個可以存儲map集合的List集合中,返回值可以這樣寫
/** * 查詢所有的用戶信息為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”)接受
我們在接口中的方法還是可以這么寫:Map<String,Object> getAllUserToMap();
因為Map集合也可以存儲多條數(shù)據(jù),但是map和list不一樣,你可以直接把每條數(shù)據(jù)轉(zhuǎn)換為的map放在list中,但是不能把每條數(shù)據(jù)轉(zhuǎn)換為的map放在map集合中,因為map是鍵值對,我們查出來的數(shù)據(jù)作為值,但是誰作為鍵呢?所以說這時候要用到一個注解@Mapkey(),這是把我們當(dāng)前查詢的數(shù)據(jù)所轉(zhuǎn)換的map集合,放到一個大的map集合中,通過這個注解,可以設(shè)置map集合的鍵。這里寫的就是我們所查詢出來的數(shù)據(jù)的字段,比如說我們把查詢出來的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ù)據(jù)轉(zhuǎn)為map集合
此時有2種解決方案:
- 將
mapper接口的方法返回值設(shè)置為泛型是map的list集合 - 可以將每條數(shù)據(jù)轉(zhuǎn)換的map集合放在一個大的
map中,但是必須要通過@MapKey注解,將查詢的某個字段的值作為大的map的鍵
@MapKey("id")
Map<String, Object> getAllUserToMap();到此這篇關(guān)于MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis類型查詢數(shù)據(jù)參數(shù)綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jackson忽略字段實現(xiàn)對字段進行序列化和反序列化
在使用?Jackson?進行序列化和反序列化時,有時候需要對某些字段進行過濾,以便在?JSON?數(shù)據(jù)中不包含某些敏感信息,下面就一起來了解一下Jackson忽略字段實現(xiàn)對字段進行序列化和反序2023-10-10
spring接口通過配置支持返回多種格式(xml,json,html,excel)
這篇文章主要給大家介紹了關(guān)于spring接口如何通過配置支持返回多種格式(xml,json,html,excel)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Spring中的@RestControllerAdvice注解使用解析
這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用解析,@RestControllerAdvice?是?Spring?框架中一個用于統(tǒng)一處理控制器異常和返回結(jié)果的注解,它可以被用來定義全局異常處理程序和全局響應(yīng)結(jié)果處理程序,需要的朋友可以參考下2024-01-01
JSP 開發(fā)之 releaseSession的實例詳解
這篇文章主要介紹了JSP 開發(fā)之 releaseSession的實例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07

