JDBC学習ノート(七):自動メインキーに戻る
プライマリ・テーブルとサブテーブルに同時にデータを挿入する場合.
需要:新しい部門を追加し、その部門の新入社員を追加します.
考え方1:sequenceにnextvalを生成させて記録し、メインテーブルとサブテーブルをそれぞれ追加する
この考え方は可能ですが、パフォーマンスに影響を与えるために、データベースに1回以上アクセスする必要があります.
考え方2:新しい部門を挿入し、その部門番号を返してから、従業員を挿入します.
比較構想1は性能上の最適化があった.
部門番号を返すにはgetGeneratedKeys()メソッドを使用します.このメソッドを使用して自己増加データを取得すると、パフォーマンスが良好で、インタラクションが1回しか必要ありません.
このメソッドを使用するには、PreparedStatement解析SQL文を新規作成するときに、2番目のパラメータを入力します.
GeneratedKeysに記録されるフィールド名を記録するString配列.
コード実装:
需要:新しい部門を追加し、その部門の新入社員を追加します.
考え方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(" ");
}