1. 程式人生 > >JDBC詳細說明+使用 JDBC詳解

JDBC詳細說明+使用 JDBC詳解

JDBC詳解

一、相關概念

1.什麼是JDBC

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

2.資料庫驅動

  我們安裝好資料庫之後,我們的應用程式也是不能直接使用資料庫的,必須要通過相應的資料庫驅動程式,通過驅動程式去和資料庫打交道。其實也就是資料庫廠商的JDBC介面實現,即對Connection等介面的實現類的jar檔案。

 

二、常用介面

1.Driver介面

  Driver介面由資料庫廠家提供,作為java開發人員,只需要使用Driver介面就可以了。在程式設計中要連線資料庫,必須先裝載特定廠商的資料庫驅動程式,不同的資料庫有不同的裝載方法。如:

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

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

2.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() :在此連結上回滾事務。

3.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語句執行。

4.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

 

三、使用JDBC的步驟

  載入JDBC驅動程式 → 建立資料庫連線Connection → 建立執行SQL的語句Statement → 處理執行結果ResultSet → 釋放資源

1.註冊驅動 (只做一次)

  方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推薦這種方式,不會對具體的驅動類產生依賴。
  方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。

2.建立連線

 Connection conn = DriverManager.getConnection(url, user, password); 

  URL用於標識資料庫的位置,通過URL地址告訴JDBC程式連線哪個資料庫,URL的寫法為:

  

  其他引數如:useUnicode=true&characterEncoding=utf8

3.建立執行SQL語句的statement

複製程式碼
1 //Statement  
2 String id = "5";
3 String sql = "delete from table where id=" +  id;
4 Statement st = conn.createStatement();  
5 st.executeQuery(sql);  
6 //存在sql注入的危險
7 //如果使用者傳入的id為“5 or 1=1”,那麼將刪除表中的所有記錄
複製程式碼

 

1  //PreparedStatement 有效的防止sql注入(SQL語句在程式執行前已經進行了預編譯,當執行時動態地把引數傳給PreprareStatement時,即使引數裡有敏感字元如 or '1=1'也資料庫會作為一個引數一個欄位的屬性值來處理而不會作為一個SQL指令)
2 String sql = “insert into user (name,pwd) values(?,?)”;  
3 PreparedStatement ps = conn.preparedStatement(sql);  
4 ps.setString(1, “col_value”);  //佔位符順序從1開始
5 ps.setString(2, “123456”); //也可以使用setObject
6 ps.executeQuery(); 

4.處理執行結果(ResultSet)

1 ResultSet rs = ps.executeQuery();  
2 While(rs.next()){  
3     rs.getString(“col_name”);  
4     rs.getInt(1);  
5     //…
6 }  

5.釋放資源

複製程式碼
 //資料庫連線(Connection)非常耗資源,儘量晚建立,儘量早的釋放
//都要加try catch 以防前面關閉出錯,後面的就不執行了
1 try { 2 if (rs != null) { 3 rs.close(); 4 } 5 } catch (SQLException e) { 6 e.printStackTrace(); 7 } finally { 8 try { 9 if (st != null) { 10 st.close(); 11 } 12 } catch (SQLException e) { 13 e.printStackTrace(); 14 } finally { 15 try { 16 if (conn != null) { 17 conn.close(); 18 } 19 } catch (SQLException e) { 20 e.printStackTrace(); 21 } 22 } 23 }
複製程式碼

 

