溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JDBC如何獲取連接

發(fā)布時(shí)間:2022-09-28 14:07:28 來(lái)源:億速云 閱讀:101 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“JDBC如何獲取連接”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“JDBC如何獲取連接”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

1. JDBC基本介紹

  • JDBC為訪問(wèn)不同的數(shù)據(jù)庫(kù)提供了統(tǒng)一的接口,為使用者屏蔽了細(xì)節(jié)問(wèn)題

  • Java程序員使用JDBC,可以連接任何提供了JDBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)系統(tǒng),完成對(duì)數(shù)據(jù)庫(kù)的各種操作。

  • JDBC基本原理圖

JDBC如何獲取連接

2. JDBC快速入門

2.1 JDBC程序編寫步驟

  • 注冊(cè)驅(qū)動(dòng)-加載Driver類

  • 獲取連接-得到Connection

  • 執(zhí)行增刪改查-發(fā)送SQL給MySQL執(zhí)行

  • 釋放資源-關(guān)閉相關(guān)連接

2.2 案例演示

2.2.1 前置工作,在數(shù)據(jù)庫(kù)中建立對(duì)應(yīng)表
CREATE TABLE `actor`(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL DEFAULT '',
sex CHAR(1) NOT NULL DEFAULT '女',
borndate DATETIME,
phone VARCHAR(12));
2.2.2 前置工作,導(dǎo)入MySQL數(shù)據(jù)庫(kù)的對(duì)應(yīng)jar包

在項(xiàng)目下新建一個(gè)文件夾如libs,將對(duì)應(yīng)jar包拷入,并將其加入library中

JDBC如何獲取連接

JDBC如何獲取連接

public static void main(String[] args) throws SQLException {
        //注冊(cè)驅(qū)動(dòng)
        Driver driver = new Driver();
        String url="jdbc:mysql://localhost:3306/zxy_db01";
        String user="root";
        String psd = "123";
        DriverManager.registerDriver(driver);
        //獲得連接
        Connection connection = DriverManager.getConnection(url,user,psd);
        //執(zhí)行SQL語(yǔ)句
        String sql = "insert into actor values(null, '劉德華', '男', '1970-11-11', '110')";
        //statement 用于執(zhí)行靜態(tài) SQL 語(yǔ)句并返回其生成的結(jié)果的對(duì)象
        Statement statement = (Statement) connection.createStatement();
        int rows = statement.executeUpdate(sql);
        System.out.println(rows > 0 ? "成功" : "失敗");
        //關(guān)閉資源
        statement.close();
        connection.close();
    }

然后我們?cè)偃ゲ樵償?shù)據(jù)庫(kù),就會(huì)發(fā)現(xiàn)已經(jīng)成功啦

JDBC如何獲取連接

3. 相關(guān)類的介紹

3.1 Statement

相信對(duì)于上面的代碼中你最好奇的就是Statement這個(gè)類,我們就來(lái)聊一聊這個(gè)。

基本介紹:

  1. 用于執(zhí)行靜態(tài)Sql語(yǔ)句并返回其生成結(jié)果

  2. 在連接建立后,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),執(zhí)行命名或是SQL語(yǔ)句,可以通過(guò)Statement(存在SQL注入問(wèn)題)PrepardStatement(預(yù)處理) CallableStatement(存儲(chǔ)過(guò)程)

  3. Statement對(duì)象執(zhí)行SQL語(yǔ)句,存在SQL注入風(fēng)險(xiǎn)

  4. SQL注入是利用某些系統(tǒng)沒有對(duì)用戶輸入對(duì)數(shù)據(jù)進(jìn)行充分對(duì)檢查,而在用戶輸入數(shù)據(jù)中注入非法對(duì)SQL語(yǔ)句段或命令,惡意攻擊數(shù)據(jù)庫(kù)

  5. 要防范SQL注入,只要用PreparedStatement(從Statement擴(kuò)展而來(lái)),取代Statement就可以了

其實(shí)歸根究底,這個(gè)類就是一個(gè)用來(lái)調(diào)用執(zhí)行SQL語(yǔ)句的類。

3.2 ResultSet[結(jié)果集]

這個(gè)是執(zhí)行查詢的SQL時(shí)返回的對(duì)象,如下面這段代碼

String sql = "select id, name , sex, borndate from actor";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) { // 讓光標(biāo)向后移動(dòng),如果沒有更多行,則返回 false
    int id = resultSet.getInt(1); //獲取該行的第 1 列 
    String name = resultSet.getString(2);//獲取該行的第 2 列 
    String sex = resultSet.getString(3); 
    Date date = resultSet.getDate(4); 
    System.out.println(id + "\t" + name + "\t" + sex + "\t" + date);
}

