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

MySQL數(shù)據(jù)庫(kù)JDBC編程詳解流程

 更新時(shí)間:2022年01月20日 16:16:30   作者:dhdhdhdhg  
JDBC是指Java數(shù)據(jù)庫(kù)連接,是一種標(biāo)準(zhǔn)Java應(yīng)用編程接口(?JAVA?API),用來(lái)連接?Java?編程語(yǔ)言和廣泛的數(shù)據(jù)庫(kù)。從根本上來(lái)說(shuō),JDBC?是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問(wèn)到底層數(shù)據(jù)庫(kù),本篇文章我們來(lái)了解MySQL連接JDBC的流程方法

一、數(shù)據(jù)庫(kù)編程的必備條件

編程語(yǔ)言: 如Java、C++、C、Python等

數(shù)據(jù)庫(kù): 如Oracle、MySQL、SQL Server等

數(shù)據(jù)庫(kù)驅(qū)動(dòng)包: 不同的數(shù)據(jù)庫(kù),要使用編程語(yǔ)言來(lái)操作時(shí),就需要使用該數(shù)據(jù)庫(kù)廠商提供的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包。

如:MySQL提供了Java的驅(qū)動(dòng)包mysql-connector-java,需要基于java操作MySQL即需要該驅(qū)動(dòng)包。同樣的,要基于java操作Oracle數(shù)據(jù)庫(kù)則需要Oracle的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包ojdbc。

二、Java的數(shù)據(jù)庫(kù)編程:JDBC

JDBC,即Java Database Connectivity,java數(shù)據(jù)庫(kù)連接,是一種用于執(zhí)行SQL語(yǔ)句的Java API,它是Java中的數(shù)據(jù)庫(kù)連接規(guī)范。 這個(gè)API由java.sql. *, javax.sql. * 包中的一些類和接口組成,它為java開(kāi)發(fā)人員操作數(shù)據(jù)庫(kù)提供了一個(gè)標(biāo)準(zhǔn)的API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn)。

三、JDBC工作原理

JDBC為多種關(guān)系數(shù)據(jù)庫(kù)提供了統(tǒng)一訪問(wèn)方式。作為特定廠商數(shù)據(jù)庫(kù)訪問(wèn)API的一種高級(jí)抽象,它主要包含一些通用的接口類。

JDBC訪問(wèn)數(shù)據(jù)庫(kù)層次結(jié)構(gòu):

我們使用一套JDBC編碼,在切換數(shù)據(jù)庫(kù)之后,Java操作數(shù)據(jù)庫(kù)的代碼可以不動(dòng)(幾乎),數(shù)據(jù)庫(kù)驅(qū)動(dòng)包要調(diào)整,sql因?yàn)橛袠?biāo)準(zhǔn)sql的部分,還有數(shù)據(jù)庫(kù)相關(guān)的關(guān)鍵字,如mysql中的limit等,這些也需要調(diào)整。

JDBC優(yōu)勢(shì):

Java語(yǔ)言訪問(wèn)數(shù)據(jù)庫(kù)操作完全面向抽象接口編程

開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用不用限定在特定的數(shù)據(jù)庫(kù)廠商的API

為Java操作不同的數(shù)據(jù)庫(kù)提供一種統(tǒng)一的規(guī)范,程序在不同數(shù)據(jù)庫(kù)的可移植性大大增強(qiáng)

四、JDBC開(kāi)發(fā)步驟

1.創(chuàng)建一個(gè)普通的Java項(xiàng)目

2.下載mysql的驅(qū)動(dòng)包

下載驅(qū)動(dòng)包網(wǎng)址

我用的是5.1.xx版本的,說(shuō)明:不同版本的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包,里邊的類/接口可能不同

3.項(xiàng)目中添加數(shù)據(jù)庫(kù)驅(qū)動(dòng)包(依賴)

驗(yàn)證:寫(xiě)Java代碼,可以使用mysql驅(qū)動(dòng)包中的類/接口,才表示引入的依賴沒(méi)有問(wèn)題。

4.測(cè)試:連接數(shù)據(jù)庫(kù)

注意:

1.一開(kāi)始我們寫(xiě)入forName時(shí)會(huì)飄紅,這里先不用管,直接拋出異常。 alt+enter出現(xiàn)以下的界面,點(diǎn)擊第一個(gè):

