亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實(shí)現(xiàn)

 更新時(shí)間:2023年06月12日 09:39:52   作者:fckey  
本文主要介紹了MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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ù),但是maplist不一樣,你可以直接把每條數(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è)置為泛型是maplist集合
  • 可以將每條數(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)文章

  • java控制Pdf自動(dòng)打印的小例子

    java控制Pdf自動(dòng)打印的小例子

    java控制Pdf自動(dòng)打印的小例子,需要的朋友可以參考一下
    2013-04-04
  • Jackson忽略字段實(shí)現(xiàn)對(duì)字段進(jì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-10
  • Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲

    Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲

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

    spring接口通過(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)目容器中

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

    Spring中的@RestControllerAdvice注解使用解析

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

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

    下面小編就為大家?guī)?lái)一篇Java文件(io)編程_文件字節(jié)流的使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • SpringBoot實(shí)現(xiàn)接口冪等性的4種方案

    SpringBoot實(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-03
  • Springboot項(xiàng)目快速實(shí)現(xiàn)Aop功能

    Springboot項(xiàng)目快速實(shí)現(xiàn)Aop功能

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

    JSP 開(kāi)發(fā)之 releaseSession的實(shí)例詳解

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

最新評(píng)論