7.13日问题集
JDBC API
DriverManager:这是一个驱动程序管理类,用来装载驱动程序。并为创建数据库连接提供支持
Connection:connection是一个接口,用来连接某一特定的数据库。
Statement:statement接口提供了执行SQL语句。获取查询结果的方法
PreparedStatement:是statement的子接口,用来执行编译的sql语句
ResultSet:该接口提供了对结果集的处理方法
JDBC Driver API
JDBC Driver API是面向驱动程序开发商的接口
主要有四种:
- JDBC-ODBC bridge:这种驱动程序会把jdbc的调用委托给其他接口
- 部分java技术的本地api驱动程序
- 全部基于java技术的本地api驱动程序
- 全部基于java技术的本地协议驱动程序
JDBC的操作流程
Class.forName()
Class:这个类封装了要装载到JVM中类的信息。比如类的成员方法,成员变量,以及这个类实现的接口。
forName():这个方法用来初始化指定参数的类。并创建一个对应的实例对象
参数中的字符串:是mysql指定的字符串驱动程序
事务的四个特征
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
JDBC事务处理
http://blog.csdn.net/csc0211/article/details/6232047
在JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。关于事务操作的方法都位于接口java.sql.Connection中。
首先我们要注意,在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。
其次,在JDBC中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交。倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常。此时就可以在异常捕获时调用rollback()进行回退。这样做可以保持多次更新操作后,相关数据的一致性。
具体事例如下:
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:luecc", "scott", "tiger");
//点禁止自动提交,设置回退
conn.setAutoCommit(false);
stmt = conn.createStatement();
//数据更新
stmt.addBatch("insert into dept values (51, '500', 'ccc')");
stmt.addBatch("insert into dept values (52, '600', 'ddd')");
stmt.addBatch("insert into dept values (53, '700', 'eee')");
stmt.executeBatch();
//事务提交
conn.commit();
conn.setAutoCommit(true);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
try {
if(conn != null)
{
//操作不成功则回退
conn.rollback();
//重新设置恢复默认值
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}