JDBC 詳解
一、概念
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 詳解