表示數(shù)據(jù)庫(kù)結(jié)果集的數(shù)據(jù)表,通常通過(guò)執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。

ResultSet對(duì)象保持一個(gè)光標(biāo)指向其當(dāng)前的數(shù)據(jù)行。 最初,光標(biāo)位于第一行之前。 next方法將光標(biāo)移動(dòng)到下一行,并且由于在ResultSet對(duì)象中沒有更多行時(shí)返回false ,因此可在while循環(huán)中使用循環(huán)來(lái)遍歷結(jié)果集。

3.3 PreparedStatement

這個(gè)類其實(shí)和上面介紹的Statement效果類似,相當(dāng)于Statement的改進(jìn)版,增加了預(yù)處理過(guò)程避免了sql注入現(xiàn)象(簡(jiǎn)單來(lái)講就是破獲你的數(shù)據(jù)庫(kù)中的信息),下面我們就來(lái)聊聊它

  1. PreparedStatement執(zhí)行的SQL語(yǔ)句中的參數(shù)用問(wèn)號(hào)(?)來(lái)表示,調(diào)用PreparedStatement對(duì)象額setXxx()方法來(lái)設(shè)置這些參數(shù),setXxx()方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是要設(shè)置的SQL語(yǔ)句中的參數(shù)的索引(從1開始),第二個(gè)是設(shè)置的SQL語(yǔ)句中的參數(shù)的值。

  2. 調(diào)用executeQuery(),返回ResultSet對(duì)象

  3. 調(diào)用 executeUpdate(),執(zhí)行增刪改等操作。

其優(yōu)點(diǎn)也是極其明顯的

  • 不再使用+拼接SQL語(yǔ)句,減少語(yǔ)法錯(cuò)誤

  • 有效的解決了SQL注入問(wèn)題

  • 大大減少了編譯次數(shù),效率提高

話不多說(shuō),我們直接上案例

String sql = "select name , pwd from admin where name =? and pwd = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "劉德華"); 
preparedStatement.setString(2, "123");
ResultSet resultSet = preparedStatement.executeQuery(sql);
if (resultSet.next()) { //如果查詢到一條記錄,則說(shuō)明該管理存在 
    System.out.println("恭喜, 登錄成功"); } 
else {
    System.out.println("對(duì)不起,登錄失敗"); 
     }

4. 關(guān)閉資源

在JDBC編碼過(guò)程中,我們創(chuàng)建了resultSet,statement,connection等資源,這些資源在使用完畢后一定要進(jìn)行關(guān)閉資源,關(guān)閉的過(guò)程中遵循從里到外的原則,因?yàn)樵谠鰟h改查中的操作中都要用到這樣的關(guān)閉操作

resultSet.close();
statement.close();
connection.close();

5. 獲取數(shù)據(jù)庫(kù)連接的五種方式

方式一

直接通過(guò)Driver類獲得連接

 public void way1() throws SQLException {
        Driver driver = new Driver();
        String url = "jdbc:mysql://localhost:3306/zxy_db01";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("psd","123");
        Connection connect = driver.connect(url, info);
        System.out.println(connect);
    }

方式二

通過(guò)反射的方式加載Driver類獲得連接

 public void way2() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class<?> clzz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clzz.newInstance();
        String url = "jdbc:mysql://localhost:3306/zxy_db01";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("psd","123");
        Connection connect = driver.connect(url, info);
        System.out.println(connect);
    }

方式三

使用DriverManager替換Driver獲得連接

 public void way3() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class<?> clzz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clzz.newInstance();
        String url="jdbc:mysql://localhost:3306/zxy_db01";
        String user="root";
        String psw = "123";
        DriverManager.registerDriver(driver);
        Connection connection = DriverManager.getConnection(url,user,password);
        System.out.println(connection);
    }

方式四

使用Class.forName自動(dòng)完成驅(qū)動(dòng)注冊(cè)獲得鏈接

public void way4() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/zxy_db01";
        String user="root";
        String psd = "123";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    }

方式五

借助配置文件獲得來(lái)獲得連接

JDBC如何獲取連接

user=root
psd=123
url=jdbc:mysql://localhost:3306/zxy_db01
driver=com.mysql.jdbc.Driver
 public void way5() throws SQLException, ClassNotFoundException, IOException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("psd");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, user, psd);
        System.out.println(connection);
    }

讀到這里,這篇“JDBC如何獲取連接”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI