1、JDBC---DriverManager/Transaction

1、Class.forName("com.mysql.jdbc.Driver");
这句话执行了什么?如不看Driver的源码,则必然是创建了一个Class实例,可以调用这个实例的静态方法和全局变量。

public class Driver extends NonRegisteringDriver implements java.sql.Driver
{
static
{
try
{
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

这段源码中,static执行了创建对象的动作,即在类初始化阶段就创建了一个实例,不是单例的。

2、Connection conn= DriverManager.getConnection(url,user,password);
获取与数据库的连接,这两步都有可能异常,一个是找不到Driver异常,一个是连接异常,


3、创建Statement 实例
要执行SQL语句,必须创建Statement实例;
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;

prep.setString(1, "Gandhi");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");

prep.executeBatch();


4、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、boolean execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。

5、ResultSet结果集
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}
(列是从左到右编号的,并且从列1开始)

6、释放JDBC对象
操作完成以后要把[color=red]所有使用的JDBC对象全都关闭[/color],以释放JDBC资源,关闭顺序和声明顺序相反:
rs.close() ;
stmt.close() ;
conn.close() ;


正常的情况下,操作应该顺利进行,与操作相关的所有数据库信息也成功地更新;但是,如果在这一系列过程中任何一个环节出了差错,导致操作失败了,数据库中所有信息都必须保持操作前的状态不变。否则,数据库的信息将会一片混乱而不可预测。
一个逻辑工作单元要称为事务,必须满足ACID(原子性,一致性,隔离性和持久性)

原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

隔离性
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

持久性
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。


事务的结束只能有两种形式:提交和回滚。操作完全成功则提交,产生永久性的修改;操作不完全成功则回滚,恢复到事务开始前的状态。它们将结束一个事务。

首先我们要注意,在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。在提交过程中,

try{
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:myfisrt.db");
stat = conn.createStatement();
//关闭jdbc自动事务
conn.setAutoCommit(false);
int rs = stat.executeUpdate("insert into exceptionTest('数字','字符')values(null,'we');");
//执行成功,提交事务
conn.commit();

}catch (Exception e)
{
e.printStackTrace();
System.out.println("回滚");
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

[color=red]jdbc默认提供了事务管理,所以就不用担心事务没提交;但是进行多表操作或者多语句操作时,要求多语句同时提交和回滚时,就必须取消自动提交改为手动提交或回滚。[/color]

try{
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:myfisrt.db");
stat = conn.createStatement();
conn.setAutoCommit(false);
stat.executeUpdate("insert into exceptionTest('数字','字符')values(122,'we');");
stat.executeUpdate("insert into exceptionTest('数字','字符')values(null,'we');");
conn.commit();
}catch (Exception e)
{
conn.rollback();
System.out.println("回滚");
}finally
{
stat.close();
conn.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值