MyBatis各種類型查詢數據參數綁定的實現
1、前言
在使用MyBatis框架時,不可避免的需要和各種數據來打交道 ,可能的形式有查詢出來一個實體對象,一個列表,一個map或者直接是一個基本類型。
為了方便說明,把所有能查的數據類型都用一個接口來進行定義:
public interface SelectMapper { /** * 根據id查詢用戶信息 */ User getUserById(@Param("id") Integer id); /** * 查詢所有用戶信息 */ List<User> getAllUser(); /** * 查詢用戶信息的總記錄數 */ Integer getCount(); /** * 根據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 { /** * 根據id查詢用戶信息 */ User getUserById(@Param("id") Integer id); }
對應的配置文件內容
<!-- User getUserById(@Param("id") Integer id);--> <select id="getUserById" resultType="User"> select * from t_user where id = #{id} </select>
resultType
寫的就是返回值的類型
測試類:
/** * MyBatis的各種查詢功能: * 1。 若查詢出的數據只有一條,可以通過實體類對象 / list集合 / map集合 來接收 * 2。 若查詢處的數據有多條,一定不能通過實體類對象來接收,此時會拋出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)建映射關系,java中是駝峰的命名方式,而我們mysql中是下劃線的命名方式,所以這時,我們就需要一些操作來將它們進行對應。
比如我們查詢到的數據是;
Emp{empId=null,empName='null',age=20,gender='男'}
一般我們有三種手段來保持一致;
- 為查詢的字段設置別名,和屬性名保持一致
- 當字段符合MySQL的要求使用_,而屬性符合java的要求使用駝峰
此時可以在Mybatis的核心配置文件中設置一個全局配置,可以自動將下劃線映射為駝峰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:設置自定義映射resultMap
所有屬性
id | 表示自定義映射的唯一標識 |
type | 查詢的數據要映射的實體類的類型 |
子標簽:
id | 設置主鍵的映射關系 |
result | 設置普通字段的映射關系 |
association | 設置多對一的映射關系(處理集合類型的屬性) |
collection | 設置一對多的映射關系(處理集合類型的屬性) |
屬性:
property | 設置映射關系中實體類中的屬性名,必須是處理的實體類類型中的屬性名 |
column | 設置映射關系中表中的字段名,必須是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。 若查詢出的數據只有一條,可以通過實體類對象 / list集合 / map集合 來接收 * 2。 若查詢處的數據有多條,一定不能通過實體類對象來接收,此時會拋出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、查詢單個數據
SelectMapper接口:
public interface SelectMapper { /** * 查詢用戶信息的總記錄數 */ 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>
測試類:
/** * 獲取記錄數 * * MyBatis中設置了默認的類型別名 * 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()); }
其實對于很多基本類型數據,都有對應的別名,在returnType
中不用寫全類名,直接寫對應的別名也是一樣的。
而對于自己自定義的實體,也可以通過在全局配置文件
中配置。配置形式有一下兩種;
第一種方法,給單獨的某個實體類配置別名,如同下面的形式
<!--為實體類com.demo.dao.User配置一個別名User--> <typeAliases> <typeAlias type="com.demo.dao.User" alias="User"/> </typeAliases>
第二種方法,批量為某個包下的所有實體類設置別名,配置形式如下
<!-- 為com.demo.dao包下的所有實體類配置別名, MyBatis默認的設置別名的方式就是去除類所在的包后的簡單的類名, 比如com.demo.dao.User這個實體類的別名就會被設置成User --> <typeAliases> <package name="com.demo.dao"/> </typeAliases>
5、查詢一條數據為map集合
SelectMapper接口:
public interface SelectMapper { /** * 根據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集合 * 從數據庫中查詢數據,將其映射為map集合 * 例如把它傳到網頁端,就映射成json對象,所以轉成map很常用 * * 以字段為鍵 */ @Test public void testgetUserByIdToMap(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getUserByIdToMap(4)); }
6、 查詢多條數據為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>
現在是查多條數據放在map集合里,我們會發(fā)現報錯
我們現在查詢的結果有4條,但是我們返回值設置的是個Map
集合,我們一條數據轉換的就是map
,這時候4條數據轉換4
個map
,我們用一個map
集合返回值是獲取不到的。我們用的還是selectOne
方法,只能獲取一個結果,但是我們查詢出來的結果有4條。
方式一、直接使用List來接受
既然我們一條數據轉換為一個map
,多條數據則是放到一個可以存儲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
集合也可以存儲多條數據,但是map
和list
不一樣,你可以直接把每條數據轉換為的map
放在list
中,但是不能把每條數據轉換為的map
放在map
集合中,因為map
是鍵值對,我們查出來的數據作為值,但是誰作為鍵呢?所以說這時候要用到一個注解@Mapkey()
,這是把我們當前查詢的數據所轉換的map
集合,放到一個大的map
集合中,通過這個注解,可以設置map
集合的鍵。這里寫的就是我們所查詢出來的數據的字段,比如說我們把查詢出來的id
作為map
的鍵,值就是當前的每一條數據所轉換為的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); }
注:
若查詢的數據有多條時,并且要將每條數據轉為map集合
此時有2種解決方案:
- 將
mapper
接口的方法返回值設置為泛型是map
的list
集合 - 可以將每條數據轉換的map集合放在一個大的
map
中,但是必須要通過@MapKey
注解,將查詢的某個字段的值作為大的map的鍵
@MapKey("id") Map<String, Object> getAllUserToMap();
到此這篇關于MyBatis各種類型查詢數據參數綁定的實現的文章就介紹到這了,更多相關MyBatis類型查詢數據參數綁定內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring接口通過配置支持返回多種格式(xml,json,html,excel)
這篇文章主要給大家介紹了關于spring接口如何通過配置支持返回多種格式(xml,json,html,excel)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2017-12-12Spring中的@RestControllerAdvice注解使用解析
這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用解析,@RestControllerAdvice?是?Spring?框架中一個用于統一處理控制器異常和返回結果的注解,它可以被用來定義全局異常處理程序和全局響應結果處理程序,需要的朋友可以參考下2024-01-01JSP 開發(fā)之 releaseSession的實例詳解
這篇文章主要介紹了JSP 開發(fā)之 releaseSession的實例詳解的相關資料,需要的朋友可以參考下2017-07-07