package com.bjpowernode.jdbc.utils; import java.sql.*; import java.util.ResourceBundle; /** * 数据库工具类简化JDBC的代码编写。 * * 在同一个没有结束的程序中,DBUtil类只加载一次,加载一次以后,再次调用该类中的方法,本不会再次加载。 */ public class DBUtil { /* 工具类中的构造方法都是私有的。(构造方法私有化是为了防止new对象,因为工具类中的方法都是静态的,不需要new对象,直接使用“类名.”的方式调用) */ //私有的构造方法 private DBUtil(){} //类加载时绑定属性资源文件(静态变量和静态代码块的执行时间一样,都是在类加载的时候执行,这时就看代码的先后顺序了,谁在前谁先执行) private static ResourceBundle bundle = ResourceBundle.getBundle("resources/db"); /* 上面绑定资源文件的目的就是为了下面能动态注册,也就是说既可以注册mysql数据库也可以注册Oracle数据库,还可以注册其他数据库 通过改变属性配置文件就可以实现. */ //注册驱动 static { try { Class.forName(bundle.getString("driver")); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取数据库连接对象 (以后在实际开发中只要调用该方法就会完成注册驱动和获取连接两步) * @return 新的连接对象 * @throws SQLException 这里选择上抛异常,由使用者捕捉。 */ public static Connection getConnection() throws SQLException { String url = bundle.getString("url"); String user = bundle.getString("user"); String password = bundle.getString("password"); Connection conn = DriverManager.getConnection(url,user,password); return conn; } /** * 释放资源 * @param conn 连接对象 * @param stmt 数据库操作对象 这里最好写Statement,而不写PreparedStatement, * 原因是今后可以使用多态,既可以传一个父类对象,也可以传入子类对象。 * @param rs 查询结果集 */ public static void close(Connection conn, Statement stmt, ResultSet rs){ if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
相应的属性配置文件db.properties在IDEA中的目录结构如下:
db.properties的内容如下: