[jsp] jdbc 여러 데이터 삭제하기

jdbc를 사용할때 데이터를 삭제하기 위해서 하나의 delete 쿼리를 날린다. 하지만 삭제해야하는 데이터가 여러개일 경우 데이터를 삭제하는 쿼리를 날리는 방법을 학습합니다.

jsp 여러개의 데이터 삭제하기

  • 하나의 데이터를 삭제하는 메소드를 for문으로 여러번 호출해주는 방법도 가능하다.
  • 하지만, 조금 더 jdbc영역에서 해결을 하기 위한 방법을 제시한다.
public boolean multiDelete(String[] ids) {
  DBConnection DBConnector = new MySqlConnector();

	String sql = " delete from member where id=?";

	Connection conn = null;
	PreparedStatement ptmt = null;
	int count[] = new int[ids.length];

	try {
		conn = DBConnector.makeConnection();
		// 삭제중 문제가 발생하지 않기 위해
		// auto commit 을 잠시 꺼둔다.
		conn.setAutoCommit(false);
		ptmt = conn.prepareStatement(sql);

		for(int i=0; i<ids.length; i++) {
			ptmt.setString(1, ids[i]);
			ptmt.addBatch();
		}

		count = ptmt.executeBatch();

		conn.commit();

	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		// 문제 발생시 롤백한다.
		try {
			conn.rollback();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	} finally {
		// auto commit을 다시 켜둔다.
		try {
			conn.setAutoCommit(true);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		DBConnector.close(conn, ptmt, null);
	}

	boolean result = true;

	for(int i=0; i<count.length; i++) {
		if(count[i] != -2) {
			result = false;
			break;
		}
	}

	return result;
}

설명1.

conn.setAutoCommit(false);
  • 삭제중 문제가 발생하지 않게 하기 위해 삭제 쿼리를 날리기 전 auto commit 을 잠시 꺼둔다.

설명2.

for(int i=0; i<ids.length; i++) {
  ptmt.setString(1, ids[i]);
  ptmt.addBatch();
}
  • 쿼리를 날리는 ptmt에 batch를 더한다.
    • batch일괄 처리 라는 의미를 갖는다.
    • ptmt를 일괄처리하기 위해 batch를 더한다.

설명3.

count = ptmt.executeBatch();
  • batch를 등록한 ptmt를 일괄 실행한다.
  • 리턴값으로 int[]을 받아온다.

설명4.

catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  // 문제 발생시 롤백한다.
  try {
    conn.rollback();
  } catch (SQLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
  }
}
  • Exception 이 발생한다면 지금까지 변경된 사항을 rollback 한다.

설명5.

finally {
  // auto commit을 다시 켜둔다.
  try {
    conn.setAutoCommit(true);
  } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  DBConnector.close(conn, ptmt, null);
}
  • 자동 커밋 기능을 다시 켜준다.
  • 열려있는 스트림들을 전부 close해준다.

Comments