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

Java中PreparedStatement的用法解析

 更新時(shí)間:2023年09月11日 11:26:51   作者:silmeweed  
這篇文章主要介紹了Java中PreparedStatement的用法解析,在JDBC應(yīng)用中,PreparedStatement是一種比Statement更好的選擇,PreparedStatement可以通過(guò)使用參數(shù)化查詢(xún)來(lái)避免SQL注入攻擊,并且可以提高查詢(xún)性能,需要的朋友可以參考下

一、 簡(jiǎn)介:

JDBC的最基本的使用過(guò)程

  • 加載驅(qū)動(dòng)類(lèi):Class.forName()
  • 獲取數(shù)據(jù)庫(kù)連接:DriverManager.getConnection()
  • 創(chuàng)建SQL語(yǔ)句執(zhí)行句柄:Connection.createStatement()
  • 執(zhí)行SQL語(yǔ)句:Statement.executeUpdate()
  • 釋放數(shù)據(jù)庫(kù)連接資源:finally,Connection.close()

應(yīng)該始終以PreparedStatement代替Statement.也就是說(shuō),在任何時(shí)候都不要使用Statement.原因如下。

1. 代碼的可讀性和可維護(hù)性

??stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

2. 盡最大可能提高性能

整個(gè)DB中,只要預(yù)編譯的語(yǔ)句語(yǔ)法和緩存中匹配,而statement的語(yǔ)句中,即使是相同一操作,而由于每次操作的數(shù)據(jù)不同所以使整個(gè)語(yǔ)句相匹配的機(jī)會(huì)極小,幾乎不太可能匹配

二、PreparedStatement用法:

一個(gè)preparedstatement是從java.sql.connection對(duì)象和所提供的sql字符串得到的,sql字符串中包含問(wèn)號(hào)(?),這些問(wèn)號(hào)標(biāo)明變量的位置,然后提供變量的值,最后執(zhí)行語(yǔ)句,例如:

