数据库操作辅助类
数据库资源管理器
将数据库驱动字符串、连接字符串、用户名与密码存放在配置文件或是xml文件中,如果以后要更换数据库,则只需要修改配置文件中的信息即可,不用修改Java代码就可以直接使用了。
下面以properties属性文件为配置文件来看:
/**
* 加载配置文件中JDBC连接所需要数据
*/
private static void loadProperties() {
InputStream in = Thread.currentThread().getClass()
.getResourceAsStream("/jdbc.properties");
Properties prop = new Properties();
try {
prop.load(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
}
在静态代码块中实现数据库驱动加载:
/* 通过静态代码块加载数据库驱动 */
static {
loadProperties(); // 读取配置文件
try {
Class.forName(driver); // 加载驱动
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
添加创建连接对象的方法,连接字符串、用户名与密码是上段代码获取到的字符串:
/**
* 获取连接对象
*
* @return 连接对象
* @throws SQLException
* 无法建立连接,则抛出异常
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
添加释放各资源的方法:
/**
* 释放结果集资源
*
* @param rs
* 结果集对象
* @throws SQLException
* 无法释放结果集资源,则抛出异常
*/
public static void close(ResultSet rs) throws SQLException {
if (null != rs && !rs.isClosed())
rs.close();
}
/**
* 释放Statement资源
*
* @param stmt
* Statement对象
* @throws SQLException
* 无法释放状态集对象资源,则抛出异常
*/
public static void close(Statement stmt) throws SQLException {
if (null != stmt && !stmt.isClosed())
stmt.close();
}
/**
* 释放连接对象资源
*
* @param conn
* 连接对象
* @throws SQLException
* 无法释放连接对象资源,则抛出异常
*/
public static void close(Connection conn) throws SQLException {
if (null != conn && !conn.isClosed())
conn.close();
}
数据库会话
自定义一个用于处理会话异常的运行时异常类,即继承RuntimeException类。然后在会话处理中如果抛出异常,则转化为抛出会话异常。
调用会话资源管理器类的方法实现打开会话及释放资源操作:
/**
* 开启会话
*/
public void open() {
if (null == conn)
try {
conn = JdbcResourceManager.getConnection();
} catch (SQLException e) {
throw new JdbcSessionException("数据库会话创建失败", e);
}
}
/**
* 关闭数据库会话,释放资源
*/
public void close() {
try {
JdbcResourceManager.close(rs);
rs = null;
} catch (SQLException e) {
throw new JdbcSessionException("数据库会话ResultSet关闭失败", e);
} finally {
try {
JdbcResourceManager.close(pstmt);
pstmt = null;
} catch (SQLException e) {
throw new JdbcSessionException("数据库会话Statement关闭失败", e);
} finally {
try {
JdbcResourceManager.close(conn);
conn = null;
} catch (SQLException e) {
throw new JdbcSessionException("数据库会话Connection关闭失败", e);
}
}
}
}
添加用于执行INSERT、UPDATE、DELETE语句的方法:
/**
* 执行更新SQL语句
*
* @param sql
* 更新的SQL语句,如INSERT、UPDATE、DELETE语句
* @param params
* 用于替换更新语句中"?"占位符的参数列表
* @return 受影响行数
*/
public int executeUpdate(String sql, Object... params) {
try {
pstmt = conn.prepareStatement(sql);
if (null != params) {
for (int i = 0; i < params.length; i++) { // 为每个?占位符设置参数
pstmt.setObject(i + 1, params[i]);
}
}
return pstmt.executeUpdate();
} catch (SQLException e) {
throw new JdbcSessionException("执行更新操作失败", e);
}
}
添加用于执行SELECT语句的方法:
/**
* 执行查询SQL语句
*
* @param sql
* 待执行查询的SQL语句,如 SELECT 语句
* @param params
* 用于替换查询语句中"?"占位符的参数列表
* @return 查询结果集ResultSet对象
*/
public ResultSet executeQuery(String sql, Object... params) {
try {
pstmt = conn.prepareStatement(sql);
if (null != params) {
for (int i = 0; i < params.length; i++) { // 为每个?占位符设置参数
pstmt.setObject(i + 1, params[i]);
}
}
return rs = pstmt.executeQuery();
} catch (SQLException e) {
throw new JdbcSessionException("执行查询操作失败", e);
}
}
数据库会话工厂
创建线程局部变量用于保存数据库会话对象:
private static final ThreadLocal<JdbcSession> threadLocal = new ThreadLocal<JdbcSession>();
添加静态方法获取数据库会话对象:
/**
* 获取当前数据库会话对象
*
* @return JDBC数据库会话对象
*/
public static JdbcSession getCurrentSession() {
JdbcSession session = threadLocal.get(); // 获取线程局部变量中的数据库会话对象
if (null == session) { // 会话对话不存在,则创建并添加到线程局部变量中保存
session = new JdbcSession();
threadLocal.set(session);
}
session.open(); // 打开会话
return session;
}
添加静态方法关闭数据库会话对象,释放资源:
/**
* 关闭当前数据库会话对象
*/
public static void closeSession() {
JdbcSession session = threadLocal.get(); // 获取线程局部变量中的数据库会话对象
threadLocal.set(null); // 置空
if (null != session) // 会话不为空,则关闭
session.close();
}