1、实现多种数据库访问机制
原理:采用属性文件(xxx.properties)来修改不同数据库的访问。
例如:db.properties文件下(访问Oracle数据库):
driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:orcl user=scot pwd=tiger
2、编写数据库连接类:ConnectionUtils
public final class ConnectionUtils { private static final String DRIVER = PropertiesUtil.getValue("driver"); private static final String URL = PropertiesUtil.getValue("url"); private static final String USER = PropertiesUtil.getValue("user"); private static final String PWD = PropertiesUtil.getValue("pwd"); /** * 加载驱动,通常放在静态代码块中,因为加载驱动是一个非常重量级的操作 * 因此我们应保证在整个程序运行过程中,它只被加载一次,但要随时可用 * 静态代码块刚好满足此要求,它在类被加载时执行一次,以后就再不会执行了 */ static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 避免用户实例化此类(因此类是一个工具类,应尽量使用静态的方式来访问) */ private ConnectionUtils() { } /** * 取得连接的工具方法 * * @return */ public static Connection getConnection() { try { return DriverManager.getConnection(URL, USER, PWD); } catch (SQLException e) { e.printStackTrace(); } return null; } public static void close(ResultSet rs, Statement st, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void close(Statement st, Connection conn) { ConnectionUtils.close(null, st, conn); } }
3、初始化属性文件的PropertiesUtil 类(出于对性能的考虑,避免多次访问)
public class PropertiesUtil { private static Properties prop = new Properties(); static { InputStream ins = PropertiesUtil.class.getClassLoader().getResourceAsStream("db.properties"); try { prop.load(ins); } catch (IOException e) { e.printStackTrace(); } } public static String getValue(String key) { return prop.getProperty(key); } }
4、编写常用方法的实现类BaseDaoImpl
public class BaseDaoImpl<T> { private Connection conn = null; private PreparedStatement pst = null; private ResultSet rs = null; /** * 更新(增加到、删除、修改)数据的方法 * * @param sql * @param paras * @return */ public int updateData(String sql, Object[] paras) { this.createPreparedStatement(sql, paras); int result = 0; try { result = this.pst.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { ConnectionUtils.close(rs, pst, conn); } return result; } public int updateData(String sql) { return this.updateData(sql, null); } public List<T> query(String sql, ResultSetter rssetter) { return this.query(sql, null, rssetter); } public List<T> query(String sql, Object[] paras, ResultSetter rssetter) { this.createPreparedStatement(sql, paras); try { ResultSet rs = this.pst.executeQuery(); // 将ResultSet中的数据封装到集合中[] return rssetter.setResultSetData(rs); } catch (SQLException e) { e.printStackTrace(); } finally { ConnectionUtils.close(rs, pst, conn); } return null; } /** * 创建数据操作对象 * * @param sql * @param paras */ private void createPreparedStatement(String sql, Object[] paras) { this.conn = ConnectionUtils.getConnection(); try { this.pst = this.conn.prepareStatement(sql); // 绑定动态参数 if (paras != null && paras.length > 0) { for (int i = 0; i < paras.length; i++) { this.pst.setObject(i + 1, paras[i]); } } } catch (SQLException e) { e.printStackTrace(); } } }
注:一般对象实现类继承BaseDaoImpl;方法调用,实现具体业务。