stringsql = "select * from people p where p.id = ? and p.name = ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,name);
resultset rs = ps.executequery();
 private static void preparedStatement() {
        // 總結(jié)一下JDBC的最基本的使用過(guò)程
        // 1、加載驅(qū)動(dòng)類(lèi):Class.forName()
        // 2、獲取數(shù)據(jù)庫(kù)連接:DriverManager.getConnection()
        // 3、創(chuàng)建SQL語(yǔ)句執(zhí)行句柄:Connection.createStatement()
        // 4、執(zhí)行SQL語(yǔ)句:Statement.executeUpdate()
        // 5、釋放數(shù)據(jù)庫(kù)連接資源:finally,Connection.close()
        // 定義數(shù)據(jù)庫(kù)連接對(duì)象
        // 引用JDBC相關(guān)的所有接口或者是抽象類(lèi)的時(shí)候,必須是引用java.sql包下的
        // java.sql包下的,才代表了java提供的JDBC接口,只是一套規(guī)范
        // 至于具體的實(shí)現(xiàn),則由數(shù)據(jù)庫(kù)驅(qū)動(dòng)來(lái)提供,切記不要引用諸如com.mysql.jdbc包的類(lèi)
        Connection conn=null;
        //定義SQL語(yǔ)句執(zhí)行句柄:PrepareStatement對(duì)象
        //PreparedStatement對(duì)象,其實(shí)就是底層會(huì)基于Connection數(shù)據(jù)庫(kù)連接
        //可以讓我們方便的針對(duì)數(shù)據(jù)庫(kù)中的表,執(zhí)行增刪改查的SQL語(yǔ)句
        //比如和insert update delete和select語(yǔ)句
        PreparedStatement ps=null;
        try {
            // 第一步,加載數(shù)據(jù)庫(kù)的驅(qū)動(dòng),我們都是面向java.sql包下的接口在編程,所以
            // 要想讓JDBC代碼能夠真正操作數(shù)據(jù)庫(kù),那么就必須第一步先加載進(jìn)來(lái)你要操作的數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類(lèi)
            // 使用Class.forName()方式來(lái)加載數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類(lèi)
            // Class.forName()是Java提供的一種基于反射的方式,直接根據(jù)類(lèi)的全限定名(包+類(lèi))
            // 從類(lèi)所在的磁盤(pán)文件(.class文件)中加載類(lèi)對(duì)應(yīng)的內(nèi)容,并創(chuàng)建對(duì)應(yīng)的Class對(duì)象
            Class.forName("com.mysql.jdbc.Driver");
            // 獲取數(shù)據(jù)庫(kù)的連接
            // 使用DriverManager.getConnection()方法獲取針對(duì)數(shù)據(jù)庫(kù)的連接
            // 需要給方法傳入三個(gè)參數(shù),包括url、user、password
            // 其中url就是有特定格式的數(shù)據(jù)庫(kù)連接串,包括“主協(xié)議:子協(xié)議://主機(jī)名:端口號(hào)//數(shù)據(jù)庫(kù)”
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/spark_project?characterEncoding=utf8",
                    "root",
                    "root"
            );
            // 基于數(shù)據(jù)庫(kù)連接Connection對(duì)象,創(chuàng)建SQL語(yǔ)句執(zhí)行句柄,Statement對(duì)象
            // prepareStatement對(duì)象,就是用來(lái)基于底層的Connection代表的數(shù)據(jù)庫(kù)連接
            // 允許我們通過(guò)java程序,通過(guò)prepareStatement對(duì)象,向MySQL數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句
            // 從而實(shí)現(xiàn)通過(guò)發(fā)送的SQL語(yǔ)句來(lái)執(zhí)行增刪改查等邏輯
            // 第一個(gè),SQL語(yǔ)句中,值所在的地方,都用問(wèn)好代表
            String sql = "insert into user(name,age) values(?,?)";
            ps = conn.prepareStatement(sql);
            // 第二個(gè),必須調(diào)用PreparedStatement的setX()系列方法,對(duì)指定的占位符設(shè)置實(shí)際的值
            ps.setString(1,"李四");
            ps.setInt(2,26);
            // Statement.executeUpdate()方法,就可以用來(lái)執(zhí)行insert、update、delete語(yǔ)句
            // 返回類(lèi)型是個(gè)int值,也就是SQL語(yǔ)句影響的行數(shù)
            // 第三個(gè),執(zhí)行SQL語(yǔ)句時(shí),直接使用executeUpdate()即可,不用傳入任何參數(shù)
            int rtn = ps.executeUpdate();
            System.out.println("SQL語(yǔ)句影響了【" + rtn + "】行。");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                // 最后一定要記得在finally代碼塊中,盡快在執(zhí)行完SQL語(yǔ)句之后,就釋放數(shù)據(jù)庫(kù)連接
                if (ps != null){
                    ps.close();
                }
                if (conn !=null){
                    conn.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

到此這篇關(guān)于Java中PreparedStatement的用法解析的文章就介紹到這了,更多相關(guān)PreparedStatement用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis中string和date的轉(zhuǎn)換方式

    mybatis中string和date的轉(zhuǎn)換方式

    這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java Thread多線(xiàn)程全面解析

    Java Thread多線(xiàn)程全面解析

    這篇文章主要介紹了Java Thread多線(xiàn)程全面解析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 從一道面試題看你對(duì)java的理解程度

    從一道面試題看你對(duì)java的理解程度

    這篇文章主要給大家介紹了關(guān)于如何從一道面試題看你對(duì)java的理解程度的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧
    2018-09-09
  • MyBatis多表聯(lián)查返回List僅一條數(shù)據(jù)?主鍵沖突BUG排查與解決方案

    MyBatis多表聯(lián)查返回List僅一條數(shù)據(jù)?主鍵沖突BUG排查與解決方案

    在項(xiàng)目開(kāi)發(fā)中,通過(guò)MyBatis實(shí)現(xiàn)“管理員-角色-權(quán)限”多表關(guān)聯(lián)查詢(xún)時(shí),遇到SQL執(zhí)行返回多條結(jié)果但MyBatis映射后List集合只顯示一條數(shù)據(jù)的BUG,最終定位到是主鍵字段命名沖突導(dǎo)致,通過(guò)為SQL中同名字段起別名并修正ResultMap配置,成功修復(fù)了BUG
    2026-04-04
  • 淺談Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景

    淺談Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景

    這篇文章主要介紹了Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot整合MyBatis和MyBatis-Plus請(qǐng)求后不打印sql日志的問(wèn)題解決

    SpringBoot整合MyBatis和MyBatis-Plus請(qǐng)求后不打印sql日志的問(wèn)題解決

    本文主要介紹了SpringBoot整合MyBatis和MyBatis-Plus請(qǐng)求后不打印sql日志的問(wèn)題解決文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法

    Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法

    這篇文章主要介紹了Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot 整合 JWT + Redis 實(shí)現(xiàn)登錄鑒權(quán)

    SpringBoot 整合 JWT + Redis 實(shí)現(xiàn)登錄鑒權(quán)

    本文主要介紹了SpringBoot 整合 JWT + Redis 實(shí)現(xiàn)登錄鑒權(quán),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    這篇文章主要介紹了Java Optional解決空指針異??偨Y(jié)(java 8 功能),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java開(kāi)發(fā)命名規(guī)范總結(jié)

    java開(kāi)發(fā)命名規(guī)范總結(jié)

    包名的書(shū)寫(xiě)規(guī)范 (Package)推薦使用公司或機(jī)構(gòu)的頂級(jí)域名為包名的前綴,目的是保證各公司/機(jī)構(gòu)內(nèi)所使用的包名的唯一性。包名全部為小寫(xiě)字母,且具有實(shí)際的區(qū)分意義
    2013-10-10

最新評(píng)論

基隆市| 海南省| 葫芦岛市| 休宁县| 吉木萨尔县| 高安市| 莱阳市| 南投县| 方城县| 定安县| 墨脱县| 南木林县| 桦南县| 莒南县| 万年县| 开封县| 青阳县| 罗定市| 鄱阳县| 合肥市| 蓝山县| 耒阳市| 颍上县| 昔阳县| 崇礼县| 沧州市| 牙克石市| 府谷县| 五家渠市| 车险| 通化市| 岳普湖县| 聂拉木县| 陆河县| 稷山县| 岚皋县| 宜黄县| 玛沁县| 凭祥市| 滦平县| 隆安县|