2.獲取數(shù)據(jù)庫(kù)連接:Connection接口,需要使用jdbc中的,不要使用mysql中的

3.MySQL數(shù)據(jù)連接的URL參數(shù)格式如下:

jdbc:mysql://服務(wù)器地址:端口/數(shù)據(jù)庫(kù)名?參數(shù)名=參數(shù)值

//加載JDBC驅(qū)動(dòng)程序:反射的方式,這樣調(diào)用初始化com.mysql.jdbc.Driver類,
//即將該類加載到JVM方法區(qū),并執(zhí)行該類的靜態(tài)方法塊,靜態(tài)屬性
//數(shù)據(jù)庫(kù)驅(qū)動(dòng)包就可以在這種操作下,執(zhí)行對(duì)應(yīng)的初始化工作(驅(qū)動(dòng))
Class.forName("com.mysql.jdbc.Driver");
//獲取數(shù)據(jù)庫(kù)連接:Connection接口,需要使用jdbc中的,不要使用mysql中的
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/kang?" +
                "user=root&password=010124&useUnicode=true&characterEncoding=UTF-8&useSSL=false");

五、JDBC操作步驟

1.獲取數(shù)據(jù)庫(kù)連接對(duì)象

Connection(jdbc中的接口)

2.使用數(shù)據(jù)庫(kù)連接對(duì)象來(lái)創(chuàng)建一個(gè)操作命令對(duì)象Statement,該對(duì)象是進(jìn)行sql操作的抽象出來(lái)的對(duì)象

//通過(guò)連接對(duì)象創(chuàng)建操作命令對(duì)象Statement(使用jdbc中的),該對(duì)象是用于操作sql的一個(gè)抽象的對(duì)象
Statement s=conn.createStatement();

3.調(diào)用操作命令對(duì)象的方法來(lái)執(zhí)行sql 查詢:executeQuery 更新操作(插入、修改、刪除):executeUpdate,返回值int,表示執(zhí)行成功了幾條

//更新操作:調(diào)用executeUpdate方法,插入,修改,刪除都是
int n=s.executeUpdate("update exam_result set math=60 where id=1");
System.out.println("修改成功的數(shù)量:"+n);

4.如果是查詢操作,需要處理結(jié)果集對(duì)象 查詢,返回ResultSet結(jié)果集對(duì)象,這個(gè)結(jié)果集對(duì)象類似于數(shù)據(jù)結(jié)構(gòu)中List<Map<String,Object>>

//查詢:
//(1)調(diào)用Statement操作命令對(duì)象的executeQuery(sql)
//(2)返回一個(gè)ResultSet結(jié)果集對(duì)象(查詢sql執(zhí)行的結(jié)果集)
ResultSet r=s.executeQuery("select id,name,chinese,math,english from exam_result where id>3");
//處理結(jié)果:結(jié)果集可能是多行數(shù)據(jù),需要遍歷來(lái)獲取
//調(diào)用next就移動(dòng)到下一行,返回true代表改行有數(shù)據(jù),返回false代表該行沒(méi)有數(shù)據(jù)
while(r.next()){//一直遍歷到最后
    //進(jìn)入循環(huán),代表操作遍歷的一行數(shù)據(jù)
    int id=r.getInt("id");
    String name=r.getString("name");
    int chinese=r.getInt("chinese");
    int math=r.getInt("math");
    int english=r.getInt("english");
    System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s\n"
    ,id,name,chinese,math,english);
        }

運(yùn)行結(jié)果:

注解:

5.釋放資源 無(wú)論jdbc操作成功,還是出現(xiàn)異常,都需要釋放資源,要考慮出現(xiàn)異常對(duì)象還沒(méi)有完成初始化,還是null的情況,需要反向釋放資源。

public class JDBC {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection conn =null;
        Statement s=null;
        ResultSet r=null;
        try{
            //之前寫(xiě)過(guò)的所有程序放到try里邊
        }finally{//無(wú)論如何,都要釋放資源
            //釋放資源:
            //(1)無(wú)論什么情況(異常)
            //(2)釋放的順序,和創(chuàng)建的順序要相反
            //(結(jié)果集對(duì)象,操作命令對(duì)象,數(shù)據(jù)庫(kù)連接對(duì)象)
            if(r!=null){
                r.close();
            }
            if(s!=null){
                s.close();
            }
            if(conn!=null){
                conn.close();
            }
        }
    }
}

六、優(yōu)化JDBC的部分代碼

1.獲取數(shù)據(jù)庫(kù)連接對(duì)象

Connection接口實(shí)現(xiàn)類由數(shù)據(jù)庫(kù)提供,獲取Connection對(duì)象通常有兩種方式:

1.一種是通過(guò)DriverManager(驅(qū)動(dòng)管理類)的靜態(tài)方法獲取 也就是上面我們提到的方法。

2.一種是通過(guò)DataSourse(數(shù)據(jù)源/數(shù)據(jù)庫(kù)連接池)對(duì)象獲取。實(shí)際應(yīng)用中會(huì)使用DataSourse對(duì)象。

//先創(chuàng)建數(shù)據(jù)庫(kù)連接池,再通過(guò)連接池獲取數(shù)據(jù)庫(kù)連接對(duì)象
DataSource ds=new MysqlDataSource();
//創(chuàng)建數(shù)據(jù)庫(kù)連接池:初始化時(shí),就會(huì)創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接,這些連接對(duì)象可以重復(fù)使用,效率更高
//整個(gè)url帶參數(shù)可以只使用setURL方法,也可以用參數(shù)調(diào)用方法的方式來(lái)設(shè)置
((MysqlDataSource)ds).setURL("jdbc:mysql://localhost:3306/kang");
((MysqlDataSource)ds).setUser("root");
((MysqlDataSource)ds).setPassword("010124");
((MysqlDataSource)ds).setUseUnicode(true);
((MysqlDataSource)ds).setCharacterEncoding("UTF-8");
((MysqlDataSource)ds).setUseSSL(false);
conn = ds.getConnection();
System.out.println(conn);

兩者區(qū)別:

1.DriverManager類來(lái)獲取的Connection連接,是無(wú)法重復(fù)利用的,每次使用完以后釋放資源時(shí),通過(guò)Connection.close()都是關(guān)閉物理連接

2.DataSourse提供連接池的支持。連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接,這些鏈接是可以復(fù)用的,每次使用完數(shù)據(jù)庫(kù)連接,釋放資源調(diào)用connection.close()都是將Connection連接對(duì)象回收。效率更高。

2.操作命令對(duì)象Statement

Statement對(duì)象主要是將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中,JDBC API中主要提供了三種Statement對(duì)象。

Statement: 用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語(yǔ)句(簡(jiǎn)單的操作命令對(duì)象)

PreParedStatement:(預(yù)編譯的操作命令對(duì)象)

用于執(zhí)行帶或者不帶參數(shù)的SQL語(yǔ)句

SQL語(yǔ)句會(huì)預(yù)編譯在數(shù)據(jù)庫(kù)系統(tǒng)

執(zhí)行速度快于Statement對(duì)象

CallableStatement: 用于執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的調(diào)用(存儲(chǔ)過(guò)程的操作命令對(duì)象) 存儲(chǔ)過(guò)程:就是寫(xiě)一段sql代碼,里邊可以寫(xiě)變量,循環(huán),條件判斷等等。

查詢操作:

s = conn.createStatement();
//查詢:模擬在頁(yè)面上,輸入學(xué)生姓名來(lái)搜索學(xué)生
//(1)調(diào)用Statement操作命令對(duì)象的executeQuery(sql)
//(2)返回一個(gè)ResultSet結(jié)果集對(duì)象(查詢sql執(zhí)行的結(jié)果集)
String queryName="孫權(quán)";//能正常查詢的輸入
//(1)調(diào)用Statement操作命令對(duì)象的executeQuery(sql)
//(2)返回一個(gè)ResultSet結(jié)果集對(duì)象(查詢sql執(zhí)行的結(jié)果集)
String sql="select id,name,chinese,math,english from exam_result where name='"+queryName+"'";
System.out.println(sql);
r = s.executeQuery(sql);
while (r.next()) {//一直遍歷到最后
    //進(jìn)入循環(huán),代表操作遍歷的一行數(shù)據(jù)
    int id = r.getInt("id");
    String name = r.getString("name");
    int chinese = r.getInt("chinese");
    int math = r.getInt("math");
    int english = r.getInt("english");
    System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s\n", id, name, chinese, math, english);
    }

輸出結(jié)果:

