欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis各種類型查詢數據參數綁定的實現

 更新時間:2023年06月12日 09:39:52   作者:fckey  
本文主要介紹了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條數據轉換4map,我們用一個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集合也可以存儲多條數據,但是maplist不一樣,你可以直接把每條數據轉換為的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接口的方法返回值設置為泛型是maplist集合
  • 可以將每條數據轉換的map集合放在一個大的map中,但是必須要通過@MapKey注解,將查詢的某個字段的值作為大的map的鍵
@MapKey("id")
Map<String, Object> getAllUserToMap();

到此這篇關于MyBatis各種類型查詢數據參數綁定的實現的文章就介紹到這了,更多相關MyBatis類型查詢數據參數綁定內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java控制Pdf自動打印的小例子

    java控制Pdf自動打印的小例子

    java控制Pdf自動打印的小例子,需要的朋友可以參考一下
    2013-04-04
  • Jackson忽略字段實現對字段進行序列化和反序列化

    Jackson忽略字段實現對字段進行序列化和反序列化

    在使用?Jackson?進行序列化和反序列化時,有時候需要對某些字段進行過濾,以便在?JSON?數據中不包含某些敏感信息,下面就一起來了解一下Jackson忽略字段實現對字段進行序列化和反序
    2023-10-10
  • Java項目實現五子棋小游戲

    Java項目實現五子棋小游戲

    這篇文章主要為大家詳細介紹了Java項目實現五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • spring接口通過配置支持返回多種格式(xml,json,html,excel)

    spring接口通過配置支持返回多種格式(xml,json,html,excel)

    這篇文章主要給大家介紹了關于spring接口如何通過配置支持返回多種格式(xml,json,html,excel)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-12-12
  • 如何把第三方服務注冊到spring項目容器中

    如何把第三方服務注冊到spring項目容器中

    這篇文章主要為大家介紹了如何把第三方服務注冊到spring項目容器中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Spring中的@RestControllerAdvice注解使用解析

    Spring中的@RestControllerAdvice注解使用解析

    這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用解析,@RestControllerAdvice?是?Spring?框架中一個用于統一處理控制器異常和返回結果的注解,它可以被用來定義全局異常處理程序和全局響應結果處理程序,需要的朋友可以參考下
    2024-01-01
  • Java文件(io)編程_文件字節(jié)流的使用方法

    Java文件(io)編程_文件字節(jié)流的使用方法

    下面小編就為大家?guī)硪黄狫ava文件(io)編程_文件字節(jié)流的使用方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringBoot實現接口冪等性的4種方案

    SpringBoot實現接口冪等性的4種方案

    這篇文章主要介紹了SpringBoot實現接口冪等性的4種方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Springboot項目快速實現Aop功能

    Springboot項目快速實現Aop功能

    這篇文章主要介紹了Springboot項目如何快速實現Aop功能,對此方面感興趣的小伙伴可以詳細參考閱讀本文,本文有一定的參考價值
    2023-03-03
  • JSP 開發(fā)之 releaseSession的實例詳解

    JSP 開發(fā)之 releaseSession的實例詳解

    這篇文章主要介紹了JSP 開發(fā)之 releaseSession的實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07

最新評論