1、JDBC---DriverManager/Transaction

4910 ワード

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);
データベースへの接続を取得します.この2つのステップで異常が発生する可能性があります.1つはDriver異常が見つかりません.1つは接続異常です.
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文を実行する3つの方法があります.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(原子間、一貫性、独立性、持続性)を満たす必要があります.
げんしせい
トランザクション全体のすべての操作は、すべて完了するか、すべて完了しないか、中間の一環に停滞することはできません.トランザクションは実行中にエラーが発生し、このトランザクションが実行されたことがないように、トランザクションが開始される前の状態にロールバックされます.
コンシステンシ
トランザクションの開始前とトランザクションの終了後、データベースの整合性制約は破壊されません.
ぶんりせい
独立状態は、システムが所定の時間内に実行する唯一の操作のようにトランザクションを実行します.2つのトランザクションが同じ時間に実行され、同じ機能が実行される場合、トランザクションの独立性は、各トランザクションがシステム内でそのトランザクションのみがシステムを使用していると判断することを保証します.このプロパティはシリアル化と呼ばれる場合があります.トランザクション・オペレーション間の混同を防止するために、同じ時間に同じデータに1つのリクエストしか使用されないように、リクエストをシリアル化またはシーケンス化する必要があります.
持続性
トランザクションが完了すると、トランザクションがデータベースに加えた変更はデータベースに永続的に保存され、ロールバックされません.
トランザクションの終了には、コミットとロールバックの2つの形式しかありません.操作が完全に成功するとコミットされ、永続的な変更が発生します.操作が不完全に成功するとロールバックされ、トランザクションが開始される前の状態に戻ります.トランザクションが終了します.
まず、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();
        }