但是這里有一個(gè)現(xiàn)象: 如果我們把這里的queryName改為“skdj’ or ‘1’='1”,在拼接sql字符串時(shí),就可能出現(xiàn)安全問(wèn)題。 輸出結(jié)果為:

后面的‘1’=‘1’是一個(gè)恒為真的條件,所以就會(huì)造成整個(gè)or條件結(jié)果為真,輸出所有成員。 要解決以上安全問(wèn)題,需要調(diào)整以上操作命令對(duì)象那個(gè)為PreparedStatement,并且使用占位符。

//要解決以上安全問(wèn)題,需要調(diào)整以上操作命令對(duì)象那個(gè)為PreparedStatement
String queryName="skeij' or '1'='1";
int queryId=6;
//準(zhǔn)備一個(gè)帶?占位符的sql
String sql="select id,name,chinese,math,english from exam_result where name=? or id=?";
ps=conn.prepareStatement(sql);//創(chuàng)建預(yù)編譯的操作命令對(duì)象
//替換占位符:調(diào)用setXXX方法,第一個(gè)參數(shù),表示第幾個(gè)占位符(從1開(kāi)始),第二個(gè)參數(shù),表示要替換的值
ps.setString(1,queryName);//替換的值是什么類型,就調(diào)用setXXX方法
ps.setInt(2,queryId);

//執(zhí)行sql,需要使用無(wú)參的方法
r=ps.executeQuery();

輸出結(jié)果為:

插入操作:

int queryId=7;
String queryName="圖圖";
int chinese=60;
int math=98;
int english=79;
String sql="insert into exam_result values(?,?,?,?,?)";
ps=conn.prepareStatement(sql);
ps.setInt(1,queryId);
ps.setString(2,queryName);
ps.setInt(3,chinese);
ps.setInt(4,math);
ps.setInt(5,english);

//executeUpdate()方法返回值是一個(gè)整數(shù),指示受影響的行數(shù),通常用于update,insert,delete語(yǔ)句。
int ret=ps.executeUpdate();
System.out.println(ret);

其余的刪除,更新操作都與上面類似,這里不再過(guò)多演示。

3.ResultSet對(duì)象

ResultSet對(duì)象它被成為結(jié)果集,他代表符合SQL語(yǔ)句條件的所有行,并且它通過(guò)一套getXXX方法提供了對(duì)這些行中數(shù)據(jù)的訪問(wèn)。 ResultSet里的數(shù)據(jù)一行一行排列,每行有多個(gè)字段,并且有一個(gè)記錄指針,指針?biāo)傅臄?shù)據(jù)叫做當(dāng)前數(shù)據(jù)行,我們只能來(lái)操作當(dāng)前的數(shù)據(jù)行。如果想要取得某一條記錄,就要使用ResultSet的next()方法,如果我們想要得到ResultSet里的所有記錄,就應(yīng)該使用while循環(huán)。

//處理結(jié)果:結(jié)果集可能是多行數(shù)據(jù),需要遍歷來(lái)獲取
//調(diào)用next就移動(dòng)到下一行,返回true代表改行有數(shù)據(jù),返回false代表該行沒(méi)有數(shù)據(jù)
while (r.next()) {//一直遍歷到最后
    //進(jìn)入循環(huán),代表操作遍歷的一行數(shù)據(jù)
    int id = r.getInt("id");
    String name = r.getString("name");
    int chinese = r.getInt("chinese");
    int math = r.getInt("math");
    int english = r.getInt("english");
    System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s\n", id, name, chinese, math, english);
    }

4.總結(jié)

主要掌握兩種執(zhí)行SQL的方法:

1.executeQuery()方法執(zhí)行后返回單個(gè)結(jié)果集的,通常用于select語(yǔ)句。

2.executeUpdate()方法返回值是一個(gè)整數(shù),指示受影響的行數(shù),通常用于update、insert、delete語(yǔ)句。

PreparedStatement注意事項(xiàng):

1.參數(shù)化SQL查詢

2.占位符不能使用多值

3.占位符:?下標(biāo)從1開(kāi)始

4.阻止常見(jiàn)SQL注入攻擊

5.SQL預(yù)編譯

6.性能比Statement高

