JDBC学習ノート(七):自動メインキーに戻る

2002 ワード

プライマリ・テーブルとサブテーブルに同時にデータを挿入する場合.
需要:新しい部門を追加し、その部門の新入社員を追加します.
考え方1:sequenceにnextvalを生成させて記録し、メインテーブルとサブテーブルをそれぞれ追加する
この考え方は可能ですが、パフォーマンスに影響を与えるために、データベースに1回以上アクセスする必要があります.
考え方2:新しい部門を挿入し、その部門番号を返してから、従業員を挿入します.
比較構想1は性能上の最適化があった.
部門番号を返すにはgetGeneratedKeys()メソッドを使用します.このメソッドを使用して自己増加データを取得すると、パフォーマンスが良好で、インタラクションが1回しか必要ありません.
このメソッドを使用するには、PreparedStatement解析SQL文を新規作成するときに、2番目のパラメータを入力します.
GeneratedKeysに記録されるフィールド名を記録するString配列.
コード実装:
	public void testGeneratedKeys(){  
		//     ename   (    )
	    Connection con = null;  
	    try{  
	        con = DBUtil.getConnection();  
	        con.setAutoCommit(false);  
	      
	        String sql = "INSERT INTO depts VALUES(depts_seq.nextval,?,?)";  
	        PreparedStatement ps = con.prepareStatement(sql,new String[]{"deptno"});    //                 
	        ps.setString(1,"   ");  
	        ps.setString(2,"  ");  
	        ps.executeUpdate();  
	        ResultSet rs = ps.getGeneratedKeys();      //             
	        rs.next();              //       
	        int deptno = rs.getInt(1);      //          。  
	          
	        sql = "INSERT INTO emps VALUES(emps_seq.nextval,?,?,?,?,?,?,?)";    //        。  
	        ps.setString(1,ename);  
	        ps.setString(2,job);  
	        ps.setInt(3, mgr);  
	        ps.setDate(4, hiredate);  
	        ps.setDouble(5, sal);  
	        ps.setDouble(6, com);  
	        ps.setInt(7, deptno);  
	  
	        ps.executeUpdate();  
	        con.commit();  
	    }catch(SQLException e){  
	        try{  
	            con.rollback();  
	        }catch(SQLException e1){  
	            e1.printStackTrace();  
	            throw new RuntimeException("    ",e1);             
	        }  
	        e.printStackTrace();  
	        throw new RuntimeException("         ",e);  
	    }finally{  
	        DBUtil.close(con);  
	    }  
	    System.out.println("    ");  
	}