欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDBC中Statement和Preparement的使用講解

 更新時(shí)間:2019年01月04日 09:12:23   作者:sdr_zd  
今天小編就為大家分享一篇關(guān)于JDBC中Statement和Preparement的使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

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)鏈接

相關(guān)文章

  • Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程

    Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程

    這篇文章主要介紹了Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程,本文通過(guò)語(yǔ)言表述和代碼的實(shí)現(xiàn)講解了該項(xiàng)算法,,需要的朋友可以參考下
    2021-06-06
  • JDK-StringJoiner構(gòu)造及添加元素源碼分析

    JDK-StringJoiner構(gòu)造及添加元素源碼分析

    這篇文章主要為大家介紹了JDK-StringJoiner構(gòu)造及添加元素源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java利用SPI實(shí)現(xiàn)解耦的示例詳解

    Java利用SPI實(shí)現(xiàn)解耦的示例詳解

    SPI的全稱(chēng)是服務(wù)提供接口,可以用其來(lái)啟動(dòng)框架的擴(kuò)展和替換組件。本文將利用SPI實(shí)現(xiàn)解耦,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-04-04
  • java 序列化對(duì)象 serializable 讀寫(xiě)數(shù)據(jù)的實(shí)例

    java 序列化對(duì)象 serializable 讀寫(xiě)數(shù)據(jù)的實(shí)例

    java 序列化對(duì)象 serializable 讀寫(xiě)數(shù)據(jù)的實(shí)例,需要的朋友可以參考一下
    2013-03-03
  • 解決restlet client報(bào)錯(cuò)No response.Is the certificate valid? Click here to check.

    解決restlet client報(bào)錯(cuò)No response.Is the cer

    這篇文章主要介紹了解決restlet client報(bào)錯(cuò)No response.Is the certificate valid? Click here to check.問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java  基礎(chǔ)知識(shí)之IO總結(jié)

    java 基礎(chǔ)知識(shí)之IO總結(jié)

    這篇文章主要介紹了java 基礎(chǔ)知識(shí)之IO總結(jié)的相關(guān)資料,Java中的I/O分為兩種類(lèi)型,一種是順序讀取,一種是隨機(jī)讀取,需要的朋友可以參考下
    2017-03-03
  • Mybatis優(yōu)化檢索的方法詳解

    Mybatis優(yōu)化檢索的方法詳解

    MyBatis是一款優(yōu)秀的基于Java的持久層框架,它可以將 SQL 語(yǔ)句和數(shù)據(jù)庫(kù)中的記錄映射成為 Java 對(duì)象,并且支持靈活的 SQL 查詢(xún)語(yǔ)句,在Mybatis中,可以使用動(dòng)態(tài)SQL來(lái)靈活構(gòu)造SQL語(yǔ)句,從而滿(mǎn)足各種不同的檢索需求,本文介紹Mybatis如何優(yōu)化檢索,需要的朋友可以參考下
    2024-05-05
  • Springboot整合Shiro的代碼實(shí)例

    Springboot整合Shiro的代碼實(shí)例

    這篇文章主要介紹了Springboot整合Shiro的代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    Apache?POI?是用Java編寫(xiě)的免費(fèi)開(kāi)源的跨平臺(tái)的?Java?API,Apache?POI提供API給Java程序?qū)icrosoft?Office格式檔案讀和寫(xiě)的功能。本文主要介紹通過(guò)SpringBoot集成POI工具實(shí)現(xiàn)Excel的導(dǎo)入和導(dǎo)出功能,需要的可以參考一下
    2022-07-07
  • springboot默認(rèn)的5種加載路徑詳解

    springboot默認(rèn)的5種加載路徑詳解

    這篇文章主要給大家介紹了關(guān)于springboot默認(rèn)的5種加載路徑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論