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

一文搞懂Mybatis中Mapper配置文件獲取參數(shù)的五種方式

 更新時(shí)間:2024年03月25日 10:00:51   作者:Fon |  
這篇文章主要介紹了Mybatis中Mapper配置文件獲取參數(shù)的五種方式,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

前提提要

本系列Mybatis筆記基于mybatis3.5.2 , https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.2中有詳細(xì)的文檔說(shuō)明,可以進(jìn)行下載閱讀,本文只是對(duì)Mybatis的一些常用操作進(jìn)行匯總總結(jié)。

  • IDE: IntelliJ IDEA 2021.3
  • 構(gòu)建工具: apache-maven-3.6.3
  • MySQL版本:MySQL 5.7.35
  • MyBatis版本:MyBatis 3.5.7

對(duì)于mybatis框架的使用,按照上次介紹的,我們配置的映射文件中,通過(guò)namespace將映射文件和接口關(guān)聯(lián)起來(lái)了。

具體方法通過(guò)id精確的對(duì)應(yīng)。然后,方法對(duì)應(yīng)的具體數(shù)據(jù)操作,在mapper文件中的<insert><select>.... 書(shū)寫具體的SQL語(yǔ)句來(lái)進(jìn)行實(shí)現(xiàn)。

但是,對(duì)于一些需要傳輸數(shù)據(jù)的行為,如條件查詢,插入操作等等,都需要將用戶調(diào)用接口的實(shí)際參數(shù)數(shù)據(jù),落實(shí)到具體的mapper文件中的各個(gè)方法中。

問(wèn)題來(lái)了?

給接口的實(shí)際參數(shù),mapper實(shí)際操作如何取對(duì)應(yīng)的數(shù)據(jù), 數(shù)據(jù)是以什么方式傳遞給mapper中各標(biāo)簽實(shí)現(xiàn)數(shù)據(jù)的CRUD操作的呢?

一,IDEA中設(shè)置各種配置文件的模板

這節(jié)內(nèi)容主要就是平時(shí)開(kāi)發(fā)過(guò)程中的技巧性操作。

1. 設(shè)置mybatis-config.xml文件模板

模板內(nèi)容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="jdbc.properties"></properties>

    <typeAliases>
        <package name=""></package>
    </typeAliases>

    <!--設(shè)置連接數(shù)據(jù)庫(kù)的環(huán)境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url"
                          value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <package name=""/>
    </mappers>
</configuration>

IDEA中添加mybatis-config.xml文件模板的具體操作:

在這里插入圖片描述

最后的效果如圖所示,新建完上述模板之后,就可以按照上述你創(chuàng)建的模板創(chuàng)建一個(gè)mybatis-config.xml文件。

在這里插入圖片描述

2. 設(shè)置 **mapper.xml映射文件模板

和上述mybatis-confg.xml設(shè)置文件模板一樣,模板內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">

</mapper>

具體的操作和設(shè)置mybatis-config.xml操作是一樣的。

在這里插入圖片描述

二,獲取參數(shù)的兩種方式

在談將調(diào)用接口的實(shí)際參數(shù)傳給mapper中各個(gè)標(biāo)簽實(shí)際操作是什么樣之前,我們先看看mapper中獲取參數(shù)的兩種方式,我們知道JDBC中有兩種設(shè)置參數(shù)的方式:

通過(guò)參數(shù)預(yù)處理的方式 2. 通過(guò)拼接SQL的方式

    @Test
    public void testJDBC() throws SQLException, ClassNotFoundException {
        String username = "cherry";
        Class.forName("");
        Connection connection = DriverManager.getConnection("", "", "");
        // 1. 字符串拼接 ->獲得預(yù)編譯對(duì)象 -》sql注入問(wèn)題
        PreparedStatement preparedStatement = connection.prepareStatement("select * from t_user where username = '" + username + "'");

        // 2. 占位符
        PreparedStatement ps2 = connection.prepareStatement("select * from t_user where username = ?");
        ps2.setString(1, username);
    }

對(duì)應(yīng)于MyBatis中,我們也有這兩種方式:1. 字符串拼接 2. 占位符

