JDBC簡介
- Java數據庫連接(Java Database Connectivity,JDBC),是一種用於執行SQL語句的Java API,它由一組用Java編程語言編寫的類和接口組成。
- JDBC提供了一種基准,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
- 使用JDBC編寫的程序能夠自動地將SQL語句傳送給相應的數據庫管理系統。
- JDBC 是個"低級"接口,也就是說,它用於直接調用 SQL 命令。在這方面它的功能極佳,並比其它的數據庫連接 API 易於使用,但它同時也被設計為一種基礎接口,在它之上可以建立高級接口和工具。高級接口是"對用戶友好的"接口,它使用的是一種更易理解和更為方便的 API,這種API在幕后被轉換為諸如 JDBC 這樣的低級接口。
- JDBC擴展了Java的功能,由於Java語言本身的特點,使得JDBC具有簡單、健壯、安全、可移植、獲取方便等優勢。
JDBC中常用類和接口
接口/類 | 功能說明 |
---|---|
DriverManager | 數據庫驅動管理類,用於加載和卸載各種驅動程序,並建立於數據庫的連接 |
Connection | 此接口用於連接數據庫 |
Statement | 此接口用於執行SQL語句並將數據檢索到ResultSet中 |
ResultSet | 結果集接口,提供檢索SQL語句返回數據的各種方法 |
PreparedStatement | 此接口用於執行預編譯的SQL語句 |
CallableStatement | 此接口用於執行SQL存儲過程的語句 |
JDBC開發步驟
- 注冊驅動
- 建立連接
- 創建statement
- 執行sql,得到ResultSet
- 查看結果
- 釋放資源
開發第一個JDBC程序
源碼
1 package com.jyroy.test; 2 3 import java.sql.DriverManager; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import com.jyroy.util.JDBCUtil; 9 10 import java.sql.Connection; 11 import java.sql.Driver; 12 13 public class MainTest { 14 15 public static void main(String[] args) { 16 Connection connection = null; 17 Statement st = null; 18 ResultSet rs = null; 19 20 try { 21 //1.注冊驅動 22 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 23 24 //2.建立連接 25 //方法一 參數一:協議+訪問數據庫,參數二:用戶名,參數三:密碼 26 connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password"); 27 28 //方法二 29 // DriverManager.getConnection("jdbc:msql://localhost/student?user=root&password=password"); 30 31 //3.創建statement,跟數據庫打交道一定需要這個對象 32 st = connection.createStatement(); 33 34 //4.執行查詢 35 String sql = "select * from stu"; 36 rs = st.executeQuery(sql); 37 38 //5.遍歷查詢每一條記錄 39 while(rs.next()) { 40 int id = rs.getInt("id"); 41 String name = rs.getString("name"); 42 int age = rs.getInt("age"); 43 44 System.out.println("id = " + id + "; name = " + name + "; age = " + age); 45 } 46 //進行資源釋放 47 connection.close(); 48 st.close(); 49 rs.close(); 50 51 } catch (SQLException e) { 52 e.printStackTrace(); 53 } 54 } 55 } 56
結果
使用工具類
借助工具類來方便JDBC的操作
獲取數據庫連接
建立數據庫連接的類,里面封裝好實現數據庫連接的函數,方便調用實現數據庫連接
這里說兩個問題:
一:
這里多用了一個 Class.forName("com.mysql.jdbc.Driver"); 因為
在上面的例子中,Driver這個類里面有靜態代碼塊(java.sql.DriverManager.registerDriver(new Driver())),我們在new的時候一開始就加載了Driver類,相當於注冊了兩次驅動,為了避免這個情況,使用Class.forName("com.mysql.jdbc.Driver");來進行驅動的注冊。
二:
根據JDBC官方文檔,在JDBC5之后,Class.forName(); 的注冊驅動,官方已經幫我們實現了,我們不加載驅動(JDBC會自動識別使mysql還是oracl什么的,當然了,如果同時用了mysql和oracl就要寫上了,這個時候就沒法自動確定了),直接建立連接也是可以的,大家可以自己試一下把Class.forName();這句話注釋掉,也是可以完美運行的!
1 package com.jyroy.DBUtil; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 public class DBUtil { 8 9 private static Connection connection=null; 10 11 static { 12 try { 13 //1.加載驅動程序 14 Class.forName("com.mysql.jdbc.Driver"); 15 //2.獲得數據庫的連接 16 connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password"); 17 18 } catch (ClassNotFoundException e) { 19 e.printStackTrace(); 20 } catch (SQLException e) { 21 e.printStackTrace(); 22 } 23 } 24 //將獲得的數據庫與java的鏈接返回(返回的類型為Connection) 25 public static Connection getConnection(){ 26 return connection; 27 } 28 }
我們在MainTest中調用
1 connection = DBUtil.getConnection();
運行之后,同樣可以得到相同的查詢結果
進行資源釋放
上面的資源釋放,只是簡單的close掉了,更好的辦法釋放資源還是在finally語句塊中,因此重新編寫代碼,使用finally語句塊,我這里直接寫了一個工具類,讓代碼更清晰一點。
finally一般拿來做一些善后清理工作,當try塊里出現錯誤的話,會立即跳出try塊,找到匹配的錯誤,執行catch塊里的語句,此時,可能在try塊里打開的文件沒關閉,連接的網絡沒斷開,對這些浪費的內存就不能及時釋放回收,因此利用finally進行一些善后工作
1 package com.jyroy.util; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 public class JDBCUtil { 9 /* 10 釋放資源 11 */ 12 13 public static void release(Connection connection, Statement st, ResultSet rs) { 14 closeConn(connection); 15 closeRs(rs); 16 closeSt(st); 17 } 18 19 private static void closeRs(ResultSet rs) { 20 try { 21 if(rs!=null) { 22 rs.close(); 23 } 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 }finally { 27 rs = null; 28 } 29 } 30 31 private static void closeSt(Statement st) { 32 try { 33 if(st!=null) { 34 st.close(); 35 } 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 }finally { 39 st = null; 40 } 41 } 42 43 private static void closeConn(Connection connection) { 44 try { 45 if(connection!=null) { 46 connection.close(); 47 } 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 }finally { 51 connection = null; 52 } 53 } 54 55 }
在MainTest類中進行使用
1 JDBCUtil.release(connection, st, rs);
數據庫的增刪查改
查詢
1 package com.jyroy.test; 2 3 import java.sql.DriverManager; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import com.jyroy.DBUtil.DBUtil; 9 import com.jyroy.util.JDBCUtil; 10 11 import java.sql.Connection; 12 import java.sql.Driver; 13 14 public class MainTest { 15 16 public static void main(String[] args) { 17 18 Connection conn = null; 19 Statement st = null; 20 ResultSet rs = null; 21 22 try { 23 //1.獲取連接對象 24 conn = DBUtil.getConnection(); 25 26 //2.根據連接對象,得到statement 27 st = conn.createStatement(); 28 29 //3.執行查詢 30 String sql = "select * from stu"; 31 rs = st.executeQuery(sql); 32 33 //4.遍歷輸出結果 34 while(rs.next()) { 35 String name = rs.getString("name"); 36 int age = rs.getInt("age"); 37 38 System.out.println(name + " " + age); 39 } 40 41 } catch (SQLException e) { 42 // TODO 自動生成的 catch 塊 43 e.printStackTrace(); 44 }finally { 45 JDBCUtil.release(conn, st, rs); 46 } 47 } 48 }
插入
1 @Test 2 public void testInsert() { 3 Connection conn = null; 4 Statement st = null; 5 6 try { 7 //1.獲取連接對象 8 conn = DBUtil.getConnection(); 9 10 //2.根據連接對象,得到statement 11 st = conn.createStatement(); 12 13 //3.執行插入 14 String sql = "insert into stu values(null, 'xiaoming', 12)"; 15 16 int result = st.executeUpdate(sql); 17 18 //result表示影響的行數,大於0表示添加成功,否則失敗 19 if(result > 0) { 20 System.out.println("添加成功"); 21 } 22 else { 23 System.out.println("添加失敗"); 24 } 25 26 } catch (SQLException e) { 27 // TODO 自動生成的 catch 塊 28 e.printStackTrace(); 29 }finally { 30 JDBCUtil.release(conn, st); 31 } 32 }
刪除
1 @Test 2 public void testDelete() { 3 Connection conn = null; 4 Statement st = null; 5 6 try { 7 //1.獲取連接對象 8 conn = DBUtil.getConnection(); 9 10 //2.根據連接對象,得到statement 11 st = conn.createStatement(); 12 13 //3.執行刪除 14 String sql = "delete from stu where name = 'xiaoming'"; 15 16 int result = st.executeUpdate(sql); 17 18 //result表示影響的行數,大於0表示添加成功,否則失敗 19 if(result > 0) { 20 System.out.println("刪除成功"); 21 } 22 else { 23 System.out.println("刪除失敗"); 24 } 25 26 } catch (SQLException e) { 27 // TODO 自動生成的 catch 塊 28 e.printStackTrace(); 29 }finally { 30 JDBCUtil.release(conn, st); 31 } 32 }
更新
1 @Test 2 public void testUpdate() { 3 Connection conn = null; 4 Statement st = null; 5 6 try { 7 //1.獲取連接對象 8 conn = DBUtil.getConnection(); 9 10 //2.根據連接對象,得到statement 11 st = conn.createStatement(); 12 13 //3.執行更新 14 String sql = "update stu set age = 11 where name = 'zhangsan'"; 15 16 int result = st.executeUpdate(sql); 17 18 //result表示影響的行數,大於0表示添加成功,否則失敗 19 if(result > 0) { 20 System.out.println("更新成功"); 21 } 22 else { 23 System.out.println("更新失敗"); 24 } 25 26 } catch (SQLException e) { 27 // TODO 自動生成的 catch 塊 28 e.printStackTrace(); 29 }finally { 30 JDBCUtil.release(conn, st); 31 } 32 }