最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1、前言

在使用MyBatis框架時(shí),不可避免的需要和各種數(shù)據(jù)來打交道 ,可能的形式有查詢出來一個(gè)實(shí)體對(duì)象,一個(gè)列表,一個(gè)map或者直接是一個(gè)基本類型。

為了方便說明,把所有能查的數(shù)據(jù)類型都用一個(gè)接口來進(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寫的就是返回值的類型
測(cè)試類:

    /**
     * MyBatis的各種查詢功能:
     * 1。 若查詢出的數(shù)據(jù)只有一條,可以通過實(shí)體類對(duì)象 / list集合 / map集合 來接收
     * 2。 若查詢處的數(shù)據(jù)有多條,一定不能通過實(shí)體類對(duì)象來接收,此時(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);
    }

字段名和屬性名無法映射處理

由于字段名和屬性名不一致,而且沒有創(chuàng)建映射關(guān)系,java中是駝峰的命名方式,而我們mysql中是下劃線的命名方式,所以這時(shí),我們就需要一些操作來將它們進(jìn)行對(duì)應(yīng)。
比如我們查詢到的數(shù)據(jù)是;

Emp{empId=null,empName='null',age=20,gender='男'}

一般我們有三種手段來保持一致;

  • 為查詢的字段設(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ù)只有一條,可以通過實(shí)體類對(duì)象 / list集合 / map集合 來接收
     * 2。 若查詢處的數(shù)據(jù)有多條,一定不能通過實(shí)體類對(duì)象來接收,此時(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寫大小寫都可以,寫 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中不用寫全類名,直接寫對(duì)應(yīng)的別名也是一樣的。
而對(duì)于自己自定義的實(shí)體,也可以通過在全局配置文件中配置。配置形式有一下兩種;

第一種方法,給單獨(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è)試類:

    /**
     * 如果沒有實(shí)體類對(duì)象,就把它映射成map集合
     * 從數(shù)據(jù)庫中查詢數(shù)據(jù),將其映射為map集合
     * 例如把它傳到網(wǎng)頁端,就映射成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é)果,但是我們查詢出來的結(jié)果有4條。

方式一、直接使用List來接受

既然我們一條數(shù)據(jù)轉(zhuǎn)換為一個(gè)map,多條數(shù)據(jù)則是放到一個(gè)可以存儲(chǔ)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”)接受

我們?cè)诮涌谥械姆椒ㄟ€是可以這么寫: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ì),我們查出來的數(shù)據(jù)作為值,但是誰作為鍵呢?所以說這時(shí)候要用到一個(gè)注解@Mapkey(),這是把我們當(dāng)前查詢的數(shù)據(jù)所轉(zhuǎn)換的map集合,放到一個(gè)大的map集合中,通過這個(gè)注解,可以設(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í),并且要將每條數(shù)據(jù)轉(zhuǎn)為map集合
此時(shí)有2種解決方案:

  • mapper接口的方法返回值設(shè)置為泛型是maplist集合
  • 可以將每條數(shù)據(jù)轉(zhuǎn)換的map集合放在一個(gè)大的map中,但是必須要通過@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)文章

  • Myeclipse鏈接Oracle等數(shù)據(jù)庫時(shí)lo exception: The Network Adapter could not establish the connection

    Myeclipse鏈接Oracle等數(shù)據(jù)庫時(shí)lo exception: The Network Adapter coul

    今天小編就為大家分享一篇關(guān)于Myeclipse鏈接Oracle等數(shù)據(jù)庫時(shí)lo exception: The Network Adapter could not establish the connection,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • IDEA插件推薦之Maven-Helper的教程圖解

    IDEA插件推薦之Maven-Helper的教程圖解

    這篇文章主要介紹了IDEA插件推薦之Maven-Helper的相關(guān)知識(shí),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考
    2020-07-07
  • Java中HashMap的常見用法詳解

    Java中HashMap的常見用法詳解

    這篇文章主要介紹了Java中HashMap的常見用法詳解,HashMap是Java中的一個(gè)常用子類,它是java.util.HashMap<k,v>集合,實(shí)現(xiàn)了Map<k,v>接口, HashMap可以存儲(chǔ)鍵值對(duì),通過鍵來快速訪問值,在HashMap中,鍵是唯一的,而值可以重復(fù),需要的朋友可以參考下
    2023-09-09
  • 淺談Spring AOP中args()和argNames的含義

    淺談Spring AOP中args()和argNames的含義

    這篇文章主要介紹了Spring AOP中args()和argNames的含義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring?Security+JWT如何實(shí)現(xiàn)前后端分離權(quán)限控制

    Spring?Security+JWT如何實(shí)現(xiàn)前后端分離權(quán)限控制

    本篇將手把手教你用?Spring?Security?+?JWT?搭建一套完整的登錄認(rèn)證與權(quán)限控制體系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整)

    JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整)

    這篇文章主要介紹了JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整),本文使用 Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服務(wù)器實(shí)現(xiàn)FTP服務(wù)器上文件的上傳/下載/刪除等操作,需要的朋友可以參考下
    2015-07-07
  • Java連接數(shù)據(jù)庫步驟解析(Oracle、MySQL)

    Java連接數(shù)據(jù)庫步驟解析(Oracle、MySQL)

    本文主要介紹了Java連接Oracle數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的步驟解析。具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • JavaSE一維數(shù)組和二維數(shù)組用法詳解

    JavaSE一維數(shù)組和二維數(shù)組用法詳解

    數(shù)組存儲(chǔ)同一種數(shù)據(jù)類型多個(gè)元素的集合,既可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于JavaSE一維數(shù)組和二維數(shù)組用法的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • SpringBoot依賴和代碼分開打包的實(shí)現(xiàn)步驟

    SpringBoot依賴和代碼分開打包的實(shí)現(xiàn)步驟

    本文主要介紹了SpringBoot依賴和代碼分開打包的實(shí)現(xiàn)步驟,,這種方法將依賴和代碼分開打包,一般更新只有代碼修改,Pom文件是不會(huì)經(jīng)常改動(dòng)的,感興趣的可以了解一下
    2023-10-10
  • SpringBoot最簡(jiǎn)潔的國際化配置

    SpringBoot最簡(jiǎn)潔的國際化配置

    這篇文章主要介紹了SpringBoot最簡(jiǎn)潔的國際化配置,Spring Boot是一個(gè)用于構(gòu)建獨(dú)立的、生產(chǎn)級(jí)別的Spring應(yīng)用程序的框架,國際化是一個(gè)重要的功能,它允許應(yīng)用程序根據(jù)用戶的語言和地區(qū)顯示不同的內(nèi)容,在Spring Boot中,實(shí)現(xiàn)國際化非常簡(jiǎn)單,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

镇巴县| 平乐县| 宿州市| 天峻县| 襄垣县| 濉溪县| 东乌珠穆沁旗| 彭州市| 陆良县| 景谷| 湟源县| 家居| 松桃| 陇川县| 永川市| 龙岩市| 湘阴县| 海伦市| 林芝县| 托克逊县| 临洮县| 南郑县| 株洲市| 南开区| 镇远县| 京山县| 襄垣县| 赤水市| 延寿县| 遵义市| 望都县| 阳城县| 大渡口区| 马公市| 北川| 苏尼特右旗| 鄂托克旗| 莲花县| 辛集市| 元氏县| 积石山|