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

原文连接,感谢博主!

猜你喜欢

转载自blog.csdn.net/qq_35779969/article/details/80873799