四、事務(ACID特點、隔離級別、提交commit、回滾rollback

 

 

1.批處理Batch

  插入2萬條資料的測試

2.測試事務的基本概念和用法

  測試事務的基本概念和用法   控制檯輸出

五、時間處理(Date和Time以及Timestamp區別、隨機日期生成

java.util.Date

  • 子類:java.sql.Date
  • 子類:java.sql.Time
  • 子類:java.sql.Timestamp

 

  測試時間處理(java.sql.Date,Time,Timestamp)   測試時間處理(java.sql.Date,Time,Timestamp),取出指定時間段的資料

六、CLOB文字大物件操作

 

  測試CLOB 文字大物件的使用

七、BLOB二進位制大物件的使用

 

  測試BLOB二進位制大物件的使用

 八、總結(簡單封裝、資原始檔properties處理連線資訊

  db.properties   JDBCUtil工具類   測試使用JDBCUtil工具類來簡化JDBC開發

一、相關概念

1.什麼是JDBC

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

2.資料庫驅動

  我們安裝好資料庫之後,我們的應用程式也是不能直接使用資料庫的,必須要通過相應的資料庫驅動程式,通過驅動程式去和資料庫打交道。其實也就是資料庫廠商的JDBC介面實現,即對Connection等介面的實現類的jar檔案。

 

二、常用介面

1.Driver介面

  Driver介面由資料庫廠家提供,作為java開發人員,只需要使用Driver介面就可以了。在程式設計中要連線資料庫,必須先裝載特定廠商的資料庫驅動程式,不同的資料庫有不同的裝載方法。如:

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

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

2.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() :在此連結上回滾事務。

3.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語句執行。

4.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

 

三、使用JDBC的步驟

  載入JDBC驅動程式 → 建立資料庫連線Connection → 建立執行SQL的語句Statement → 處理執行結果ResultSet → 釋放資源

1.註冊驅動 (只做一次)

  方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推薦這種方式,不會對具體的驅動類產生依賴。
  方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。

2.建立連線

 Connection conn = DriverManager.getConnection(url, user, password); 

  URL用於標識資料庫的位置,通過URL地址告訴JDBC程式連線哪個資料庫,URL的寫法為:

  

  其他引數如:useUnicode=true&characterEncoding=utf8

3.建立執行SQL語句的statement

複製程式碼
1 //Statement  
2 String id = "5";
3 String sql = "delete from table where id=" +  id;
4 Statement st = conn.createStatement();  
5 st.executeQuery(sql);  
6 //存在sql注入的危險
7 //如果使用者傳入的id為“5 or 1=1”,那麼將刪除表中的所有記錄
複製程式碼

 

1  //PreparedStatement 有效的防止sql注入(SQL語句在程式執行前已經進行了預編譯,當執行時動態地把引數傳給PreprareStatement時,即使引數裡有敏感字元如 or '1=1'也資料庫會作為一個引數一個欄位的屬性值來處理而不會作為一個SQL指令)
2 String sql = “insert into user (name,pwd) values(?,?)”;  
3 PreparedStatement ps = conn.preparedStatement(sql);  
4 ps.setString(1, “col_value”);  //佔位符順序從1開始
5 ps.setString(2, “123456”); //也可以使用setObject
6 ps.executeQuery(); 

4.處理執行結果(ResultSet)

1 ResultSet rs = ps.executeQuery();  
2 While(rs.next()){  
3     rs.getString(“col_name”);  
4     rs.getInt(1);  
5     //…
6 }  

5.釋放資源

複製程式碼
 //資料庫連線(Connection)非常耗資源,儘量晚建立,儘量早的釋放
//都要加try catch 以防前面關閉出錯,後面的就不執行了
1 try { 2 if (rs != null) { 3 rs.close(); 4 } 5 } catch (SQLException e) { 6 e.printStackTrace(); 7 } finally { 8 try { 9 if (st != null) { 10 st.close(); 11 } 12 } catch (SQLException e) { 13 e.printStackTrace(); 14 } finally { 15 try { 16 if (conn != null) { 17 conn.close(); 18 } 19 } catch (SQLException e) { 20 e.printStackTrace(); 21 } 22 } 23 }
複製程式碼

 

四、事務(ACID特點、隔離級別、提交commit、回滾rollback

 

 

1.批處理Batch

  插入2萬條資料的測試

2.測試事務的基本概念和用法

  測試事務的基本概念和用法   控制檯輸出

五、時間處理(Date和Time以及Timestamp區別、隨機日期生成

java.util.Date

  • 子類:java.sql.Date
  • 子類:java.sql.Time
  • 子類:java.sql.Timestamp

 

  測試時間處理(java.sql.Date,Time,Timestamp)   測試時間處理(java.sql.Date,Time,Timestamp),取出指定時間段的資料

六、CLOB文字大物件操作

 

  測試CLOB 文字大物件的使用

七、BLOB二進位制大物件的使用

 

  測試BLOB二進位制大物件的使用

 八、總結(簡單封裝、資原始檔properties處理連線資訊

  db.properties   JDBCUtil工具類   測試使用JDBCUtil工具類來簡化JDBC開發