MySql PreparedStatement用法 及 Transaction处理

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

public class TestJDBC {
	/**
	 * 当银行转账时,需要在汇款人账户上扣除汇款金额,同时在收款人账户上存入汇款金额,
	 * 如果中间异常扣款但未实现转账,就需要事物处理,在出现异常情况下回滚到初始状态
	 */
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/aho", "root", "root");
			//设置自动提交为false(默认为true)
			conn.setAutoCommit(false);
			ps =conn.prepareStatement("insert into person(id,name,age) values(?,?,?)");
			ps.setInt(1, 1);
			ps.setString(2, "李四");
			ps.setInt(3, 18);
			ps.addBatch();
			
			ps.setInt(1, 1);
			ps.setString(2, "李四");
			ps.setInt(3, 18);
			ps.addBatch();
			
			ps.setInt(1, 1);
			ps.setString(2, "李四");
			ps.setInt(3, 18);
			ps.addBatch();
			
			ps.executeBatch();
			//手动提交
			conn.commit();
			//设置回自动提交
			conn.setAutoCommit(true);
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				if(conn!=null){
					//遇到异常事物滚回,并设置初始自动提交为true
					conn.rollback();
					conn.setAutoCommit(true);
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} finally {
			try {
				if(ps!=null){
					ps.close();
					ps = null;
				}
				if(conn!=null){
					conn.close();
					conn = null;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

  

posted @ 2013-09-10 22:37  微风夜明  阅读(1517)  评论(0编辑  收藏  举报