1. 程式人生 > >JDBC 詳解

JDBC 詳解

裝載 exec creates jar包 led 編譯 名稱 有一個 trace

一、概念

1.JDBC:

  JDBC(Java Data Base Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。

2.一般步驟:

A.載入JDBC驅動程序
B.定義連接URL
C.建立連接
D.創建Statement對象
E.執行查詢或更新
F.結果處理
G.關閉連接

3.常用接口:

#Driver接口

  Driver接口由數據庫廠家提供,作為java開發人員,只需要使用Driver接口就可以了。在編程中要連接數據庫,必須先裝載特定廠商的數據庫驅動程序,不同的數據庫有不同的裝載方法。如:

  裝載MySql驅動:Class.forName("com.mysql.jdbc.Driver");

  裝載Oracle驅動:Class.forName("oracle.jdbc.driver.OracleDriver");

#Connection接口

  Connection與特定數據庫的連接(會話),在連接上下文中執行sql語句並返回結果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定義的數據庫Connection連接上。

  連接MySql數據庫:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  連接Oracle數據庫:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

  連接SqlServer數據庫:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

  常用方法:

    • createStatement():創建向數據庫發送sql的statement對象。
    • prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
    • prepareCall(sql):創建執行存儲過程的callableStatement對象。
    • setAutoCommit(boolean autoCommit):設置事務是否自動提交。
    • commit() :在鏈接上提交事務。
    • rollback() :在此鏈接上回滾事務。

#Statement接口

  用於執行靜態SQL語句並返回它所生成結果的對象。

  三種Statement類:

    • Statement:由createStatement創建,用於發送簡單的SQL語句(不帶參數)。
    • PreparedStatement :繼承自Statement接口,由preparedStatement創建,用於發送含有一個或多個參數的SQL語句。PreparedStatement對象比Statement對象的效率更高,並且可以防止SQL註入,所以我們一般都使用PreparedStatement。
    • CallableStatement:繼承自PreparedStatement接口,由方法prepareCall創建,用於調用存儲過程。

  常用Statement方法:

    • execute(String sql):運行語句,返回是否有結果集
    • executeQuery(String sql):運行select語句,返回ResultSet結果集。
    • executeUpdate(String sql):運行insert/update/delete操作,返回更新的行數。
    • addBatch(String sql) :把多條sql語句放到一個批處理中。
    • executeBatch():向數據庫發送一批sql語句執行。

#ResultSet接口

  ResultSet提供檢索不同類型字段的方法,常用的有:

    • getString(int index)、getString(String columnName):獲得在數據庫裏是varchar、char等類型的數據對象。
    • getFloat(int index)、getFloat(String columnName):獲得在數據庫裏是Float類型的數據對象。
    • getDate(int index)、getDate(String columnName):獲得在數據庫裏是Date類型的數據。
    • getBoolean(int index)、getBoolean(String columnName):獲得在數據庫裏是Boolean類型的數據。
    • getObject(int index)、getObject(String columnName):獲取在數據庫裏任意類型的數據。

  ResultSet還提供了對結果集進行滾動的方法:

    • next():移動到下一行
    • Previous():移動到前一行
    • absolute(int row):移動到指定行
    • beforeFirst():移動resultSet的最前面。
    • afterLast() :移動到resultSet的最後面。

使用後依次關閉對象及連接:ResultSet → Statement → Connection(後開先關)

 1 /**
 2  * 如果你要使用我的代碼,在此之前請在mysql創建jdbc_test數據庫,並建立student表,兩個字段,name和age
 3  */
 4 public class JDBCTest {
 5     /**
 6      * 數據庫相關參數
 7      */
 8     //這是驅動名稱,此例子中我們加載的是mysql的驅動,在之前需要導入mysql的驅動jar包
 9     public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
10 
11     //連接數據庫的url,各個數據庫廠商不一樣,此處為mysql的;後面是創建的數據庫名稱
12     public static final String JDBC_URL = "jdbc:mysql://localhost:3306/jdbc_test";
13 
14     //連接數據庫所需賬戶名
15     public static final String JDBC_USERNAME = "root";
16 
17     //用戶名對應的密碼,我的mysql密碼是123456
18     public static final String JDBC_PASSWORD = "123456";
19 
20 
21     @Test
22     public void testUpdate() {
23         Connection connection = null;
24         PreparedStatement preparedStatement = null;
25 
26         try {
27             //第一步:加載Driver類,註冊數據庫驅動
28             Class.forName(JDBC_DRIVER);
29             //第二步:通過DriverManager,使用url,用戶名和密碼建立連接(Connection)
30             connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);
31             //第三步:通過Connection,使用sql語句打開Statement對象;
32             preparedStatement = connection.prepareStatement("UPDATE student SET age=20 WHERE name=?");
33             //傳入參數,之所以這樣是為了防止sql註入
34             preparedStatement.setString(1, "xiaoming");
35             //第四步:執行語句,將結果返回resultSet
36             int count = preparedStatement.executeUpdate();
37             //第五步:對結果進行處理
38             System.out.println(count);
39         } catch (ClassNotFoundException e) {
40             e.printStackTrace();
41         } catch (SQLException e) {
42             e.printStackTrace();
43         } finally {
44             //第六步:倒敘釋放資源resultSet-》preparedStatement-》connection
45 
46             try {
47                 if (preparedStatement != null && 
48                     !preparedStatement.isClosed()) {
49                     preparedStatement.close();
50                 }
51             } catch (SQLException e) {
52                 e.printStackTrace();
53             }
54 
55             try {
56                 if (connection != null && connection.isClosed()) {
57                     connection.close();
58                 }
59             } catch (SQLException e) {
60                 e.printStackTrace();
61             }
62         }
63     }
64 }

JDBC 詳解