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

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

前言

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

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

本篇文章將結(jié)合不同的入?yún)?chǎng)景對(duì)#{}${}進(jìn)行分析。

正文

一. 入?yún)⑹腔绢?lèi)型并且參數(shù)個(gè)數(shù)為1

映射接口中查詢(xún)單條記錄的方法定義如下。

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

與之對(duì)應(yīng)的映射文件中的查詢(xún)標(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)⑹腔绢?lèi)型(示例中是String類(lèi)型)且參數(shù)個(gè)數(shù)只有一個(gè)時(shí),使用#{}${}占位符均不要求占位符指定的名稱(chēng)與映射接口中的參數(shù)名相等,但是#{}進(jìn)行占位符替換后參數(shù)會(huì)添加上''號(hào),而${}進(jìn)行占位符替換是直接進(jìn)行字符串替換,所以上述示例中,使用${}占位符時(shí)需要在占位符兩側(cè)添加''號(hào)。

二. 入?yún)⑹腔绢?lèi)型并且參數(shù)個(gè)數(shù)大于1

映射接口中查詢(xún)單條記錄的方法定義如下。

// 使用#{}作為參數(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)的映射文件中的查詢(xún)標(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)⑹腔绢?lèi)型且參數(shù)個(gè)數(shù)大于一個(gè)時(shí),此時(shí)需要在映射接口的方法中使用@Param注解定義參數(shù)的名稱(chēng),并且要求占位符指定的名稱(chēng)需要與@Param注解定義的名稱(chēng)相等,否則報(bào)錯(cuò)。

三. 入?yún)⑹亲远x類(lèi)型

映射接口中查詢(xún)單條記錄的方法定義如下。

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

其中自定義類(lèi)型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)的映射文件中的查詢(xún)標(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類(lèi)型時(shí),占位符指定的名稱(chēng)需要與自定義類(lèi)型中的字段名相同,否則報(bào)錯(cuò)。

四. 入?yún)⑹荕ap類(lèi)型

映射接口中查詢(xún)單條記錄的方法定義如下。

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

與之對(duì)應(yīng)的映射文件中的查詢(xún)標(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í),占位符指定的名稱(chēng)需要與Map的key相等,這樣才能將key對(duì)應(yīng)的value與占位符進(jìn)行替換

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

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

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

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

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

// 傳入表名實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建表
void createMyInfoTable(String tableName);
// 傳入表名動(dòng)態(tài)指定被查詢(xún)的表
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)⑹橇忻?/h4>

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

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

// 為數(shù)據(jù)庫(kù)表創(chuàng)建索引
// 表名,索引名,加索引的列的列名全部動(dòng)態(tài)指定
void createIndex(@Param("tableName") String tableName, 
                 @Param("indexName") String indexName, 
                 @Param("columnNames") List&lt;String&gt; columnNames);
// 對(duì)查詢(xún)結(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ù)庫(kù)表創(chuàng)建索引的示例中,表名,索引名和加索引的列的列名全部都需要使用${}作為參數(shù)占位符,否則會(huì)報(bào)錯(cuò)。在對(duì)查詢(xún)結(jié)果集進(jìn)行排序的示例中,如果列名占位符不使用${}而使用#{},不會(huì)報(bào)錯(cuò),但是無(wú)法實(shí)現(xiàn)根據(jù)指定列進(jìn)行排序的功能。

總結(jié)

下面對(duì)#{}${}這兩種占位符的使用進(jìn)行一個(gè)總結(jié)。

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

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

