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

Mybatis之#{}與${}的區(qū)別使用詳解

 更新時間:2020年06月15日 14:40:31   作者:Javxuan  
這篇文章主要介紹了Mybatis之#{}與${}的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.兩種取值方式的差異

mapper.xml映射文件

<select id="selectEmployeeByCondition2" resultMap="empResultMap" databaseId="mysql">
    select * from t_emp WHERE emp_id=${id} and emp_name=#{name}
  </select>

java查詢代碼 params 為 id=1 ,name=”小紅”

@Test
  public void testSelect() {
    InputStream resourceAsStream = ConfigTest.class.getResourceAsStream("../classes/mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmployeeMapper mapper2 = sqlSession.getMapper(EmployeeMapper.class);

    Employee employee2 = mapper2.selectEmployeeByCondition2(1,"xiaohong");
    System.out.println(employee2);
  }

結(jié)果

==>  Preparing: select * from t_emp WHERE emp_id=1 and emp_name=?
==> Parameters: xiaohong(String)
<==    Columns: emp_id, emp_name, emp_email, emp_tel, emp_dep, emp_status
<==        Row: 1, xiaohong , 123@qq.com, 123, 1, 0
<==      Total: 112345

1.1 #{}

從上述代碼可以看出 #{} 在原生jdbc語句中會用 ?占位符來表示。這樣做可以防止sql注入

1.2${}

從上述代碼可以看出 ${} 是直接把param 拼到原生sql上

2.什么時候該使用什么方式

從上述示例可以看出 #{} 與${}的作用都是取值,同時#{}還可以防止sql注入更安全。是否表示在以后代碼中就用#{}呢? 當(dāng)然不是這樣的,比如某電商系統(tǒng)的訂單表數(shù)據(jù)量太龐大,不得以分表來保存數(shù)據(jù)。該電商的工程師最后決定將該表按年月進行分表(t_order_201701,t_order_201702…)。這個時候我們該采用那個中方式進行查詢呢,如我要查詢17年6月份的全部訂單?
你可能想當(dāng)然的認為這個容易,只要把年月動態(tài)傳入到sql中就可以了如下:

<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
    select * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
  </select>123

結(jié)果

==>  Preparing: select * from from t_order_? WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Integer)12

很顯然該語句是執(zhí)行不了的,此時就要采用${}

<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
    select * from t_order_${createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
  </select>

拼裝的原生jdbcsql

==>  Preparing: select * from from t_order_201706 WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Long)12

很顯然這條sql可以執(zhí)行。

3.總結(jié)

動態(tài) sql 是 mybatis 的主要特性之一,在 mapper 中定義的參數(shù)傳到 xml 中之后,在查詢之前 mybatis 會對其進行動態(tài)解析。mybatis 為我們提供了兩種支持動態(tài) sql 的語法:#{} 以及 ${} 。

1、#相當(dāng)于對數(shù)據(jù) 加上 雙引號,$相當(dāng)于直接顯示數(shù)據(jù)。
2、#{} : 根據(jù)參數(shù)的類型進行處理,比如傳入String類型,則會為參數(shù)加上雙引號。#{} 傳參在進行SQL預(yù)編譯時,會把參數(shù)部分用一個占位符 ? 代替,這樣可以防止 SQL注入。
3、${} : 將參數(shù)取出不做任何處理,直接放入語句中,就是簡單的字符串替換,并且該參數(shù)會參加SQL的預(yù)編譯,需要手動過濾參數(shù)防止 SQL注入。
4、因此 mybatis 中優(yōu)先使用 #{};當(dāng)需要動態(tài)傳入 表名或列名時,再考慮使用 ${} , 比較特殊,他的應(yīng)用場景是需要動態(tài)傳入表名或列名時使用,mybatis 排序時使用orderby動態(tài)參數(shù)時需要注意,用$而不是#