MyBatis獲取參數(shù)值的兩種方式:${}#{},就和JDBC中的兩種方式一脈相承。

  • ${}的本質(zhì)就是字符串拼接
  • #{}的本質(zhì)就是占位符賦值

${}使用字符串拼接的方式拼接sql,若為字符串類型或日期類型的字段進(jìn)行賦值時(shí),需要手動(dòng)加單引號(hào);

但是#{}使用占位符賦值的方式拼接sql,此時(shí)為字符串類型或日期類型的字段進(jìn)行賦值時(shí),可以自動(dòng)添加單引號(hào)(盡量使用這一種)。

三,MyBatis獲取參數(shù)值的五種情況

通過(guò)了上述說(shuō)明了Mybatis中兩種獲取基本方式的區(qū)別。下面通過(guò)給接口床傳遞實(shí)參不同的形式來(lái)劃分為一下五種情況進(jìn)行一一的說(shuō)明。

3.1 單個(gè)字面量類型的參數(shù)

也就是如果調(diào)用的形式是:

getUserById(1) 

mapper接口中的方法參數(shù)為單個(gè)的字面量類。此時(shí)可以使用${}#{}以任意的名稱獲取參數(shù)的值,注意${}需要手動(dòng)加單引號(hào)。
如下所示:

public interface ParameterMapper {
    /**
     * 單個(gè)的字面量類型:
     * 根據(jù)用戶名查詢用戶信息
     */
    User getUserByUserName(String username);
}

在對(duì)應(yīng)的配置類中進(jìn)行配置,按照上述的方式,都可以進(jìn)行配置,如下:

Notice:使用#{},里面內(nèi)容可以隨便寫,都是傳進(jìn)來(lái)的username的值。

方式一:

<!--    User getUserByUserName(String username);-->
<!--    使用#{},里面內(nèi)容可以隨便寫,都是傳進(jìn)來(lái)的username的值-->
    <select id="getUserByUserName" resultType="User">
       select * from t_user where username = #{username}
    </select>

方式二:

<!--    User getUserByUserName(String username);-->
    <select id="getUserByUserName" resultType="User">
        <!-- 
       select * from t_user where username = ${username}
          如果使用這種方式,得到的sql語(yǔ)句是:
          Preparing: select * from t_user where username = RUOYI
          而其中username的值‘RUOYI'沒(méi)有單引號(hào),語(yǔ)句不正確,會(huì)報(bào)錯(cuò)。
          因此要手動(dòng)添加單引號(hào)
       -->
        select * from t_user where username = '${username}'
    </select>

測(cè)試類:

    /**
     * MyBatis獲取參數(shù)值的各種情況:
     * 情況1: mapper接口方法的參數(shù)為單個(gè)字面量的參數(shù)
     * 可以通過(guò)${} #{}以任意的字符串獲得參數(shù)值,但需要注意${}的單引號(hào)問(wèn)題
     */
    @Test
    public void testgetUserByUserName(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        User user = mapper.getUserByUserName("");
        System.out.println(user);
    }

3.2 多個(gè)字面量類型的參數(shù)

若在mapper接口的方法中有多個(gè)參數(shù)的時(shí)候,我們MyBatis的操作是會(huì)自動(dòng)的將這些參數(shù)放到一個(gè)Map集合中。通過(guò)以arg0, arg1, arg2... argn,以參數(shù)值為值。還有一種就是通過(guò)param1, param2...,以參數(shù)為值。

因此,只要通過(guò)#{}或者是${}訪問(wèn)map集合中的鍵就可以獲取到對(duì)應(yīng)的值。但是需要注意的是${}需要手動(dòng)加上單引號(hào)。

public interface ParameterMapper {
    /**
     * 驗(yàn)證登錄
     */
    User checkLogin(String username, String password);
}

對(duì)應(yīng)在mapper映射文件中:

