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

Mybatis中#{}與${}的區(qū)別詳解

 更新時間:2019年12月11日 10:24:16   作者:宜春  
這篇文章主要介紹了Mybatis中#{}與${}的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在開發(fā)中使用Mybatis經(jīng)常使用到#{}與${},依舊有很多開發(fā)者對二者的使用不是很清晰,正所謂好記性不如爛筆頭,特此總結(jié)一下。

在mybatis中動態(tài) sql 是其主要特性之一,在 mapper 中定義的參數(shù)傳到 xml 中之后,在執(zhí)行操作之前 mybatis 會對其進行動態(tài)解析。mybatis 提供了兩種支持動態(tài) sql 的語法:#{} 以及 $ { }, 其最大的區(qū)別則是前者方式能夠很大程度防止sql注入(安全),后者方式無法防止Sql注入 。什么??不懂什么是Sql注入?額。。。Sql注入指的是程序解析時會將你傳入的參數(shù)作為原來SQL語句的一部分,打亂原來SQL的結(jié)構(gòu),而通常我們只是需要傳入一個參數(shù)而已.

徹底理解SQL注入

什么?還不懂SQL注入,我湖了QAQ。。。那就來個最簡單的例子:一般開發(fā),肯定是在前臺有兩個輸入框,一個用戶名,一個密碼,會在后臺里,讀取前臺傳入的這兩個參數(shù),拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把這段SQL連接數(shù)據(jù)后,看這個用戶名/密碼是否存在,如果存在的話,就可以登陸成功了,如果不存在,就報一個登陸失敗的錯誤。對吧。 但是有這樣的情況,這段SQL是根據(jù)用戶輸入拼出來,如果用戶故意輸入可以讓后臺解析失敗的字符串,這就是SQL注入,例如,用戶在輸入密碼的時候,輸入 '''' ' or 1=1'', 這樣,后臺的程序在解析的時候,拼成的SQL語句,可能是這樣的: select count(1) from tab where user=userinput and pass='' or 1=1; 看這條語句,可以知道,在解析之后,用戶沒有輸入密碼,加了一個恒等的條件 1=1,這樣,這段SQL執(zhí)行的時候,返回的 count值肯定大于1的,如果程序的邏輯沒加過多的判斷,這樣就能夠使用用戶名 userinput登陸,而不需要密碼。 防止SQL注入,首先要對密碼輸入中的單引號進行過濾,再在后面加其它的邏輯判斷,或者不用這樣的動態(tài)SQL拼

關(guān)于 # { }

1、#{}表示一個占位符號 相當于 jdbc 中的 ? 符號 #{}實現(xiàn)的是向prepareStatement中的預(yù)處理語句中設(shè)置參數(shù)值,sql語句中#{}表示一個占位符即?

2、#{}將傳入的數(shù)據(jù)都當成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。如: select * from user where id= #{user_id} ,如果傳入的值是11,那么解析成sql時的值為 where id="11"

3、如果sql語句中只有 一個參數(shù) ,此時參數(shù)名稱可以 隨意定義 如果sql語句有 個參數(shù),此時參數(shù)名稱應(yīng)該是與當前表關(guān)聯(lián)[實體類的屬性名]或則[Map集合關(guān)鍵字], 不能隨便寫,必須對應(yīng) !如下圖

 

關(guān)于$ { }

1、 {user_id} ,如果傳入的值是11,那么解析成sql時的值為 where id=11`

2、 $ {value}value 值有限制只能寫對應(yīng)的value值不能隨便寫,因為 ${} 不會自動進行jdbc類型轉(zhuǎn)換

3、簡單來說,在 JDBC 不支持使用占位符的地方,都可以使用 ${}

Mybatis中#{}與${}的區(qū)別

簡單來說區(qū)別就是

#{}方式能夠很大程度防止sql注入(安全),${}方式無法防止Sql注入

JDBC 能使用占位符的地方,最好優(yōu)先使用 #{}

JDBC 不支持使用占位符的地方,就只能使用 ${} ,典型情況就是 動態(tài)參數(shù)

比如 有兩張表,分別是 emp_2017emp_2018 .如果需要在查詢語句中 動態(tài)指定表名 ,就只能使用${}

<select>
  select * from emp_ ${year}
<select>

再比如MyBatis 排序時使用 order by 動態(tài)參數(shù) 時,此時也只能使用${}

<select>
  select * from dept order by ${name}
</select>

代碼案例

一般# {}與$ {}用的比較多的地方是模糊查詢方面,所以下面來一個模糊查詢的案例

使用#{}案例

1、映射文件

在User.xml配置文件中添加如下內(nèi)容:

<!-- 如果返回多個結(jié)果,mybatis會自動把返回的結(jié)果放在list容器中 -->
	<!-- resultType的配置和返回一個結(jié)果的配置一樣 -->
	<select id="queryUserByUsername1" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE #{username}
	</select>

2、測試程序

MybatisTest中添加測試方法如下:

@Test
	public void testQueryUserByUsername1() throws Exception {
		// 4. 創(chuàng)建SqlSession對象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 5. 執(zhí)行SqlSession對象執(zhí)行查詢,獲取結(jié)果User
		// 查詢多條數(shù)據(jù)使用selectList方法
		List<Object> list = sqlSession.selectList("queryUserByUsername1", "%王%");

		// 6. 打印結(jié)果
		for (Object user : list) {
			System.out.println(user);
		}

		// 7. 釋放資源
		sqlSession.close();
	}

測試效果如下圖:

 

使用$ {}案例

1、映射文件:

在User.xml配置文件中添加如下內(nèi)容:

<!-- 如果傳入的參數(shù)是簡單數(shù)據(jù)類型,${}里面必須寫value -->
	<select id="queryUserByUsername2" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE '%${value}%'
	</select>

2.測試程序:MybatisTest中添加測試方法如下:

@Test
public void testQueryUserByUsername2() throws Exception {
	// 4. 創(chuàng)建SqlSession對象
	SqlSession sqlSession = sqlSessionFactory.openSession();

	// 5. 執(zhí)行SqlSession對象執(zhí)行查詢,獲取結(jié)果User
	// 查詢多條數(shù)據(jù)使用selectList方法
	List<Object> list = sqlSession.selectList("queryUserByUsername2", "王");

	// 6. 打印結(jié)果
	for (Object user : list) {
		System.out.println(user);
	}

	// 7. 釋放資源
	sqlSession.close();
}

當然兩個案例效果一致!

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 通過實例解析Java分布式鎖三種實現(xiàn)方法

    通過實例解析Java分布式鎖三種實現(xiàn)方法

    這篇文章主要介紹了通過實例解析Java分布式鎖三種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • JAVA JVM面試題總結(jié)

    JAVA JVM面試題總結(jié)

    JVM 可以屏蔽與具體操作系統(tǒng)平臺相關(guān)的信息,使 Java 程序只需生成在 Java 虛擬機上運行的目標代碼,就可以在不同的平臺上運行。這篇文章主要介紹了JAVA JVM面試題總結(jié),大家可以參考一下
    2021-08-08
  • Java中Maven的依賴管理問題小結(jié)

    Java中Maven的依賴管理問題小結(jié)

    這篇文章主要介紹了Java中Maven的依賴管理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-05-05
  • java中Class.forName的作用淺談

    java中Class.forName的作用淺談

    這篇文章介紹了java中Class.forName的作用,有需要的朋友可以參考一下
    2013-11-11
  • Java基于API接口爬取商品數(shù)據(jù)的示例代碼

    Java基于API接口爬取商品數(shù)據(jù)的示例代碼

    Java作為一種流行的編程語言,可以用于編寫程序來調(diào)用這些API接口,從而獲取商品數(shù)據(jù),本文將介紹如何使用Java基于API接口爬取商品數(shù)據(jù),包括請求API、解析JSON數(shù)據(jù)、存儲數(shù)據(jù)等步驟,并提供相應(yīng)的代碼示例,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Maven項目打包成可執(zhí)行Jar文件步驟解析

    Maven項目打包成可執(zhí)行Jar文件步驟解析

    這篇文章主要介紹了Maven項目如何打包成可執(zhí)行Jar文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • springboot配置mysql數(shù)據(jù)庫spring.datasource.url報錯的解決

    springboot配置mysql數(shù)據(jù)庫spring.datasource.url報錯的解決

    這篇文章主要介紹了springboot配置mysql數(shù)據(jù)庫spring.datasource.url報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo

    springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo

    這篇文章主要介紹了springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊列詳解

    Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊列詳解

    這篇文章主要介紹了Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊列詳解,棧(Stack) 是一種基本的數(shù)據(jù)結(jié)構(gòu),具有后進先出(LIFO)的特性,類似于現(xiàn)實生活中的一疊盤子,棧用于存儲一組元素,但只允許在棧頂進行插入(入棧)和刪除(出棧)操作,需要的朋友可以參考下
    2023-10-10
  • SpringBoot如何使用TestEntityManager進行JPA集成測試

    SpringBoot如何使用TestEntityManager進行JPA集成測試

    TestEntityManager是Spring Framework提供的一個測試框架,它可以幫助我們進行 JPA 集成測試,在本文中,我們將介紹如何使用 TestEntityManager 進行 JPA 集成測試,感興趣的跟著小編一起來學習吧
    2023-06-06

最新評論

蒙阴县| 黑河市| 梁山县| 凤凰县| 平陆县| 江华| 湘西| 金平| 光山县| 安吉县| 大方县| 合川市| 客服| 宁城县| 册亨县| 凭祥市| 凌源市| 竹溪县| 东阳市| 绥中县| 开远市| 莲花县| 虞城县| 定边县| 高青县| 磴口县| 平邑县| 昆山市| 抚宁县| 呼图壁县| 石林| 徐汇区| 湘乡市| 常州市| 辛集市| 信丰县| 甘孜| 罗城| 德阳市| 馆陶县| 长海县|