使用JDBC連接操作數據庫


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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM