数据的回滚操作
package SixPassage;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class Rollback2 {
/**
* 考虑事务的操作
* 1、数据一旦提交,就不可回滚
* 2、哪些数据会导致数据的自动提交
* >DDL操作一旦执行,都会自动提交
* ->set autocommit =false 对DDL操作无效
* >DML默认的情况下,就会自动提交
* ->我们可以通过set autocommit =false 的方式取消DML操作的自动提交
* >默认在关闭链接时,会自动提交数据
* @author user
*
*/
@Test
public void Test1() throws SQLException {
Connection conn = null;
try {
conn = DBUtil.getConnection();
//1、取消自动提交
conn.setAutoCommit(false);
String sql="update user_table set balance=balance-100 where user=?";
Rollback2.zsg(conn, sql, "AA");
//模拟网络异常
System.out.println(10/0);
String sql1="update user_table set balance=balance+100 where user=?";
Rollback2.zsg(conn, sql1, "BB");
//2、提交数据
conn.commit();
System.out.println("转账成功");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("转账失败");
//3、数据回滚
conn.rollback();
}finally {
DBUtil.closeConnection(conn, null, null);
}
}
//通用的增删改操作
public static void zsg(Connection conn,String sql,Object...args) throws Exception {
//预编译
PreparedStatement ps = conn.prepareStatement(sql);
//填充占位符
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
}
//执行sql语句
ps.execute();
}
//通用的查询操作
public static <T> List<T> Query(Class<T> clazz,String sql,Connection conn,Object...args) throws Exception {
//预编译
PreparedStatement ps = conn.prepareStatement(sql);
//填充占位符
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
}
//执行sql语句
ResultSet rs = ps.executeQuery();
//获取元数据
ResultSetMetaData metaData = rs.getMetaData();
//获取列数
int columnCount = metaData.getColumnCount();
ArrayList<T> arrayList = new ArrayList<T>();
while(rs.next()) {
T t= clazz.newInstance();
for(int i=0;i<columnCount;i++) {
//获取列名
String Cname = metaData.getColumnName(i+1);
//获取列值
Object value = rs.getObject(i+1);
//获取属性
Field field = clazz.getDeclaredField(Cname);
field.setAccessible(true);
field.set(t, value);
}
arrayList.add(t);
}
// conn.close();
// ps.close();
// rs.close();
DBUtil.closeConnection(conn, ps, rs);
return arrayList;
}
}