到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)JDBC編程詳解流程的文章就介紹到這了,更多相關(guān)MySQL JDBC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 細(xì)說(shuō)MySQL死鎖與日志二三事

    細(xì)說(shuō)MySQL死鎖與日志二三事

    這篇文章主要和大家一起聊一聊MySQL死鎖與日志二三事,實(shí)際業(yè)務(wù)當(dāng)中如何快速的定位線上MySQL問(wèn)題,修復(fù)異常?本文根據(jù)兩個(gè)實(shí)際case,分享下相關(guān)的經(jīng)驗(yàn)與方法,感興趣的小伙伴們可以參考一下
    2017-08-08
  • mysql 雙向同步的鍵值沖突問(wèn)題的解決方法分享

    mysql 雙向同步的鍵值沖突問(wèn)題的解決方法分享

    多主互備和主從復(fù)制有一些區(qū)別,因?yàn)槎嘀髦卸伎梢詫?duì)服務(wù)器有寫(xiě)權(quán)限,所以設(shè)計(jì)到自增長(zhǎng)重復(fù)問(wèn)題
    2011-09-09
  • 導(dǎo)致sql執(zhí)行速度慢的幾種情況盤(pán)點(diǎn)(生產(chǎn)環(huán)境踩過(guò)的坑)

    導(dǎo)致sql執(zhí)行速度慢的幾種情況盤(pán)點(diǎn)(生產(chǎn)環(huán)境踩過(guò)的坑)

    盤(pán)點(diǎn)分析MySQL執(zhí)行速度慢可以幫助我們進(jìn)行優(yōu)化MySQL數(shù)據(jù)庫(kù)的效率,這篇文章主要給大家盤(pán)點(diǎn)介紹了關(guān)于導(dǎo)致sql執(zhí)行速度慢的幾種情況,文中介紹的這些主要是生產(chǎn)環(huán)境踩過(guò)的坑,需要的朋友可以參考下
    2023-03-03
  • MySQL表列數(shù)和行大小限制示例詳解

    MySQL表列數(shù)和行大小限制示例詳解

    行是表中存儲(chǔ)數(shù)據(jù)的行,也稱為記錄,MySQL的行上限主要受限于兩個(gè)因素,表的大小和操作系統(tǒng)的限制,這篇文章主要給大家介紹了關(guān)于MySQL表列數(shù)和行大小限制的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • 淺析centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar

    淺析centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar

    這篇文章主要介紹了centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar的相關(guān)知識(shí),需要的朋友可以參考下
    2020-01-01
  • 自用mysql自帶命令實(shí)現(xiàn)數(shù)據(jù)庫(kù)備份還原的方法

    自用mysql自帶命令實(shí)現(xiàn)數(shù)據(jù)庫(kù)備份還原的方法

    本文章介紹了都是mysql常用的命令一些數(shù)據(jù)導(dǎo)入導(dǎo)出的命令了,只要我們撐握這些命令就可以方法快速的給我們的數(shù)據(jù)庫(kù)進(jìn)行備份還原了
    2012-04-04
  • MySQL性能優(yōu)化神器Explain的基本使用分析

    MySQL性能優(yōu)化神器Explain的基本使用分析

    這篇文章主要給大家介紹了關(guān)于MySQL性能優(yōu)化神器Explain的基本使用分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程

    在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程

    這篇文章主要介紹了在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程,子查詢的使用時(shí)MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-12-12
  • MySQL通透詳解架構(gòu)設(shè)計(jì)

    MySQL通透詳解架構(gòu)設(shè)計(jì)

    這篇文章主要介紹了MySQL架構(gòu)設(shè)計(jì)相關(guān)基礎(chǔ)與原則,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2022-02-02
  • MySQL如何實(shí)現(xiàn)跨庫(kù)join查詢

    MySQL如何實(shí)現(xiàn)跨庫(kù)join查詢

    這篇文章主要介紹了MySQL如何實(shí)現(xiàn)跨庫(kù)join查詢問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

泰安市| 奉节县| 文成县| 卫辉市| 安岳县| 荔波县| 灵台县| 嘉祥县| 塔河县| 衡阳市| 金湖县| 宜都市| 新余市| 讷河市| 大丰市| 鄯善县| 禹州市| 澎湖县| 广汉市| 南皮县| 梁河县| 政和县| 凯里市| 东丰县| 连州市| 朔州市| 新蔡县| 色达县| 晋州市| 肥东县| 梅州市| 安西县| 静乐县| 南陵县| 当阳市| 剑河县| 陇南市| 贡嘎县| 日喀则市| 辉南县| 新干县|