关键词搜索

源码搜索 ×
×

Java中数据库访问之JDBC

发布2011-08-31浏览1151次

详情内容

1、实现多种数据库访问机制

原理:采用属性文件(xxx.properties)来修改不同数据库的访问。

例如:db.properties文件下(访问Oracle数据库):

    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@localhost:1521:orcl
    user=scot
    pwd=tiger

2、编写数据库连接类:ConnectionUtils

  1. public final class ConnectionUtils
  2. {
  3. private static final String DRIVER = PropertiesUtil.getValue("driver");
  4. private static final String URL = PropertiesUtil.getValue("url");
  5. private static final String USER = PropertiesUtil.getValue("user");
  6. private static final String PWD = PropertiesUtil.getValue("pwd");
  7. /**
  8. * 加载驱动,通常放在静态代码块中,因为加载驱动是一个非常重量级的操作
  9. * 因此我们应保证在整个程序运行过程中,它只被加载一次,但要随时可用
  10. * 静态代码块刚好满足此要求,它在类被加载时执行一次,以后就再不会执行了
  11. */
  12. static
  13. {
  14. try
  15. {
  16. Class.forName(DRIVER);
  17. } catch (ClassNotFoundException e)
  18. {
  19. e.printStackTrace();
  20. }
  21. }
  22. /**
  23. * 避免用户实例化此类(因此类是一个工具类,应尽量使用静态的方式来访问)
  24. */
  25. private ConnectionUtils()
  26. {
  27. }
  28. /**
  29. * 取得连接的工具方法
  30. *
  31. * @return
  32. */
  33. public static Connection getConnection()
  34. {
  35. try
  36. {
  37. return DriverManager.getConnection(URL, USER, PWD);
  38. } catch (SQLException e)
  39. {
  40. e.printStackTrace();
  41. }
  42. return null;
  43. }
  44. public static void close(ResultSet rs, Statement st, Connection conn)
  45. {
  46. if (rs != null)
  47. {
  48. try
  49. {
  50. rs.close();
  51. } catch (SQLException e)
  52. {
  53. e.printStackTrace();
  54. }
  55. }
  56. if (st != null)
  57. {
  58. try
  59. {
  60. st.close();
  61. } catch (SQLException e)
  62. {
  63. // TODO Auto-generated catch block
  64. e.printStackTrace();
  65. }
  66. }
  67. if (conn != null)
  68. {
  69. try
  70. {
  71. conn.close();
  72. } catch (SQLException e)
  73. {
  74. // TODO Auto-generated catch block
  75. e.printStackTrace();
  76. }
  77. }
  78. }
  79. public static void close(Statement st, Connection conn)
  80. {
  81. ConnectionUtils.close(null, st, conn);
  82. }
  83. }

3、初始化属性文件的PropertiesUtil 类(出于对性能的考虑,避免多次访问)

  1. public class PropertiesUtil
  2. {
  3. private static Properties prop = new Properties();
  4. static
  5. {
  6. InputStream ins = PropertiesUtil.class.getClassLoader().getResourceAsStream("db.properties");
  7. try
  8. {
  9. prop.load(ins);
  10. } catch (IOException e)
  11. {
  12. e.printStackTrace();
  13. }
  14. }
  15. public static String getValue(String key)
  16. {
  17. return prop.getProperty(key);
  18. }
  19. }

4、编写常用方法的实现类BaseDaoImpl

  1. public class BaseDaoImpl<T>
  2. {
  3. private Connection conn = null;
  4. private PreparedStatement pst = null;
  5. private ResultSet rs = null;
  6. /**
  7. * 更新(增加到、删除、修改)数据的方法
  8. *
  9. * @param sql
  10. * @param paras
  11. * @return
  12. */
  13. public int updateData(String sql, Object[] paras)
  14. {
  15. this.createPreparedStatement(sql, paras);
  16. int result = 0;
  17. try
  18. {
  19. result = this.pst.executeUpdate();
  20. } catch (SQLException e)
  21. {
  22. e.printStackTrace();
  23. } finally
  24. {
  25. ConnectionUtils.close(rs, pst, conn);
  26. }
  27. return result;
  28. }
  29. public int updateData(String sql)
  30. {
  31. return this.updateData(sql, null);
  32. }
  33. public List<T> query(String sql, ResultSetter rssetter)
  34. {
  35. return this.query(sql, null, rssetter);
  36. }
  37. public List<T> query(String sql, Object[] paras, ResultSetter rssetter)
  38. {
  39. this.createPreparedStatement(sql, paras);
  40. try
  41. {
  42. ResultSet rs = this.pst.executeQuery();
  43. // 将ResultSet中的数据封装到集合中[]
  44. return rssetter.setResultSetData(rs);
  45. } catch (SQLException e)
  46. {
  47. e.printStackTrace();
  48. } finally
  49. {
  50. ConnectionUtils.close(rs, pst, conn);
  51. }
  52. return null;
  53. }
  54. /**
  55. * 创建数据操作对象
  56. *
  57. * @param sql
  58. * @param paras
  59. */
  60. private void createPreparedStatement(String sql, Object[] paras)
  61. {
  62. this.conn = ConnectionUtils.getConnection();
  63. try
  64. {
  65. this.pst = this.conn.prepareStatement(sql);
  66. // 绑定动态参数
  67. if (paras != null && paras.length > 0)
  68. {
  69. for (int i = 0; i < paras.length; i++)
  70. {
  71. this.pst.setObject(i + 1, paras[i]);
  72. }
  73. }
  74. } catch (SQLException e)
  75. {
  76. e.printStackTrace();
  77. }
  78. }
  79. }

注:一般对象实现类继承BaseDaoImpl;方法调用,实现具体业务。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载