JDBC連線Oracle資料庫例項
本文給出一個通過JDBC連線Oracle資料庫的例項,希望對JDBC初學者有所幫助。我沒有像很多例子那樣一個函式就把整個JDBC的操作全部完成,這樣的程式碼在企業專案開發中一般是不能通過稽核的,我現在工作的公司就對程式碼規範有嚴格要求。比如,“一個函式,只做一件事”。這意味著你不能把一大堆功能程式碼放在一個函式裡,需要拆分。另外,一個函式的程式碼行數也有嚴格要求,一般不能超過80行。所以,那些一個函式幾百行的程式碼絕對通不過稽核,除非這個公司根本不在乎編碼規範。初學者可能覺得這個好苛刻,其實這非常合理,程式碼是寫給人看的,附帶在機器上執行,所以養成一個好的編碼規範,方便後期的程式碼維護,利己又利人,何樂而不為?
本文的價值在於提醒程式設計者注意程式碼規範,當然我寫的不一定規範,僅僅是參考,我也正在提升自己的編碼規範的道路上。另外,在實際的開發中,特別是高訪問量、高併發的系統中,不會直接通過JDBC來操作資料庫,而會通過資料庫連線池來操作資料庫,這會大大提升效能。因為資料庫連線是一個基於TCP協議的網路連線,需要很多資源,頻繁地對資料庫進行連線、斷開會嚴重影響系統性能。
下面是我的程式碼,感謝參考和完善!主要展示Connection、PreparedStatement、ResultSet和ResultSetMetaData的基本用法,另外我之所以不使用Statement,是因為PreparedStatement比Statement有以下優勢:
> PreparedStatement預編譯SQL語句,效能更好;
> PreparedStatement不需要拼接SQL語句,而拼接SQL語句非常容易出錯;
> PreparedStatement可以防止SQL注入,擁有更高的安全性。
- import java.sql.Connection;
- import java.sql.DriverManager;
-
import
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- public class OracleJDBCDemo {
- private Connection con = null; // 資料庫連線物件
- private PreparedStatement psmt = null; // 預編譯語句物件
- private ResultSet result = null; // 結果集物件
- /**
- * 建立資料庫連線
- *
- * @return
- * @throws ClassNotFoundException
- * @throws SQLException
- */
- public Connection setUpConnection() throws ClassNotFoundException, SQLException {
- Class.forName( "oracle.jdbc.driver.OracleDriver"); // 載入Oracle驅動程式
- String url = "jdbc:oracle:thin:@" + "host:port:databaseName"; // 連線使用的url
- String user = "your database userName"; // 資料庫使用者名稱
- String password = "your database password"; // 密碼
- con = DriverManager.getConnection(url, user, password); // 獲取連線
- return con;
- }
- /**
- * 執行查詢
- *
- * @return
- * @throws SQLException
- */
- public ResultSet query() throws SQLException {
- StringBuilder sql = new StringBuilder( "SELECT * ").
- append( "FROM BFM_USER").
- append( " WHERE USER_CODE=?");
- psmt = con.prepareStatement(sql.toString()); // 預編譯SQL
- psmt.setString( 1, "admin"); // 設定引數
- result = psmt.executeQuery(); // 執行SQL
- return result;
- }
- /**
- * 分析查詢結果集的元資料資訊
- *
- * @throws SQLException
- */
- public void analyzeResultSet() throws SQLException {
- ResultSetMetaData rsmd = null;
- StringBuilder sb = null;
- rsmd = result.getMetaData(); // 獲取查詢遊標的元資料物件
- sb = new StringBuilder();
- System.out.println( "列數目:" + rsmd.getColumnCount());
- for ( int i = 0; i < rsmd.getColumnCount(); i++) {
- sb.append( "列名:" + rsmd.getColumnName(i + 1) + " ");
- sb.append(rsmd.getColumnType(i + 1) + " ");
- sb.append(rsmd.getColumnLabel(i + 1) + " ");
- sb.append( "列最大寬度:" + rsmd.getColumnDisplaySize(i + 1) + "個字元 ");
- sb.append( "資料型別:" + rsmd.getColumnTypeName(i + 1));
- System.out.println(sb.toString());
- sb.delete( 0, sb.length());
- }
- }
- /**
- * 列印查詢到的結果
- *
- * @throws SQLException
- */
- public void printResult() throws SQLException {
- StringBuilder sb = null;
- sb = new StringBuilder();
- while (result.next()) {
- for ( int i = 0; i < result.getMetaData().getColumnCount(); i++) {
- sb.append(result.getString(i + 1) + " ");
- }
- System.out.println(sb.toString());
- sb.delete( 0, sb.length());
- }
- }
- /**
- * 關閉資料庫連線
- *
- * @throws SQLException
- */
- public void closeConnection() throws SQLException {
- if ( null != result) {
- result.close();
- }
- if ( null != psmt) {
- psmt.close();
- }
- if ( null != con) {
- con.close();
- }
- }
- public static void main(String[] args) {
- OracleJDBCDemo ojdbc = new OracleJDBCDemo();
- try {
- ojdbc.setUpConnection(); // 建立連線
- ojdbc.query(); // 執行查詢
- ojdbc.printResult(); // 列印查詢結果
- ojdbc.analyzeResultSet(); // 分析查詢遊標的元資料
- } catch (ClassNotFoundException | SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- ojdbc.closeConnection();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
> 匯入包的時候“按需匯入”,不要一個星號就完事了;
> 實際開發中的異常處理是將捕獲到的異常資訊登記到log日誌中,二不是簡單的列印異常棧。
補充
載入MySQL驅動的寫法:Class.forName("com.mysql.jdbc.Driver");
載入Oracle驅動的寫法:Class.forName("oracle.jdbc.driver.OracleDriver");
MySQL的URL的寫法:jdbc:mysql://hostname:port/databasename
Oracle的URL的寫法:jdbc:oracle:thin:@hostname:port:databasename