1. 程式人生 > >JDBC連線Oracle資料庫例項

JDBC連線Oracle資料庫例項

本文給出一個通過JDBC連線Oracle資料庫的例項,希望對JDBC初學者有所幫助。我沒有像很多例子那樣一個函式就把整個JDBC的操作全部完成,這樣的程式碼在企業專案開發中一般是不能通過稽核的,我現在工作的公司就對程式碼規範有嚴格要求。比如,“一個函式,只做一件事”。這意味著你不能把一大堆功能程式碼放在一個函式裡,需要拆分。另外,一個函式的程式碼行數也有嚴格要求,一般不能超過80行。所以,那些一個函式幾百行的程式碼絕對通不過稽核,除非這個公司根本不在乎編碼規範。初學者可能覺得這個好苛刻,其實這非常合理,程式碼是寫給人看的,附帶在機器上執行,所以養成一個好的編碼規範,方便後期的程式碼維護,利己又利人,何樂而不為?

本文的價值在於提醒程式設計者注意程式碼規範,當然我寫的不一定規範,僅僅是參考,我也正在提升自己的編碼規範的道路上。另外,在實際的開發中,特別是高訪問量、高併發的系統中,不會直接通過JDBC來操作資料庫,而會通過資料庫連線池來操作資料庫,這會大大提升效能。因為資料庫連線是一個基於TCP協議的網路連線,需要很多資源,頻繁地對資料庫進行連線、斷開會嚴重影響系統性能。

下面是我的程式碼,感謝參考和完善!主要展示Connection、PreparedStatement、ResultSet和ResultSetMetaData的基本用法,另外我之所以不使用Statement,是因為PreparedStatement比Statement有以下優勢:

PreparedStatement預編譯SQL語句,效能更好;

PreparedStatement不需要拼接SQL語句,而拼接SQL語句非常容易出錯;

PreparedStatement可以防止SQL注入,擁有更高的安全性。

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import
    java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.ResultSetMetaData;
  6. import java.sql.SQLException;
  7. public class OracleJDBCDemo {
  8. private Connection con = null; // 資料庫連線物件
  9. private PreparedStatement psmt = null; // 預編譯語句物件
  10. private ResultSet result = null; // 結果集物件
  11. /**
  12. * 建立資料庫連線
  13. *
  14. * @return
  15. * @throws ClassNotFoundException
  16. * @throws SQLException
  17. */
  18. public Connection setUpConnection() throws ClassNotFoundException, SQLException {
  19. Class.forName( "oracle.jdbc.driver.OracleDriver"); // 載入Oracle驅動程式
  20. String url = "jdbc:oracle:thin:@" + "host:port:databaseName"; // 連線使用的url
  21. String user = "your database userName"; // 資料庫使用者名稱
  22. String password = "your database password"; // 密碼
  23. con = DriverManager.getConnection(url, user, password); // 獲取連線
  24. return con;
  25. }
  26. /**
  27. * 執行查詢
  28. *
  29. * @return
  30. * @throws SQLException
  31. */
  32. public ResultSet query() throws SQLException {
  33. StringBuilder sql = new StringBuilder( "SELECT * ").
  34. append( "FROM BFM_USER").
  35. append( " WHERE USER_CODE=?");
  36. psmt = con.prepareStatement(sql.toString()); // 預編譯SQL
  37. psmt.setString( 1, "admin"); // 設定引數
  38. result = psmt.executeQuery(); // 執行SQL
  39. return result;
  40. }
  41. /**
  42. * 分析查詢結果集的元資料資訊
  43. *
  44. * @throws SQLException
  45. */
  46. public void analyzeResultSet() throws SQLException {
  47. ResultSetMetaData rsmd = null;
  48. StringBuilder sb = null;
  49. rsmd = result.getMetaData(); // 獲取查詢遊標的元資料物件
  50. sb = new StringBuilder();
  51. System.out.println( "列數目:" + rsmd.getColumnCount());
  52. for ( int i = 0; i < rsmd.getColumnCount(); i++) {
  53. sb.append( "列名:" + rsmd.getColumnName(i + 1) + " ");
  54. sb.append(rsmd.getColumnType(i + 1) + " ");
  55. sb.append(rsmd.getColumnLabel(i + 1) + " ");
  56. sb.append( "列最大寬度:" + rsmd.getColumnDisplaySize(i + 1) + "個字元 ");
  57. sb.append( "資料型別:" + rsmd.getColumnTypeName(i + 1));
  58. System.out.println(sb.toString());
  59. sb.delete( 0, sb.length());
  60. }
  61. }
  62. /**
  63. * 列印查詢到的結果
  64. *
  65. * @throws SQLException
  66. */
  67. public void printResult() throws SQLException {
  68. StringBuilder sb = null;
  69. sb = new StringBuilder();
  70. while (result.next()) {
  71. for ( int i = 0; i < result.getMetaData().getColumnCount(); i++) {
  72. sb.append(result.getString(i + 1) + " ");
  73. }
  74. System.out.println(sb.toString());
  75. sb.delete( 0, sb.length());
  76. }
  77. }
  78. /**
  79. * 關閉資料庫連線
  80. *
  81. * @throws SQLException
  82. */
  83. public void closeConnection() throws SQLException {
  84. if ( null != result) {
  85. result.close();
  86. }
  87. if ( null != psmt) {
  88. psmt.close();
  89. }
  90. if ( null != con) {
  91. con.close();
  92. }
  93. }
  94. public static void main(String[] args) {
  95. OracleJDBCDemo ojdbc = new OracleJDBCDemo();
  96. try {
  97. ojdbc.setUpConnection(); // 建立連線
  98. ojdbc.query(); // 執行查詢
  99. ojdbc.printResult(); // 列印查詢結果
  100. ojdbc.analyzeResultSet(); // 分析查詢遊標的元資料
  101. } catch (ClassNotFoundException | SQLException e) {
  102. e.printStackTrace();
  103. } finally {
  104. try {
  105. ojdbc.closeConnection();
  106. } catch (SQLException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. }
  111. }
關於編碼規範,另外二點需要注意的是:

> 匯入包的時候“按需匯入”,不要一個星號就完事了;

> 實際開發中的異常處理是將捕獲到的異常資訊登記到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

原文連線,感謝博主!