相關(guān)文章

  • Springboot整合Mybatis傳值的常用方式總結(jié)

    Springboot整合Mybatis傳值的常用方式總結(jié)

    今天給大家?guī)?lái)的是關(guān)于Springboot的相關(guān)知識(shí),文章圍繞著Springboot整合Mybatis傳值的常用方式展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java?-jar命令及SpringBoot通過(guò)java?-jav啟動(dòng)項(xiàng)目的過(guò)程

    java?-jar命令及SpringBoot通過(guò)java?-jav啟動(dòng)項(xiàng)目的過(guò)程

    本篇文章將為大家講述關(guān)于 SpringBoot 項(xiàng)目工程完成后,是如何通過(guò) java-jar 命令來(lái)啟動(dòng)的,以及介紹 java-jar 命令的詳細(xì)內(nèi)容,對(duì)SpringBoot java?-jav啟動(dòng)過(guò)程感興趣的朋友跟隨小編一起看看吧
    2023-05-05
  • Java字符拼接成字符串的注意點(diǎn)詳解

    Java字符拼接成字符串的注意點(diǎn)詳解

    這篇文章主要介紹了Java字符拼接成字符串的注意點(diǎn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Spring實(shí)現(xiàn)對(duì)象注入的三種方法詳解

    Spring實(shí)現(xiàn)對(duì)象注入的三種方法詳解

    這篇文章主要為大家學(xué)習(xí)介紹了Spring中實(shí)現(xiàn)對(duì)象注入的三種常用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-07-07
  • 詳解Spring Aop實(shí)例之AspectJ注解配置

    詳解Spring Aop實(shí)例之AspectJ注解配置

    本篇文章主要介紹了詳解Spring Aop實(shí)例之AspectJ注解配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Spring?Boot?使用?Hutool-jwt?實(shí)現(xiàn)?token?驗(yàn)證功能

    Spring?Boot?使用?Hutool-jwt?實(shí)現(xiàn)?token?驗(yàn)證功能

    JWT?就是一種網(wǎng)絡(luò)身份認(rèn)證和信息交換格式,這篇文章主要介紹了Spring Boot使用Hutool-jwt實(shí)現(xiàn)token驗(yàn)證,需要的朋友可以參考下
    2023-07-07
  • JDK  keytool證書(shū)工具功能代碼解析

    JDK keytool證書(shū)工具功能代碼解析

    這篇文章主要介紹了JDK keytool證書(shū)工具功能代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • IntelliJ?IDEA?2022.2最新版本激活教程(親測(cè)可用版)永久激活工具分享

    IntelliJ?IDEA?2022.2最新版本激活教程(親測(cè)可用版)永久激活工具分享

    Jetbrains官方發(fā)布了?IntelliJ?IDEA2022.2?正式版,每次大的版本更新,都會(huì)有較大的調(diào)整和優(yōu)化,除本次更新全面擁抱?Java?17?外,還有對(duì)IDE?UI界面,安全性,便捷性等都做了調(diào)整和優(yōu)化完善,用戶(hù)體驗(yàn)提升不少,相信后面會(huì)有不少小伙伴跟著更新
    2022-08-08
  • SpringBoot部署到外部Tomcat無(wú)法注冊(cè)到Nacos服務(wù)端的解決思路

    SpringBoot部署到外部Tomcat無(wú)法注冊(cè)到Nacos服務(wù)端的解決思路

    這篇文章主要介紹了SpringBoot部署到外部Tomcat無(wú)法注冊(cè)到Nacos服務(wù)端,本文給大家分享完美解決思路,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)

    Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)

    下面小編就為大家?guī)?lái)一篇Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾) 。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12

最新評(píng)論

江安县| 广河县| 前郭尔| 太原市| 南阳市| 拜城县| 来凤县| 收藏| 通化县| 雅安市| 乌什县| 福安市| 马鞍山市| 洪洞县| 白玉县| 湖北省| 祁门县| 玉龙| 喀什市| 那坡县| 洞口县| 德保县| 特克斯县| 西丰县| 石门县| 缙云县| 白水县| 香河县| 芷江| 宁南县| 东源县| 栾川县| 金湖县| 静乐县| 陵水| 蒙自县| 古浪县| 石狮市| 赣榆县| 满洲里市| 唐山市|