到此這篇關(guān)于Mybatis之#{}與${}的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Mybatis #{}與${}內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的System.getProperty()詳解

    Java中的System.getProperty()詳解

    System.getProperty("XXX")方法用來讀取JVM中的系統(tǒng)屬性,那么java 虛擬機中的系統(tǒng)屬性使用在運行java程序的時候java -D配置,有兩種方式,一種是在命令行配置另一種是在IDE中配置,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2023-09-09
  • 深入理解Java中的HashMap的實現(xiàn)機制

    深入理解Java中的HashMap的實現(xiàn)機制

    這篇文章主要介紹了深入理解Java中的HashMap的實現(xiàn)機制,同時也有助于理解Java中對于哈希函數(shù)的相關(guān)處理方式,需要的朋友可以參考下
    2015-07-07
  • 使用jps命令查看Java進程的詳細指南

    使用jps命令查看Java進程的詳細指南

    jps是Java開發(fā)者和系統(tǒng)管理員的得力助手,它簡化了Java進程監(jiān)控的過程,使得快速檢查應(yīng)用運行狀態(tài)變得輕而易舉,在Java開發(fā)和運維場景中,jps是一個非常實用的命令行工具,本文介紹了如何有效地使用 jps命令來查看Java進程的詳細指南,需要的朋友可以參考下
    2024-10-10
  • Spring.Net控制反轉(zhuǎn)IoC入門使用

    Spring.Net控制反轉(zhuǎn)IoC入門使用

    這篇文章主要為大家詳細介紹了Spring.Net控制反轉(zhuǎn)IoC入門使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java對象拷貝詳解及實例

    java對象拷貝詳解及實例

    這篇文章主要介紹了java對象拷貝詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程)

    IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程)

    在工作當(dāng)中,我們有時需要創(chuàng)建一個全新的工程,而基于spring-mvc web的工程較為常見,這篇文章主要介紹了IntelliJ IDEA maven 構(gòu)建簡單springmvc項目(圖文教程),感興趣的小伙伴們可以參考一下
    2018-05-05
  • springmvc+shiro+maven 實現(xiàn)登錄認證與權(quán)限授權(quán)管理

    springmvc+shiro+maven 實現(xiàn)登錄認證與權(quán)限授權(quán)管理

    Shiro 是一個 Apache 下的一開源項目項目,旨在簡化身份驗證和授權(quán),下面通過實例代碼給大家分享springmvc+shiro+maven 實現(xiàn)登錄認證與權(quán)限授權(quán)管理,感興趣的朋友一起看看吧
    2017-09-09
  • Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊列

    Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊列

    這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊列,工作中遇到項目使用Disruptor做消息隊列,對你沒看錯,不是Kafka,也不是rabbitmq。Disruptor有個最大的優(yōu)點就是快,還有一點它是開源的哦,下面做個簡單的記錄
    2022-06-06
  • SpringMVC 攔截器的使用示例

    SpringMVC 攔截器的使用示例

    這篇文章主要介紹了SpringMVC 攔截器的使用示例,幫助大家更好的理解和學(xué)習(xí)使用SpringMVC,感興趣的朋友可以了解下
    2021-04-04
  • Java中的Kotlin?內(nèi)部類原理

    Java中的Kotlin?內(nèi)部類原理

    這篇文章主要介紹了Java中的Kotlin?內(nèi)部類原理,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06

最新評論

黑河市| 隆安县| 涿州市| 扶沟县| 宜兴市| 突泉县| 丽江市| 铁力市| 鹤山市| 南昌市| 明溪县| 湖北省| 南部县| 措勤县| 荔浦县| 河曲县| 天全县| 五指山市| 淮南市| 汉源县| 阆中市| 孝义市| 宣武区| 班戈县| 白山市| 东山县| 轮台县| 连城县| 元阳县| 济南市| 新竹县| 仁怀市| 嘉兴市| 剑阁县| 南陵县| 平顺县| 时尚| 全椒县| 汶上县| 洛扎县| 筠连县|