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对象
   操作完成以后要把 所有使用的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();
        }

猜你喜欢

转载自onway417.iteye.com/blog/2202356