JDBC Api詳解

一.什麼是JDBC

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

二.數據庫驅動

  JDBC是對數據庫操做的接口抽象,而不一樣數據庫廠商的數據庫驅動程序則對應JDBC接口實現,經過抽象出JDBC接口,應用程序和實際的數據庫驅動即JDBC實現解耦。mysql

3、經常使用接口

1.Driver接口sql

  Driver接口由數據庫廠家提供,做爲java開發人員,只須要使用Driver接口就能夠了。在編程中要鏈接數據庫,必須先裝載特定廠商的數據庫驅動程序,不一樣的數據庫有不一樣的裝載方法。如:數據庫

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

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

2.Connection接口工具

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

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

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

  鏈接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

4、使用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 }
複製代碼
相關文章
相關標籤/搜索