<!--    User checkLogin(String username, String password);-->
    <select id="checkLogin" resultType="User">
        <!--
        寫:select * from t_user where username = #{username} and password = #{password}
        會(huì)報(bào)錯(cuò):Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
        因?yàn)閟ql語(yǔ)句沒(méi)有解析成功-->

        <!--以map集合形式存儲(chǔ),arg0->param0, arg1->param1,這時(shí)直接用鍵arg訪問(wèn)就好了,用param訪問(wèn)也行。

		以下兩種方式選一個(gè):-->
        select * from t_user where username = #{arg0} and password = #{arg1}
        select * from t_user where username = '${param1}' and password = '${param2}'
    </select>

測(cè)試類:

    /**
     * 情況2:mapper接口方法的參數(shù)為多個(gè)時(shí)
     * 此時(shí)MyBatis會(huì)將這些參數(shù)放在一個(gè)map集合中,以兩種方式進(jìn)行存儲(chǔ)
     * a》以arg0,arg1。。為鍵,參數(shù)為值
     * b》以param0,param1。。為鍵,參數(shù)位置
     * 因此只需要通過(guò)#{}和${}以鍵的方式訪問(wèn)值即可,但需要注意${}的單引號(hào)問(wèn)題
     */
    @Test
    public void testCheckLogin(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        User user = mapper.checkLogin("fangshaolei","123456");
        System.out.println(user);
    }

Notice: 寫:select * from t_user where username = #{username} and password = #{password}

會(huì)報(bào)錯(cuò):Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2] 因?yàn)?code>sql語(yǔ)句沒(méi)有解析成功

3.3 Map集合類型的參數(shù)

我們大概有了一些思路,基本上對(duì)于所有的參數(shù)。Mybatis的操作都是先將所有的參數(shù)都封裝到一個(gè)map中,然后在mapper中使用#{}或者是${}來(lái)進(jìn)行取。

如果mapper接口中的方法需要的參數(shù)為多個(gè)時(shí),此時(shí)可以手動(dòng)創(chuàng)建map集合,也就是我們不在通過(guò)mybatis來(lái)進(jìn)行創(chuàng)建參數(shù),而是手動(dòng)的自己傳過(guò)去一個(gè)map

所以,將這些數(shù)據(jù)放在map中只需要通過(guò)${}#{}訪問(wèn)map集合的鍵就可以獲取相對(duì)應(yīng)的值,注意${}需要手動(dòng)加單引號(hào).

public interface ParameterMapper {
	/**
     * 驗(yàn)證登錄
     */
    User checkLoginByMap(Map<String, Object> map);
}

在對(duì)應(yīng)的map中進(jìn)行取用的操作。

<!--    User checkLoginByMap(Map<String, Object> map);-->
    <select id="checkLoginByMap" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>

測(cè)試類:

    /**
     * 情況3:若mapper接口方法的參數(shù)有多個(gè)時(shí),可以手動(dòng)將這些參數(shù)放在一個(gè)map中存儲(chǔ)
     * 只需要通過(guò)#{} ${}以鍵的方式訪問(wèn)值即可,但是需要注意${}的單引號(hào)問(wèn)題
     */
    @Test
    public void testCheckLoginByMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

        Map<String, Object> map = new HashMap<>();
        map.put("username","RUOYI");
        map.put("password","123456");

        User user = mapper.checkLoginByMap(map);
        System.out.println(user);
    }

Notice:但是需要注意的是,對(duì)于自己封裝的map的形式,在使用兩種方式進(jìn)行取用的時(shí)候,需要指定在map中的鍵,也就是我們自己存在map數(shù)據(jù)中的鍵。

3.4 實(shí)體類參數(shù)

如果mapper接口中的方法參數(shù)是實(shí)體類對(duì)象的時(shí)候,此時(shí)可以使用 #{}${},通過(guò)訪問(wèn)實(shí)體類對(duì)象中的屬性名獲取屬性值,同樣需要注意的是:${}需要手動(dòng)加上單引號(hào)。

其實(shí),實(shí)體類對(duì)象參數(shù),在mybatis中會(huì)被封裝成map對(duì)象的形式。
Mapper對(duì)應(yīng)的接口:

public interface ParameterMapper {
    /**
     * 添加用戶信息
     */
    int insertUser(User user);
}

Mapper.xml文件中的配置:

<!--        int insertUser(User user);-->
<!--    找到相對(duì)應(yīng)的get方法,如username->找getUsername(),看get/set方法-->
    <insert id="insertUser">
        insert into t_user values(null, #{username}, #{password}, #{age}, #{gender}, #{email})
    </insert>

測(cè)試類:

    /**
     * 情況4:mapper接口方法的參數(shù)是實(shí)體類類型的參數(shù)(web從control層傳過(guò)來(lái)的)
     * 只需要通過(guò)#{} ${}以屬性的方式訪問(wèn)屬性值即可,但是需要注意${}的單引號(hào)問(wèn)題
     */
    @Test
    public void testInsertUser(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

        User user = new User(null, "fangshaolei", "123456", 66, "m", "sl.fang@gmail.com");
        mapper.insertUser(user);
    }

Notice:同樣需要注意的是,#{}中的參數(shù)名稱不能隨意的寫,要和屬性名稱一致。

3.5 使用@Param標(biāo)識(shí)參數(shù)

通過(guò)上述的四種方法,我們知道,除了只有一個(gè)字面量參數(shù)之外。其他的參數(shù)通過(guò)#{}或者是${}取用的值都需要正確的給定Mybatis內(nèi)部map的鍵。

如果是多個(gè)字面量,按照Mybatis內(nèi)部默認(rèn)的鍵來(lái)進(jìn)行取用。如果傳過(guò)來(lái)的參數(shù)是自己定義的Map或者是實(shí)體類對(duì)象的形式。則在取用的時(shí)候,指定參數(shù)名稱和自定義Map的鍵一致和如果參數(shù)是實(shí)體類對(duì)象,則需要和對(duì)象的屬性名一致。

但是,我們能夠自定義Mybatis內(nèi)部已經(jīng)封裝好的Mapkey,從而通過(guò)#{}或者是${}的形式,利用我們自定義的key來(lái)進(jìn)行取用呢?

這就需要通過(guò)@Param來(lái)實(shí)現(xiàn)。

可以通過(guò)@Param注解標(biāo)識(shí)mapper接口中的方法參數(shù)。此時(shí),會(huì)將這些參數(shù)放在map集合中,以@Param注解的value屬性值為鍵,以參數(shù)為值;

param1,param2...為鍵,以參數(shù)為值;

只需要通過(guò)${}#{}訪問(wèn)map集合的鍵就可以獲取相對(duì)應(yīng)的值, 注意${}需要手動(dòng)加單引號(hào)。

public interface ParameterMapper {
    /**
     * 驗(yàn)證登錄 (使用@Param)
     */
    User checkLoginByParam(@Param("username") String username, @Param("password") String password);
}

對(duì)應(yīng)的mapper.xml配置:

<!--    以@Param的值為鍵,參數(shù)為值; 或以"param1"/"param2"為鍵,參數(shù)為值-->
<!--    User checkLoginByParam(@Param("username") String username, @Param("password") String password);-->
    <select id="checkLoginByParam" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>

測(cè)試類:

    /**
     * 情況5:使用@Param注解來(lái)命名參數(shù)
     * 此時(shí)MyBatis會(huì)將這些參數(shù)放在一個(gè)map集合中,以兩種方式進(jìn)行存儲(chǔ)
     * a》以@Param的值為鍵,參數(shù)為值; @Param(value = "xxx")
     * b》以param0,param1...為鍵,參數(shù)為值
     */
    @Test
    public void testCheckLoginByParam(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        User user = mapper.checkLoginByParam("fangshaolei","123456");
        System.out.println(user);
    }

四,總結(jié)

以上就是一文搞懂Mybatis中Mapper配置文件獲取參數(shù)的五種方式的詳細(xì)內(nèi)容,更多關(guān)于Mybatis Mapper獲取參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

  • 如何將jdk10降版本到j(luò)dk1.8

    如何將jdk10降版本到j(luò)dk1.8

    這篇文章主要介紹了如何將jdk10降版本到j(luò)dk1.8問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring?Boot?整合RocketMq實(shí)現(xiàn)消息過(guò)濾功能

    Spring?Boot?整合RocketMq實(shí)現(xiàn)消息過(guò)濾功能

    這篇文章主要介紹了Spring?Boot?整合RocketMq實(shí)現(xiàn)消息過(guò)濾,本文講解了RocketMQ實(shí)現(xiàn)消息過(guò)濾,針對(duì)不同的業(yè)務(wù)場(chǎng)景選擇合適的方案即可,需要的朋友可以參考下
    2022-06-06
  • Java終止線程實(shí)例和stop()方法源碼閱讀

    Java終止線程實(shí)例和stop()方法源碼閱讀

    這篇文章主要介紹了Java終止線程實(shí)例和stop()方法源碼閱讀,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Java中CopyOnWriteArrayList的使用解析

    Java中CopyOnWriteArrayList的使用解析

    這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場(chǎng)景里,比如緩存,它不存在擴(kuò)容的概念,每次寫操作都要復(fù)制一個(gè)副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下
    2023-12-12
  • springboot分布式整合dubbo的方式

    springboot分布式整合dubbo的方式

    Dubbo是一款高性能、輕量級(jí)的開(kāi)源Java RPC框架,本文通過(guò)實(shí)例代碼給大家介紹springboot分布式整合dubbo的方式,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 在SpringBoot項(xiàng)目中解決依賴沖突問(wèn)題的方法

    在SpringBoot項(xiàng)目中解決依賴沖突問(wèn)題的方法

    在SpringBoot項(xiàng)目中,依賴沖突是一個(gè)常見(jiàn)的問(wèn)題,特別是當(dāng)項(xiàng)目引入多個(gè)第三方庫(kù)或框架時(shí),依賴沖突可能導(dǎo)致編譯錯(cuò)誤、運(yùn)行時(shí)異?;虿豢深A(yù)測(cè)的行為,本文給大家介紹了如何在SpringBoot項(xiàng)目中解決以來(lái)沖突問(wèn)題的方法,需要的朋友可以參考下
    2024-01-01
  • mybatis+lombok出現(xiàn)java.lang.IndexOutOfBoundsException錯(cuò)誤及解決

    mybatis+lombok出現(xiàn)java.lang.IndexOutOfBoundsException錯(cuò)誤及解決

    在使用MyBatis和Lombok時(shí),如果遇到j(luò)ava.lang.IndexOutOfBoundsException問(wèn)題,是因?yàn)镸yBatis在嘗試將查詢結(jié)果封裝成Java對(duì)象時(shí),找不到構(gòu)造函數(shù)中對(duì)應(yīng)的字段,這通常是由于Lombok的@Builder注解生成了全參構(gòu)造函數(shù)
    2025-02-02
  • 從基礎(chǔ)到實(shí)戰(zhàn)詳解SpringBoot獲取資源文件全指南

    從基礎(chǔ)到實(shí)戰(zhàn)詳解SpringBoot獲取資源文件全指南

    在 SpringBoot 開(kāi)發(fā)中,我們經(jīng)常需要訪問(wèn)各類資源文件,本文將系統(tǒng)講解 SpringBoot 中資源文件的存放規(guī)則,獲取方法及實(shí)戰(zhàn)技巧,需要的可以了解下
    2025-07-07
  • Java 7大常見(jiàn)排序方法實(shí)例詳解

    Java 7大常見(jiàn)排序方法實(shí)例詳解

    這篇文章主要通過(guò)實(shí)例介紹了Java中常用的7種排序方法,需要的朋友可以參考下
    2017-04-04
  • 最新評(píng)論

    朝阳市| 余姚市| 北海市| 同仁县| 柳河县| 临沭县| 新余市| 彭州市| 武清区| 苏州市| 汉沽区| 乐都县| 青河县| 常德市| 永丰县| 西峡县| 新邵县| 平阳县| 三台县| 会宁县| 蒙自县| 阳高县| 石台县| 芦山县| 扶风县| 廊坊市| 赤壁市| 乌海市| 凤台县| 电白县| 东莞市| 金门县| 新宁县| 东海县| 项城市| 芦溪县| 朝阳市| 深水埗区| 临泉县| 南宫市| 嘉鱼县|