package study.transaction;
import org.junit.Test;
import study.util.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ConnectionTest {
/*
* 1、什么是数据库事务
* 1>一组逻辑操作单元,使数据从一种状态转变为另一种状态
* 2、事务处理原则:
*保证所有事务都作为一个工作单元来执行,
* 即使出现了故障,都不能改变这种执行方 式。
* 当在一个事务中执行多个操作时,
* 要么所有的事务都被提交(commit),
* 那么这些修改就永久地保存下来;
* 要么数据库管理系统将放弃所作的所有修改,
* 整个事务回滚(rollback)到初状态。
*
* 3、数据一旦提交,就不可以回滚
*
* 4、哪些操作会导致数据自动提交
* 》DDL一旦操作,都会自动提交
* 》DML默认情况下,一旦执行,就会自动提交
* set autocommit=false
* 》默认关闭时,会自动提交数据
* */
@Test
public void testUpdate(){
/*
* 未考虑数据事务后的转账操作
* 针对于数据表
* update books set price=price+50 where id=27;
* */
String sql="update books set price=price+50 where id=?";
update(sql,27);
System.out.println("添加成功");
/* //模拟网络异常(抛异常)
System.out.println(10/0);*/
}
//通用的增删改操作
public int update(String sql,Object ...args) {
Connection con = null;
PreparedStatement ps = null;
try {
//1、获取数据库的连接
con = JDBCUtils.getConnection();
//2、预编译sql语句,返回PreparedStatement的实例
ps = con.prepareStatement(sql);
//3、填充占位符
for(int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
//4、执行
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
//5、关闭资源
JDBCUtils.closeReduce(con,ps);
}
return 0;
}
@Test
public void testUpadateWitTx() {
Connection con = null;
try {
con = JDBCUtils.getConnection();
/*
* 未考虑数据事务后的转账操作
* 针对于数据表
* update books set price=price+50 where id=27;
* */
//取消数据的自动提交
con.setAutoCommit(false);
String sql="update books set price=price-50 where id=?";
update1(con,sql,27);
System.out.println("添加成功");
//提交数据
con.commit();
} catch (Exception e) {
e.printStackTrace();
//回滚数据
try {
con.rollback();//回滚数据
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
JDBCUtils.closeReduce(con,null);
}
}
//考虑数据事务后的转账操作
//通用的增删改操作
public int update1(Connection con,String sql,Object ...args) {
PreparedStatement ps = null;
try {
//1、预编译sql语句,返回PreparedStatement的实例
ps = con.prepareStatement(sql);
//2、填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//3、执行
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//修改其为自动提交数据
//主要针对于使用数据库连接池时
con.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
//5、关闭资源
JDBCUtils.closeReduce(null, ps);
}
return 0;
}
@Test
public void testGetConnectionTest() throws Exception {
Connection con =null;
con = JDBCUtils.getConnection();
System.out.println(con);
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}