package cn.zhouzhou;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*一、事物?---------------模拟银行的转账业务!
*
* 1.开启事物
* con01.setAutoCommit(false);
* setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。
* 2.获取preparedstateme 执行SQL语句
* 【?】 占位子节符
* 3.使用 preparedstatement 两次更新操作
* setDouble(int parameterIndex, double x)
将指定的参数设置为给定的Java double值。
setString(int parameterIndex, String x)
将指定的参数设置为给定的Java String值。
* 4.提交事物
* con01.commit();
* 使自上次提交/回滚以来所做的所有更改都将永久性,
* 并释放此 Connection对象当前持有的任何数据库锁。
*
* 5.事务回滚
* con01.rollback();
* 撤消在当前事务中所做的所有更改,
* 并释放此 Connection对象当前持有的任何数据库锁。
6.关闭资源
finally{工具类存在硬编码问题.close(ps01, con01);}
*
*
*/
public class 事物 {
public static void main(String[] args) {
Connection con01=null;
PreparedStatement ps01=null;
//开启事物
try {
con01=工具类存在硬编码问题.getConnection();
con01.setAutoCommit(false);
//获取preparedstateme 执行SQL语句
String sql="update shop set price=price-? where name =?";
ps01=con01.prepareStatement(sql);
//使用 preparedstatement 两次更新操作
ps01.setDouble(1, 1);
ps01.setString(2, "a");
ps01.executeUpdate();
// System.out.println(111/0);
String sql01="update shop set price=price+? wehere name=?";
ps01=con01.prepareStatement(sql01);
ps01.setDouble(1, 2);
ps01.setString( 2, "b");
ps01.execute();
//提交事务?
con01.commit();
System.out.println("转账成功!");
}
catch (SQLException e)
{
//事物回滚?
try
{
con01.rollback();
}
catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("失败");
}finally{工具类存在硬编码问题.close(ps01, con01);}
}
}