JDBC中Statement和Preparement的使用講解
Statement對(duì)象是用來(lái)執(zhí)行SQL語(yǔ)句的
PreparedStatement:預(yù)編譯的Statement對(duì)象,是Statement的子接口。
一.性能和代碼編寫(xiě)的簡(jiǎn)潔程度方面
它允許數(shù)據(jù)庫(kù)預(yù)編譯SQL語(yǔ)句(這些SQL語(yǔ)句通常有帶有參數(shù)),以后每次只需改變SQL命令的參數(shù),避免數(shù)據(jù)庫(kù)每次都需要編譯SQL語(yǔ)句,提高了性能。 e.g. 連接數(shù)據(jù)庫(kù)部分
//已定義好driver、url、user、passwd等 //加載驅(qū)動(dòng) Class.forName(driver); //獲得連接 Connection conn = DriverManager.getConnection(url, user, passwd);
Statement:
//用Connection創(chuàng)建一個(gè)Statement
Statement stmt = conn.createStatement() {
//100條SQL語(yǔ)句來(lái)插入100條記錄
for(int i = 0;i < 100;i++) {
stmt.executeUpdate("insert into student values(" + "null, 'aaa" + i + "',90)");
}
}
PreparedStatement:
//用Connection創(chuàng)建一個(gè)PreparedStatement
PreparedStatement pstmt = conn,getPreparedStatement("insert into student_table values(null, ?, 90)") {
//設(shè)置參數(shù),100次傳入?yún)?shù)而不是100次傳入SQL語(yǔ)句
for(int i = 0;i < 100;i++) {
pstmt.setString(1, "姓名" + i);
//執(zhí)行
pstmt.executeUpdate();
}
}
通過(guò)運(yùn)行以上的代碼可以發(fā)現(xiàn),PreparedStatement插入100條記錄所用的時(shí)間比Statement插入100條記錄所花費(fèi)時(shí)間少。而且可以在代碼中可以看出,帶有參數(shù)的SQL語(yǔ)句,創(chuàng)建Statement對(duì)象需要對(duì)參數(shù)進(jìn)行拼接,但是PreparedStatement會(huì)簡(jiǎn)潔很多。
完整代碼移步GitHub:Statement&PrepareStatement
運(yùn)行結(jié)果:

二.安全方面
又因?yàn)镻reparedStatement不需要拼接,還可以防止SQL注入從而提高安全性
注:SQL注入是一種Cracker入侵方式,從SQL語(yǔ)句的漏洞入侵
比如一個(gè)登錄頁(yè)面,我們?cè)讷@取表單傳來(lái)的參數(shù),將其與數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行比對(duì),比對(duì)有該賬號(hào)密碼時(shí)則登錄成功:
Statement:
//傳入?yún)?shù)username和passwd是提交的信息 String sql = "select * from users " + "where username = ' " + username + " ' and password= ' " + passwd + " '; rs = stmt.executeQuery(sql);
如果在username框中輸入了:'or true or',那么,拼接后的SQL語(yǔ)句就變成了:
select * from users where username = ' ' or true or ' ' and desc = ' ';
結(jié)果為true被SQL當(dāng)成直接量那么直接會(huì)登錄成功
PreparedStatement:
//傳入?yún)?shù)username和passwd是提交的信息
PreparedStatement pstmt = conn.getPreparedStatement("select * from users where username = ? and password= ?");
pstmt.setString(1, username);
pstmt.setString(2, passwd);
從上述可以看出PreparedStatement相較于Statement有三個(gè)好處:
- 1. 預(yù)編譯,性能較好
- 2. 不用拼接,易編寫(xiě)易讀懂
- 3. 防止SQL注入,提高安全性
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- JDBC使用Statement修改數(shù)據(jù)庫(kù)
- Java使用PreparedStatement接口及ResultSet結(jié)果集的方法示例
- Java使用Statement接口執(zhí)行SQL語(yǔ)句操作實(shí)例分析
- Java數(shù)據(jù)庫(kù)連接PreparedStatement的使用詳解
- 利用JDBC的PrepareStatement打印真實(shí)SQL的方法詳解
- MyBatis綁定錯(cuò)誤提示BindingException:Invalid bound statement (not found)的解決方法
- PHP PDOStatement對(duì)象bindpram()、bindvalue()和bindcolumn之間的區(qū)別
- PDO預(yù)處理語(yǔ)句PDOStatement對(duì)象使用總結(jié)
- JDBC之PreparedStatement類(lèi)中預(yù)編譯的綜合應(yīng)用解析
- You must SET PASSWORD before executing this statement的解決方法
相關(guān)文章
Java對(duì)Map進(jìn)行按value排序的幾種常見(jiàn)方法
在日常開(kāi)發(fā)中,Map 是我們經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)之一,盡管 Map 是按鍵 (key) 存儲(chǔ)和檢索數(shù)據(jù)的,但有時(shí)我們需要根據(jù) value 進(jìn)行排序,這篇博客將詳細(xì)探討如何在 Java 中對(duì) Map 進(jìn)行按 value 排序的幾種常見(jiàn)方法,并分析它們的優(yōu)缺點(diǎn),需要的朋友可以參考下2025-03-03
Spring Boot 2.X優(yōu)雅的解決跨域問(wèn)題
這篇文章主要給大家介紹了關(guān)于Spring Boot 2.X如何優(yōu)雅的解決跨域問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot 2.X具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
淺談JSP與Servlet傳值及對(duì)比(總結(jié))
下面小編就為大家?guī)?lái)一篇淺談JSP與Servlet傳值及對(duì)比(總結(jié))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程
這篇文章主要為大家詳細(xì)介紹了win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程,感興趣的小伙伴們可以參考一下2016-06-06
Springboot框架實(shí)現(xiàn)自動(dòng)裝配詳解
在使用springboot時(shí),很多配置我們都沒(méi)有做,都是springboot在幫我們完成,這很大一部分歸功于springboot自動(dòng)裝配。本文將詳細(xì)為大家講解SpringBoot的自動(dòng)裝配原理,需要的可以參考一下2022-08-08
java為移動(dòng)端寫(xiě)接口開(kāi)發(fā)實(shí)例
本篇文章主要介紹了java如何為移動(dòng)端寫(xiě)接口,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Servlet Filter過(guò)濾器執(zhí)行順序
這篇文章主要介紹了Servlet Filter過(guò)濾器執(zhí)行順序的相關(guān)資料,幫助大家更好的理解為什么要用過(guò)濾器,感興趣的朋友可以了解下2020-12-12
一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)詳細(xì)教程
使用SSM(Spring、SpringMVC和Mybatis)已經(jīng)有段時(shí)間了,項(xiàng)目在技術(shù)上已經(jīng)沒(méi)有什么難點(diǎn)了,基于現(xiàn)有的技術(shù)就可以實(shí)現(xiàn)想要的功能,下面這篇文章主要給大家介紹了關(guān)于整合SSM框架:Spring MVC + Spring + MyBatis的相關(guān)資料,需要的朋友可以參考下。2017-07-07

