这句话执行了什么?如不看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对象
操作完成以后要把 所有使用的JDBC对象全都关闭,以释放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(); } }
jdbc默认提供了事务管理,所以就不用担心事务没提交;但是进行多表操作或者多语句操作时,要求多语句同时提交和回滚时,就必须取消自动提交改为手动提交或回滚。
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(); }