#JDBC驅動:不同資料庫間,標準的SQL語句可以移植,而資料庫實際通訊協定及某些資料庫特徵不可移植,因此,JDBC和資料庫之間須還有一層,用於將JDBC調用映射成特定的資料庫調用,此特殊層就是JDBC驅動程式.
常見的JDBC驅動有四種:
》JDBC-ODBC橋,是最早實現的JDBC驅動程式,目的為了快速推廣JDBC,非多線程,能力有限,此驅動程式將JDBC API映射成ODBC API
》直接將JDBC API映射成資料庫特定的用戶端API,這種驅動程式套件含特定資料庫的本地代碼,可用於特定資料庫的用戶端
》支援三層結構的JDBC訪問方式,主要用於Applet階段,通過Applet訪問資料庫
》純java的,直接與資料庫執行個體互動,智能型的,知道資料庫使用的底層協議,是目前最流行的JDBC驅動
Java JDBC串連資料庫代碼展示:
| 代碼如下 |
複製代碼 |
import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBConnection { public Connection conn = null; // 聲明Connection對象的執行個體 public Statement stmt = null; // 聲明Statement對象的執行個體 public ResultSet rs = null; // 聲明ResultSet對象的執行個體 //定義儲存資料庫驅動的變數 private static String dbClassName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; private static String dbUrl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=DB_ATM"; private static String dbUser = "sa"; private static String dbPwd = "sa"; public JDBConnection(String propertyFileName) {// 帶屬性檔案名稱的構造方法 Properties prop = new Properties();// 屬性集合對象 InputStream is = null; try { is = JDBConnection.class.getClassLoader().getResourceAsStream( propertyFileName);// 屬性檔案輸入資料流 // is = new FileInputStream("src/" + propertyFileName); prop.load(is);// 將屬性檔案流裝載到Properties對象中 is.close();// 關閉流 dbClassName = prop.getProperty("dbClassName"); dbUrl = prop.getProperty("dbUrl"); dbUser = prop.getProperty("dbUser"); dbPwd = prop.getProperty("dbPwd"); } catch (Exception e) { System.out.println("屬性檔案 " + propertyFileName + " 開啟失敗!"); } try { Class.forName(dbClassName);// 1.註冊驅動 } catch (ClassNotFoundException e) { e.printStackTrace(); } } public JDBConnection() {// 預設的不帶參數的建構函式 try { Class.forName(dbClassName);// 1.註冊驅動 } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() { Connection conn = null; try { // Class.forName(dbClassName);// 1.註冊驅動 //2.建立與資料庫的連結 conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd); } catch (Exception ee) { ee.printStackTrace(); } if (conn == null) { System.err.println("警告: DbConnectionManager.getConnection() 獲得資料庫連結失敗. \r\n\r\n連結類型:" + dbClassName + "\r\n連結位置:" + dbUrl + "\r\n使用者/密碼" + dbUser + "/" + dbPwd); } return conn; } /* * 功能:執行查詢語句 */ public ResultSet executeQuery(String sql) { try { // 捕捉異常 // 調用getConnection()方法構造Connection對象的一個執行個體conn conn = getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,//3.建立語句 ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql);//4.執行查詢 } catch (SQLException ex) { System.err.println(ex.getMessage()); // 輸出異常資訊 } return rs; // 返回結果集對象 5.結果處理 } /* * 功能:執行更新操作 */ public int executeUpdate(String sql) { int result = 0; // 定義儲存傳回值的變數 try { // 捕捉異常 // 調用getConnection()方法構造Connection對象的一個執行個體conn conn = getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); result = stmt.executeUpdate(sql); // 執行更新操作 } catch (SQLException ex) { result = 0; // 將儲存傳回值的變數賦值為0 } return result; // 返回儲存傳回值的變數 } /* * 功能:關閉資料庫的串連 */ public void close() {//6.釋放資源 try { // 捕捉異常 try { if (rs != null) { // 當ResultSet對象的執行個體rs不為空白時 rs.close(); // 關閉ResultSet對象 } } finally { try { if (stmt != null) { // 當Statement對象的執行個體stmt不為空白時 stmt.close(); // 關閉Statement對象 } } finally { if (conn != null) { // 當Connection對象的執行個體conn不為空白時 conn.close(); // 關閉Connection對象 } } } } catch (Exception e) { e.printStackTrace(System.err); // 輸出異常資訊 } } } |
大家需要注意的一些屬性檔案:
dbClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
dbClassName2=com.mysql.jdbc.Driver
dbPwd=sa
dbPwd2=root
dbUrl=jdbc\:microsoft\:sqlserver\://localhost\:1433;DatabaseName\=DB_ATM
dbUrl2=jdbc\:mysql\://localhost\:3306/db_atm
dbUser=sa
dbUser2=root