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

MyBatis中的占位符入?yún)⑷嬖斀?/h1>
 更新時間:2023年03月01日 11:27:11   作者:半夏之沫  
這篇文章主要為大家介紹了MyBatis中的占位符全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

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

${}占位符標識的位置會直接被替換為入?yún)?,是簡單的字符串替換。

本篇文章將結合不同的入?yún)鼍皩?code>#{}和${}進行分析。

正文

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

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

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

與之對應的映射文件中的查詢標簽定義如下。

<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ù)個數(shù)只有一個時,使用#{}${}占位符均不要求占位符指定的名稱與映射接口中的參數(shù)名相等,但是#{}進行占位符替換后參數(shù)會添加上''號,而${}進行占位符替換是直接進行字符串替換,所以上述示例中,使用${}占位符時需要在占位符兩側添加''號。

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

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

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

與之對應的映射文件中的查詢標簽定義如下。

<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ù)個數(shù)大于一個時,此時需要在映射接口的方法中使用@Param注解定義參數(shù)的名稱,并且要求占位符指定的名稱需要與@Param注解定義的名稱相等,否則報錯。

三. 入?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;
    }
}

與之對應的映射文件中的查詢標簽定義如下。

<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類型時,占位符指定的名稱需要與自定義類型中的字段名相同,否則報錯。

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

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

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

與之對應的映射文件中的查詢標簽定義如下。

<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時,占位符指定的名稱需要與Map的key相等,這樣才能將key對應的value與占位符進行替換。

五. 只能使用${}的場景

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

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

當入?yún)⑹潜砻麜r,此時如果表名的參數(shù)占位符使用#{},會報錯,因為表名不確定時,是無法進行預編譯SQL的,所以這種場景只能使用${}作為表名的參數(shù)占位符。下面是示例。

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

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

與之對應的映射文件中的標簽定義如下。

<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)⑹橇忻?/h4>

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

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

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

與之對應的映射文件中的標簽定義如下。

<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ù)占位符,否則會報錯。在對查詢結果集進行排序的示例中,如果列名占位符不使用${}而使用#{},不會報錯,但是無法實現(xiàn)根據(jù)指定列進行排序的功能。

總結

下面對#{}${}這兩種占位符的使用進行一個總結。

  • #{}占位符會被解析為JDBC中的預編譯語句(Prepared Statement)中的參數(shù)占位符?,一個#{}會被解析為一個?,而${}占位符標識的位置會直接被替換為入?yún)?,是簡單的字符串替換;
  • #{}進行占位符替換后參數(shù)會添加上''號,而${}不會;
  • #{}可以防止SQL注入,以及提高SQL語句執(zhí)行效率,而${}不具備這些功能;
  • 當入?yún)楸砻土忻麜r,需要使用${}作為表名和列名的參數(shù)占位符。

以上就是MyBatis中的占位符全面詳解的詳細內(nèi)容,更多關于MyBatis占位符的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot應用啟動過程分析

    SpringBoot應用啟動過程分析

    這篇文章主要介紹了SpringBoot應用啟動過程分析,需要的朋友可以參考下
    2017-08-08
  • java.lang.IllegalStateException:方法有太多主體參數(shù)問題

    java.lang.IllegalStateException:方法有太多主體參數(shù)問題

    這篇文章主要介紹了java.lang.IllegalStateException:方法有太多主體參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring Boot 簡介(入門篇)

    Spring Boot 簡介(入門篇)

    Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。下面通過本文給大家介紹spring boot相關知識,需要的的朋友參考下吧
    2017-04-04
  • Java中的時間日期API知識點總結

    Java中的時間日期API知識點總結

    本文給大家總結了Java中的時間日期API知識點以及相關的實例代碼分享,有興趣的朋友參考學習下。
    2018-04-04
  • springBoot mybatis 包掃描實例

    springBoot mybatis 包掃描實例

    這篇文章主要介紹了springBoot mybatis 包掃描實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot2.6.3讀取不到nacos上的配置文件問題

    springboot2.6.3讀取不到nacos上的配置文件問題

    這篇文章主要介紹了springboot2.6.3讀取不到nacos上的配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • JavaIO字符操作和對象操作示例詳解

    JavaIO字符操作和對象操作示例詳解

    這篇文章主要為大家介紹了JavaIO字符操作和對象操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java實現(xiàn)畫圖 給圖片底部添加文字標題

    Java實現(xiàn)畫圖 給圖片底部添加文字標題

    這篇文章主要介紹了Java實現(xiàn)畫圖 給圖片底部添加文字標題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java反射機制Reflection詳解

    java反射機制Reflection詳解

    在本篇文章里小編給大家分享了關于java反射機制Reflection的相關知識點,需要的朋友們學習下。
    2019-04-04
  • Java9以后的垃圾回收的具體用法

    Java9以后的垃圾回收的具體用法

    這篇文章主要介紹了Java9以后的垃圾回收的具體用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10

最新評論