溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MyBatis中的占位符入?yún)⒎椒ㄓ心男?/h1>
發(fā)布時(shí)間:2023-03-01 14:16:16 來源:億速云 閱讀:99 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“MyBatis中的占位符入?yún)⒎椒ㄓ心男?,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MyBatis中的占位符入?yún)⒎椒ㄓ心男卑?

    前言

    #{}占位符會(huì)被解析為JDBC中的預(yù)編譯語句(Prepared Statement)中的參數(shù)占位符?,一個(gè)#{}會(huì)被解析為一個(gè)?。

    ${}占位符標(biāo)識(shí)的位置會(huì)直接被替換為入?yún)?,是?jiǎn)單的字符串替換。

    正文

    一. 入?yún)⑹腔绢愋筒⑶覅?shù)個(gè)數(shù)為1

    映射接口中查詢單條記錄的方法定義如下。

    // 使用#{}作為參數(shù)占位符
    MyInfo getMyInfoByNameUseWell(String infoName);
    // 使用${}作為參數(shù)占位符
    MyInfo getMyInfoByNameUseDollar(String infoName);

    與之對(duì)應(yīng)的映射文件中的查詢標(biāo)簽定義如下。

    <select id="getMyInfoByNameUseWell" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = #{name}
    </select>
    <select id="getMyInfoByNameUseDollar" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = '${name}'
    </select>

    入?yún)⑹腔绢愋停ㄊ纠惺?strong>String類型)且參數(shù)個(gè)數(shù)只有一個(gè)時(shí),使用#{}${}占位符均不要求占位符指定的名稱與映射接口中的參數(shù)名相等,但是#{}進(jìn)行占位符替換后參數(shù)會(huì)添加上''號(hào),而${}進(jìn)行占位符替換是直接進(jìn)行字符串替換,所以上述示例中,使用${}占位符時(shí)需要在占位符兩側(cè)添加''號(hào)。

    二. 入?yún)⑹腔绢愋筒⑶覅?shù)個(gè)數(shù)大于1

    映射接口中查詢單條記錄的方法定義如下。

    // 使用#{}作為參數(shù)占位符
    MyInfo getMyInfoByNameTypeUseWell(@Param("infoName") String infoName, @Param("infoType") String infoType);
    // 使用${}作為參數(shù)占位符
    MyInfo getMyInfoByNameTypeUseDollar(@Param("infoName") String infoName, @Param("infoType") String infoType);

    與之對(duì)應(yīng)的映射文件中的查詢標(biāo)簽定義如下。

    <select id="getMyInfoByNameTypeUseWell" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType}
    </select>
    <select id="getMyInfoByNameTypeUseDollar" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}'
    </select>

    入?yún)⑹腔绢愋颓覅?shù)個(gè)數(shù)大于一個(gè)時(shí),此時(shí)需要在映射接口的方法中使用@Param注解定義參數(shù)的名稱,并且要求占位符指定的名稱需要與@Param注解定義的名稱相等,否則報(bào)錯(cuò)。

    三. 入?yún)⑹亲远x類型

    映射接口中查詢單條記錄的方法定義如下。

    // 使用#{}作為參數(shù)占位符
    MyInfo getMyInfoByQueryParamUseWell(QueryParam queryParam);
    // 使用${}作為參數(shù)占位符
    MyInfo getMyInfoByQueryParamUseDollar(QueryParam queryParam);

    其中自定義類型QueryParam定義如下。

    @Data
    public class QueryParam {
        private String infoName;
        private String infoType;
        public QueryParam(String infoName, String infoType) {
            this.infoName = infoName;
            this.infoType = infoType;
        }
    }

    與之對(duì)應(yīng)的映射文件中的查詢標(biāo)簽定義如下。

    <select id="getMyInfoByQueryParamUseWell" resultMap="myInfoMap"
            parameterType="com.learn.mybatis.dynamic.entity.QueryParam">
        SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType}
    </select>
    <select id="getMyInfoByQueryParamUseDollar" resultMap="myInfoMap"
            parameterType="com.learn.mybatis.dynamic.entity.QueryParam">
        SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}'
    </select>

    入?yún)⑹亲远x類型時(shí),占位符指定的名稱需要與自定義類型中的字段名相同,否則報(bào)錯(cuò)。

    四. 入?yún)⑹荕ap類型

    映射接口中查詢單條記錄的方法定義如下。

    // 使用#{}作為參數(shù)占位符
    MyInfo getMyInfoByMapUseWell(Map<String, Object> queryParamMap);
    // 使用${}作為參數(shù)占位符
    MyInfo getMyInfoByMapUseDollar(Map<String, Object> queryParamMap);

    與之對(duì)應(yīng)的映射文件中的查詢標(biāo)簽定義如下。

    <select id="getMyInfoByMapUseWell" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = #{infoName} AND info_type = #{infoType}
    </select>
    <select id="getMyInfoByMapUseDollar" resultMap="myInfoMap">
        SELECT * FROM myinfo WHERE info_name = '${infoName}' AND info_type = '${infoType}'
    </select>

    入?yún)⑹?strong>Map時(shí),占位符指定的名稱需要與Map的key相等,這樣才能將key對(duì)應(yīng)的value與占位符進(jìn)行替換。

    五. 只能使用${}的場(chǎng)景

    通過上面幾點(diǎn)分析,發(fā)現(xiàn)大多數(shù)能夠使用${}占位符的場(chǎng)景都可以使用#{}占位符,而且#{}占位符相比${}占位符還具有能夠防止SQL注入提高執(zhí)行速度的功能,但是如下幾種場(chǎng)景,只能夠使用${}占位符。

    1. 入?yún)⑹潜砻?/h5>

    當(dāng)入?yún)⑹潜砻麜r(shí),此時(shí)如果表名的參數(shù)占位符使用#{},會(huì)報(bào)錯(cuò),因?yàn)楸砻淮_定時(shí),是無法進(jìn)行預(yù)編譯SQL的,所以這種場(chǎng)景只能使用${}作為表名的參數(shù)占位符。下面是示例。

    映射接口中的示例方法定義如下。

    // 傳入表名實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建表
    void createMyInfoTable(String tableName);
    // 傳入表名動(dòng)態(tài)指定被查詢的表
    MyInfo getMyInfoByNameUseWellDynmic(@Param("tableName") String tableName, @Param("infoName") String infoName);

    與之對(duì)應(yīng)的映射文件中的標(biāo)簽定義如下。

    <update id="createMyInfoTable">
        CREATE TABLE ${tableName} (
            id INT(11) PRIMARY KEY AUTO_INCREMENT,
            info_name VARCHAR(255),
            info_type ENUM('USER', 'HOUSE', 'CAR'),
            info_detail VARCHAR(255),
            info_seq INT(11)
        )
    </update>
    <select id="getMyInfoByNameUseWellDynmic" resultMap="myInfoMap">
        SELECT * FROM ${tableName} WHERE info_name = #{infoName}
    </select>
    2. 入?yún)⑹橇忻?/h5>

    當(dāng)入?yún)⑹橇忻麜r(shí),此時(shí)也只能使用${}作為列名的參數(shù)占位符。下面是示例。

    映射接口中的方法定義如下。

    // 為數(shù)據(jù)庫表創(chuàng)建索引
    // 表名,索引名,加索引的列的列名全部動(dòng)態(tài)指定
    void createIndex(@Param("tableName") String tableName, 
                     @Param("indexName") String indexName, 
                     @Param("columnNames") List&lt;String&gt; columnNames);
    // 對(duì)查詢結(jié)果集進(jìn)行排序并動(dòng)態(tài)指定排序的列名
    List&lt;MyInfo&gt; getMyInfosSorted(String columnName);

    與之對(duì)應(yīng)的映射文件中的標(biāo)簽定義如下。

    <update id="createIndex">
        CREATE INDEX
            ${indexName}
        ON
            ${tableName}
        <foreach collection="columnNames" item="columnName"
                    open="(" separator="," close=")">
            ${columnName}
        </foreach>
    </update>
    <select id="getMyInfosSorted" resultMap="myInfoMap">
        SELECT * FROM myinfo ORDER BY ${columnName} DESC
    </select>

    在為數(shù)據(jù)庫表創(chuàng)建索引的示例中,表名,索引名和加索引的列的列名全部都需要使用${}作為參數(shù)占位符,否則會(huì)報(bào)錯(cuò)。在對(duì)查詢結(jié)果集進(jìn)行排序的示例中,如果列名占位符不使用${}而使用#{},不會(huì)報(bào)錯(cuò),但是無法實(shí)現(xiàn)根據(jù)指定列進(jìn)行排序的功能。

    到此,相信大家對(duì)“MyBatis中的占位符入?yún)⒎椒ㄓ心男庇辛烁畹牧私?,不妨來?shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI