package com.hechao.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 数据库会话(封装数据库连接以及相关的操作)
* @author hechao
*
*/
public class DbSession {
// 最好的做法是将配置保存到配置文件中(可以用properteis或XML)
private static final String DRV = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/bank";
private static final String UID = "root";
private static final String PWD = "123456";
static { // 通过静态代码块加载数据库驱动
try {
Class.forName(DRV);
}
catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
private Connection con = null;
/**
* 打开连接
* @throws 无法建立连接时将抛出异常
*/
public void open() {
if(con == null) {
try {
con = DriverManager.getConnection(URL, UID, PWD);
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
/**
* 关闭连接
* @throws 无法关闭连接时将抛出异常
*/
public void close() {
try {
if(con != null && !con.isClosed()) {
con.close(); // 释放数据库连接
con = null; // 指示垃圾回收器可以回收此对象
}
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 开启事务
* @throws 无法开启事务时将抛出异常
*/
public void beginTx() {
if(con != null) {
try {
con.setAutoCommit(false);
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
/**
* 提交事务
* @throws 无法提交事务时将抛出异常
*/
public void commitTx() {
if(con != null) {
try {
con.commit();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
/**
* 回滚事务
* @throws 无法回滚事务时将抛出异常
*/
public void rollbackTx() {
if(con != null) {
try {
con.rollback();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
/**
* 执行更新语句
* @param sql SQL语句
* @param params 替换SQL语句中占位符的参数
* @return 多少行受影响
*/
public int executeUpdate(String sql, Object... params) {
try {
PreparedStatement ps = con.prepareStatement(sql);
for(int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
return ps.executeUpdate();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 执行查询语句
* @param sql SQL语句
* @param params 替换SQL语句中占位符的参数
* @return 结果集(游标)
*/
public ResultSet executeQuery(String sql, Object... params) {
try {
PreparedStatement ps = con.prepareStatement(sql);
for(int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
return ps.executeQuery();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
}