首頁 > 軟體

一文帶你快速學會JDBC及獲取連線的五種方式

2022-09-28 14:00:19

快速學會JDBC及獲取連線的五種方式

1. JDBC基本介紹

  • JDBC為存取不同的資料庫提供了統一的介面,為使用者遮蔽了細節問題
  • Java程式設計師使用JDBC,可以連線任何提供了JDBC驅動程式的資料庫系統,完成對資料庫的各種操作。
  • JDBC基本原理圖

2. JDBC快速入門

2.1 JDBC程式編寫步驟

  • 註冊驅動-載入Driver類
  • 獲取連線-得到Connection
  • 執行增刪改查-傳送SQL給MySQL執行
  • 釋放資源-關閉相關連線

2.2 案例演示

2.2.1 前置工作,在資料庫中建立對應表

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 前置工作,匯入MySQL資料庫的對應jar包

在專案下新建一個資料夾如libs,將對應jar包拷入,並將其加入library中

public static void main(String[] args) throws SQLException {
        //註冊驅動
        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);
        //執行SQL語句
        String sql = "insert into actor values(null, '劉德華', '男', '1970-11-11', '110')";
        //statement 用於執行靜態 SQL 語句並返回其生成的結果的物件
        Statement statement = (Statement) connection.createStatement();
        int rows = statement.executeUpdate(sql);
        System.out.println(rows > 0 ? "成功" : "失敗");
        //關閉資源
        statement.close();
        connection.close();
    }

然後我們再去查詢資料庫,就會發現已經成功啦

3. 相關類的介紹

3.1 Statement

相信對於上面的程式碼中你最好奇的就是Statement這個類,我們就來聊一聊這個。

基本介紹:

  1. 用於執行靜態Sql語句並返回其生成結果
  2. 在連線建立後,需要對資料庫進行存取,執行命名或是SQL語句,可以通過Statement(存在SQL隱碼攻擊問題)PrepardStatement(預處理) CallableStatement(儲存過程)
  3. Statement物件執行SQL語句,存在SQL隱碼攻擊風險
  4. SQL隱碼攻擊是利用某些系統沒有對使用者輸入對資料進行充分對檢查,而在使用者輸入資料中注入非法對SQL語句段或命令,惡意攻擊資料庫
  5. 要防範SQL隱碼攻擊,只要用PreparedStatement(從Statement擴充套件而來),取代Statement就可以了

其實歸根究底,這個類就是一個用來呼叫執行SQL語句的類。

3.2 ResultSet[結果集]

這個是執行查詢的SQL時返回的物件,如下面這段程式碼

String sql = "select id, name , sex, borndate from actor";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) { // 讓遊標向後移動,如果沒有更多行,則返回 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);
}

表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句生成。

ResultSet物件保持一個遊標指向其當前的資料行。 最初,遊標位於第一行之前。 next方法將遊標移動到下一行,並且由於在ResultSet物件中沒有更多行時返回false ,因此可在while迴圈中使用迴圈來遍歷結果集。

3.3 PreparedStatement

這個類其實和上面介紹的Statement效果類似,相當於Statement的改進版,增加了預處理過程避免了sql注入現象(簡單來講就是破獲你的資料庫中的資訊),下面我們就來聊聊它

  1. PreparedStatement執行的SQL語句中的引數用問號(?)來表示,呼叫PreparedStatement物件額setXxx()方法來設定這些引數,setXxx()方法有兩個引數,第一個引數是要設定的SQL語句中的引數的索引(從1開始),第二個是設定的SQL語句中的引數的值。
  2. 呼叫executeQuery(),返回ResultSet物件
  3. 呼叫 executeUpdate(),執行增刪改等操作。

其優點也是極其明顯的

  • 不再使用+拼接SQL語句,減少語法錯誤
  • 有效的解決了SQL隱碼攻擊問題
  • 大大減少了編譯次數,效率提高

話不多說,我們直接上案例

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()) { //如果查詢到一條記錄,則說明該管理存在 
    System.out.println("恭喜, 登入成功"); } 
else {
    System.out.println("對不起,登入失敗"); 
     }

4. 關閉資源

在JDBC編碼過程中,我們建立了resultSet,statement,connection等資源,這些資源在使用完畢後一定要進行關閉資源,關閉的過程中遵循從裡到外的原則,因為在增刪改查中的操作中都要用到這樣的關閉操作

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

5. 獲取資料庫連線的五種方式

方式一

直接通過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);
    }

方式二

通過反射的方式載入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自動完成驅動註冊獲得連結

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);
    }

方式五

藉助組態檔獲得來獲得連線

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已經有了不錯的瞭解了

總結

到此這篇關於一文快速學會JDBC及獲取連線的五種方式的文章就介紹到這了,更多相關學會JDBC及獲取連線方式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com