JDBC中Statement和Preparement的使用講解
Statement對象是用來執(zhí)行SQL語句的
PreparedStatement:預(yù)編譯的Statement對象,是Statement的子接口。
一.性能和代碼編寫的簡潔程度方面
它允許數(shù)據(jù)庫預(yù)編譯SQL語句(這些SQL語句通常有帶有參數(shù)),以后每次只需改變SQL命令的參數(shù),避免數(shù)據(jù)庫每次都需要編譯SQL語句,提高了性能。 e.g. 連接數(shù)據(jù)庫部分
//已定義好driver、url、user、passwd等 //加載驅(qū)動 Class.forName(driver); //獲得連接 Connection conn = DriverManager.getConnection(url, user, passwd);
Statement:
//用Connection創(chuàng)建一個Statement Statement stmt = conn.createStatement() { //100條SQL語句來插入100條記錄 for(int i = 0;i < 100;i++) { stmt.executeUpdate("insert into student values(" + "null, 'aaa" + i + "',90)"); } }
PreparedStatement:
//用Connection創(chuàng)建一個PreparedStatement PreparedStatement pstmt = conn,getPreparedStatement("insert into student_table values(null, ?, 90)") { //設(shè)置參數(shù),100次傳入?yún)?shù)而不是100次傳入SQL語句 for(int i = 0;i < 100;i++) { pstmt.setString(1, "姓名" + i); //執(zhí)行 pstmt.executeUpdate(); } }
通過運行以上的代碼可以發(fā)現(xiàn),PreparedStatement插入100條記錄所用的時間比Statement插入100條記錄所花費時間少。而且可以在代碼中可以看出,帶有參數(shù)的SQL語句,創(chuàng)建Statement對象需要對參數(shù)進行拼接,但是PreparedStatement會簡潔很多。
完整代碼移步GitHub:Statement&PrepareStatement
運行結(jié)果:
二.安全方面
又因為PreparedStatement不需要拼接,還可以防止SQL注入從而提高安全性
注:SQL注入是一種Cracker入侵方式,從SQL語句的漏洞入侵
比如一個登錄頁面,我們在獲取表單傳來的參數(shù),將其與數(shù)據(jù)庫中的數(shù)據(jù)進行比對,比對有該賬號密碼時則登錄成功:
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語句就變成了:
select * from users where username = ' ' or true or ' ' and desc = ' ';
結(jié)果為true被SQL當(dāng)成直接量那么直接會登錄成功
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有三個好處:
- 1. 預(yù)編譯,性能較好
- 2. 不用拼接,易編寫易讀懂
- 3. 防止SQL注入,提高安全性
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- JDBC使用Statement修改數(shù)據(jù)庫
- Java使用PreparedStatement接口及ResultSet結(jié)果集的方法示例
- Java使用Statement接口執(zhí)行SQL語句操作實例分析
- Java數(shù)據(jù)庫連接PreparedStatement的使用詳解
- 利用JDBC的PrepareStatement打印真實SQL的方法詳解
- MyBatis綁定錯誤提示BindingException:Invalid bound statement (not found)的解決方法
- PHP PDOStatement對象bindpram()、bindvalue()和bindcolumn之間的區(qū)別
- PDO預(yù)處理語句PDOStatement對象使用總結(jié)
- JDBC之PreparedStatement類中預(yù)編譯的綜合應(yīng)用解析
- You must SET PASSWORD before executing this statement的解決方法
相關(guān)文章
Java實現(xiàn)雪花算法的原理和實戰(zhàn)教程
這篇文章主要介紹了Java實現(xiàn)雪花算法的原理和實戰(zhàn)教程,本文通過語言表述和代碼的實現(xiàn)講解了該項算法,,需要的朋友可以參考下2021-06-06JDK-StringJoiner構(gòu)造及添加元素源碼分析
這篇文章主要為大家介紹了JDK-StringJoiner構(gòu)造及添加元素源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07java 序列化對象 serializable 讀寫數(shù)據(jù)的實例
java 序列化對象 serializable 讀寫數(shù)據(jù)的實例,需要的朋友可以參考一下2013-03-03解決restlet client報錯No response.Is the cer
這篇文章主要介紹了解決restlet client報錯No response.Is the certificate valid? Click here to check.問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot集成POI實現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解
Apache?POI?是用Java編寫的免費開源的跨平臺的?Java?API,Apache?POI提供API給Java程序?qū)icrosoft?Office格式檔案讀和寫的功能。本文主要介紹通過SpringBoot集成POI工具實現(xiàn)Excel的導(dǎo)入和導(dǎo)出功能,需要的可以參考一下2022-07-07