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

来源:互联网 发布:电脑没有网络连接 编辑:程序博客网 时间:2024/06/05 09:14

        在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连接池得到DataSourceprivate static DataSource ds = new ComboPooledDataSource();//定义一个Connection来判断是否有事务private static Connection con = null;//返回DataSourcepublic static DataSource getDataSource(){return ds;}//通过DataSource得到Connectionpublic static Connection getConnection() throws SQLException{//如果开启了事务,则con不为空,应该直接返回conif(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操作@Testpublic 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操作@Testpublic 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();}}}}

0 0
原创粉丝点击