您的位置:首页 > 编程语言 > Java开发

javaweb开发过程中小工具系列之支持事务的JdbcUtils

2017-01-04 12:25 363 查看
        在javaweb项目的开发过程中,不可避免的会与数据库打交道。

        此util需要使用c3p0连接池。

代码示例:

JdbcUtils

package cn.ccnu.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {
//通过c3p0连接池得到DataSource
private static DataSource ds = new ComboPooledDataSource();
//定义一个Connection来判断是否有事务
private static Connection con = null;
//返回DataSource
public static DataSource getDataSource(){
return ds;
}

//通过DataSource得到Connection
public static Connection getConnection() throws SQLException{
//如果开启了事务,则con不为空,应该直接返回con
if(con != null){
return con;
}
return ds.getConnection();
}

// 开启事务
public static void beginTransaction() throws SQLException {
//判断con是否为空,如果不为空,则说明事务已经开启
if(con != null){
throw new SQLException("事务已经开启了,不能重复开启事务");
}
//如果不为空,则开启事务
con = getConnection();
//设置事务提交为手动
con.setAutoCommit(false);
}

// 提交事务
public static void commitTransaction() throws SQLException {
//判断con是否为空,如果为空,则说明没有开启事务
if(con == null){
throw new SQLException("没有开启事务,不能提交事务");
}
//如果con不为空,提交事务
con.commit();
//事务提交后,关闭连接
con.close();
//表示事务已经结束
con = null;
}

// 回滚事务
public static void rollbackTransaction() throws SQLException {
//判断con是否为空,如果为空,则说明没有开启事务,也就不能回滚事务
if(con == null){
throw new SQLException("没有开启事务,不能回滚事务");
}
//事务回滚
con.rollback();
//事务回滚后,关闭连接
con.close();
//把con置为null,表示事务已经结束
con = null;
}

// 关闭事务
public static void releaseConnection(Connection connection) throws SQLException {
//如果参数连接与当前事务连接不相等,则说明参数连接不是事务连接,可以关闭,否则由事务关闭
if(connection != null && con != connection){
//如果连接没有被关闭,关闭之
if(!connection.isClosed()){
connection.close();
}
}
}
}


使用jdbc进行测试

package cn.ccnu.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

public class JdbcUtilsTest {
//没有事务的普通的JDBC操作
@Test
public void test11() throws SQLException{
PreparedStatement ps = null;
Connection conn = JdbcUtils.getConnection();
String sql = "update user set salary = ? where id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 100);
ps.setInt(2, 1);
ps.executeUpdate();
JdbcUtils.releaseConnection(conn);
}

//有事务的JDBC操作
@Test
public void test22(){
try{
JdbcUtils.beginTransaction();
PreparedStatement ps = null;
Connection conn = JdbcUtils.getConnection();

String sql1 = "update user set salary = salary + ? where id = 1;";
ps = conn.prepareStatement(sql1);
ps.setInt(1, 200);
int i = ps.executeUpdate();
System.out.println(i);
//认为制造异常
int n = 1/0;

String sql2 = "update user set salary = salary - ? where id = 2;";
ps = conn.prepareStatement(sql2);
ps.setInt(1, 200);
i = ps.executeUpdate();
System.out.println(i);
JdbcUtils.commitTransaction();
}catch(Exception e){
try {
JdbcUtils.rollbackTransaction();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: