JDBC_经典的编程式事务写法

package cn.tedu.jdbc.day02;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

/*
 * 连接池版本的 数据库 连接管理工具类
 * 适合于并发场合
 * 封装数据源连接池
 */
public class DBUtils {
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	private static int initSize;
	private static int maxActive;
	private static BasicDataSource ds;
	/*
	 * 创建连接池,读值赋值
	 */
	static {
		//创建连接池
		ds = new BasicDataSource();
		Properties cfg = new Properties();
		try {
			InputStream in = DBUtils.class
					.getClassLoader().getResourceAsStream("db.properties");
			//通过流打开文件
			cfg.load(in);
			//初始化参数
			driver = cfg.getProperty("jdbc.driver");
			url = cfg.getProperty("jdbc.url");
			username = cfg.getProperty("jdbc.username");
			password = cfg.getProperty("jdbc.password");
			//initSize是一个整数,但是key这个里面存的是字符串,那么
			//怎么把整数变成字符串呢?
			initSize = Integer.parseInt(cfg.getProperty("initSize"));
			maxActive = Integer.parseInt(cfg.getProperty("maxActive"));
			in.close();
			//初始化连接池
			ds.setDriverClassName(driver);
			ds.setUrl(url);
			ds.setUsername(username);
			ds.setPassword(password);
			ds.setInitialSize(initSize);
			ds.setMaxActive(maxActive);
		}catch(Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
	public static Connection getConnection() {
		try {
			//getConnection()从连接池中获取重用的连接
			//如果连接池满了,则等待
			//如果有连接归还则获取重用的连接
			Connection conn = ds.getConnection();
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	//归还连接
	public static void close(Connection conn) {
		if(conn!=null) {
			try{
				//将用过的连接归还到连接池
				conn.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
	//回滚
	public static void rollback(Connection conn) {
		try {
			if(conn!=null) {
			conn.rollback();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

上面是需要用到的工具类。
package cn.tedu.jdbc.day03;

import java.sql.Connection;

import cn.tedu.jdbc.day01_test.Dbutils;
import cn.tedu.jdbc.day02.DBUtils;
/*
 * 一个经典的编程式事务写法
 * 1.获取连接以后自动连接关闭
 * 2.做SQL语句
 * 	-想取消操作的话,抛出异常即可
 * 	-后面回滚
 */
public class Demo02 {
	public static void main(String[] args) {
		
	}	
	public static void DDButils() {
		Connection conn = null;
		try {
			conn = Dbutils.getConnection();
			//取消自动提交,后续手动提交
			conn.setAutoCommit(false);
			//SQL...update
			/*
			 * update account_zqk 
			 * set balance=balence+(-?)? 
			 * where id=?;
			 * 
			 * update account_Zqk 
			 * set balance=balance+?
			 * where id=?
			 * [换成一个执行 计划]
			 * 检查原账户是否发生透支
			 * select balance from account_zqk
			 * where id=1;
			 * 如果透支 throw 异常
			 * 把上面的语句的id=xxx,改成写成?
			 * select balance from account_zqk
			 * where id=?
			 * 汇款的金额,也写成?形式的
			 */
			//SQL...update
			// 余额不足 如何取消前两个SQL,抛出异常即可
			//throw e
 			//......
			conn.commit();
		} catch (Exception e) {
			e.printStackTrace();
			//回滚的方法
			DBUtils.rollback(conn);
		}finally {
			//归还
			Dbutils.close(conn);
		}
	}
}


展开阅读全文

没有更多推荐了,返回首页