掌握JDBC完成数据表CURD
掌握DAO模式程序
今天学习重点:JDBC事务管理、数据库连接池技术
事务:一组全部成功、全部失败操作。(这组操作不可分割)
案例:转账案例
MySQL 数据库 默认情况下 一条SQL就是一个单独事务,事务是自动提交的
Oracle 数据库 默认情况下 事务不是自动提交 ,所有SQL都将处于一个事务中,你需要手动进行commit提交/rollback回滚
设计账户table
create table account(
id int primary key not null,
name varchar(40),
money double
);
insert into account values(1,’aaa’,1000);
insert into account values(2,’bbb’,1000);
insert into account values(3,’ccc’,1000);
在mysql管理事务
start transaction 开启事务 (所有对数据表增加、修改、删除操作 临时表进行)
rollback 回滚事务 (取消刚刚操作)
commit 提交事务 (确认刚才操作)
* 在事务管理中执行sql,使用数据库内临时表保存,在没有进行事务提交或者回滚,其它用户无法看到事务操作结果的
* SQL语言中只有 DML才能被事务管理 insert update delete
Oracle实验
create table account(
id int primary key not null,
name varchar(40),
money number
);
使用JDBC程序如何控制事务
Connection.setAutoCommit(false); // 相当于start transaction
Connection.rollback(); rollback — 回滚到事务开启时状态
Connection.commit(); commit
- 将mysql的jar 复制 WEB-INF/lib
- 复制之前编写的JDBCUtils工具类
- 将数据库配置文件 dbconfig.properties 复制 src目录下 —– 修改数据库配置
事务回滚点 SavePoint
* 当时事务特别复杂,有些情况不会回滚到事务最开始状态,需要将事务回滚到指定位置
Savepoint sp = conn.setSavepoint(); 设置回滚点
Conn.rollback(sp); 事务回滚到指定位置
create table person(
id int primary key,
name varchar(40)
);
package it.cast.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.junit.Test;
import it.cast.jdbc.JDBCUtils;
public class TransforTest {
@Test
public void demo2(){
Connection conn=null;
PreparedStatement stmt=null;
try {
conn=JDBCUtils.getConnection();
conn.setAutoCommit(false);//关闭自动提交
String sql1="update account set money=money-100 where id=2";
String sql2="update account set money=money+100 where id=3";
stmt=conn.prepareStatement(sql1);
stmt.executeUpdate();//执行update操作
//int d=1/0;
stmt=conn.prepareStatement(sql2);
stmt.executeUpdate();//执行update操作
conn.commit();
} catch (Exception e) {
try {
System.out.println("事务回滚");
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally{
JDBCUtils.release(conn, stmt);
}
}
@Test
public void demo1(){
Connection conn=null;
PreparedStatement stmt=null;
try {
conn=JDBCUtils.getConnection();
String sql1="update account set money=money-100 where id=2";
String sql2="update account set money=money+100 where id=3";
stmt=conn.prepareStatement(sql1);
stmt.executeUpdate();//执行update操作
stmt=conn.prepareStatement(sql2);
stmt.executeUpdate();//执行update操作
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtils.release(conn, stmt);
}
}
}