JDBC操作數據庫的基本步驟:
1)加載(注冊)數據庫驅動(到JVM)。
2)建立(獲取)數據庫連接。
3)創建(獲取)數據庫操作對象。
4)定義操作的SQL語句。
5)執行數據庫操作。
6)獲取並操作結果集。
7)關閉對象,回收數據庫資源(關閉結果集-->關閉數據庫操作對象-->關閉連接)。
package com.yangshengjie.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCTest { /** * 使用JDBC連接並操作mysql數據庫 */ public static void main(String[] args) { // 數據庫驅動類名的字符串 String driver = "com.mysql.jdbc.Driver"; // 數據庫連接串 String url = "jdbc:mysql://127.0.0.1:3306/jdbctest"; // 用戶名 String username = "root"; // 密碼 String password = "mysqladmin"; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 1、加載數據庫驅動( 成功加載后,會將Driver類的實例注冊到DriverManager類中) Class.forName(driver ); // 2、獲取數據庫連接 conn = DriverManager.getConnection(url, username, password); // 3、獲取數據庫操作對象 stmt = conn.createStatement(); // 4、定義操作的SQL語句 String sql = "select * from user where id = 100"; // 5、執行數據庫操作 rs = stmt.executeQuery(sql); // 6、獲取並操作結果集 while (rs.next()) { System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); } } catch (Exception e) { e.printStackTrace(); } finally { // 7、關閉對象,回收數據庫資源 if (rs != null) { //關閉結果集對象 try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { // 關閉數據庫操作對象 try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { // 關閉數據庫連接對象 try { if (!conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } }
提示:關閉外部資源的順序應該和打開的順序相反,也就是說先關閉ResultSet、再關閉Statement、在關閉Connection。上面的代碼只關閉了Connection(連接),雖然通常情況下在關閉連接時,連接上創建的語句和打開的游標也會關閉,但不能保證總是如此,因此應該按照剛才說的順序分別關閉。此外,第一步加載驅動在JDBC 4.0中是可以省略的(自動從類路徑中加載驅動),但是我們建議保留。
常見面試題:
1.Statement和PreparedStatement有什么區別?哪個性能更好?
答:與Statement相比,①PreparedStatement接口代表預編譯的語句,它主要的優勢在於可以減少SQL的編譯錯誤並增加SQL的安全性(減少SQL注射攻擊的可能性);②PreparedStatement中的SQL語句是可以帶參數的,避免了用字符串連接拼接SQL語句的麻煩和不安全;③當批量處理SQL或頻繁執行相同的查詢時,PreparedStatement有明顯的性能上的優勢,由於數據庫可以將編譯優化后的SQL語句緩存起來,下次執行相同結構的語句時就會很快(不用再次編譯和生成執行計划)。
為了提供對存儲過程的調用,JDBC API中還提供了CallableStatement接口。存儲過程(Stored Procedure)是數據庫中一組為了完成特定功能的SQL語句的集合,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。雖然調用存儲過程會在網絡開銷、安全性、性能上獲得很多好處,但是存在如果底層數據庫發生遷移時就會有很多麻煩,因為每種數據庫的存儲過程在書寫上存在不少的差別。
2.使用JDBC操作數據庫時,如何提升讀取數據的性能?如何提升更新數據的性能?
答:要提升讀取數據的性能,可以指定通過結果集(ResultSet)對象的setFetchSize()方法指定每次抓取的記錄數(典型的空間換時間策略);要提升更新數據的性能可以使用PreparedStatement語句構建批處理,將若干SQL語句置於一個批處理中執行。