[JSP] 글 수정,삭제 Servlet 서블릿/DAO
by mini_min[JSP] 글 수정,삭제 Servlet 서블릿/DAO
✔️ 글 수정, 삭제 서블릿 (DB)
: 글 수정 및 삭제를 위한 DAO 부터 작성한다.
먼저, 수정과 삭제를 하기 위해서는 특정 게시글 하나의 창에서 수정, 삭제를 해야한다. 이를 위해서 '특정 게시글 하나'를 가져와야하며 게시글을 가져오기 위해 게시글 번호를 이용한다.
📓 게시글 가져오기 (읽기- article 영역)
• SELECT 조건문으로 게시글 번호를 가지고 모든 게시글의 정보를 받아서 dto 객체에 저장한다.
public BoardDTO readBoard(long num) {
BoardDTO dto = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = " SELECT num, name, subject, content, pwd, ipAddr, hitCount, reg_date "
+ " FROM bbs"
+ " WHERE num = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, num);
rs = pstmt.executeQuery();
if(rs.next()) {
dto = new BoardDTO();
dto.setNum(rs.getLong("num"));
dto.setName(rs.getString("name"));
dto.setSubject(rs.getString("subject"));
dto.setContent(rs.getString("content"));
dto.setPwd(rs.getString("pwd"));
dto.setIpAddr(rs.getString("ipAddr"));
dto.setHitCount(rs.getInt("hitCount"));
dto.setReg_date(rs.getString("reg_date"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs!=null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
}
return dto;
}
📓 게시글 조회수 증가 DAO
: 게시글을 클릭해서 article 영역이 화면에 뜰 때 마다, 게시글 조회수가 증가되는 DAO 를 만든다.
//게시글의 조회수 증가
public void updateHitCount(long num) throws SQLException {
PreparedStatement pstmt =null;
String sql;
try {
//업데이터 데이블명 set 컬럼=값, ... where 조건
sql = " UPDATE bbs SET hitCount = hitCount + 1 WHERE num = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
}
}
✔️ 수정/삭제 DAO
: 수정과 삭제를 위한 DAO 를 작성한다.
게시글 영역인 article 에 수정 , 삭제 버튼이 있으며, 버튼을 눌렀을 때 수정과 삭제가 가능하다.
📓 수정 DAO
public void updateBoard(BoardDTO dto) throws SQLException{
PreparedStatement pstmt = null;
String sql;
try {
//이름, 패스워드, 제목, 내용 수정
sql = " UPDATE bbs SET name = ? , pwd = ? , subject = ? , content = ? "
+ " WHERE num = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getPwd());
pstmt.setString(3, dto.getSubject());
pstmt.setString(4, dto.getContent());
pstmt.setLong(5, dto.getNum());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
}
}
📓 삭제 DAO
public void deleteBoard(long num) throws SQLException{
PreparedStatement pstmt = null;
String sql;
try {
sql = " DELETE FROM bbs WHERE num = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
}
}
✔️ 이전글/다음글 DAO
: 게시글이 뜨는 article 영역에 이전글과 다음글로 넘어가는 기능을 추가할거다.
이 기능을 위해 DAO 를 각각 이전글 / 다음글 DAO 를 작성한다.
이전글/다음글 기능으로 작성되는 DAO 에서 중요한 것은, 검색 기능 까지 고려하는 것이다.
👩💻 만약, '날씨' 라는 검색어로 검색한 결과를 보고 있다면, 이전글/다음글은 '날씨'로 검색된 글들 중에서 이전글과 다음글이 나와야한다. 검색어로 들어갔는데 이전글과 다음글이 전체 게시글 중에서 뜨면 안된다.
📓 필요한 인자 (페이지 번호, 검색어, 검색조건)
- long num, String condition, String keyword
📓 이전글/다음글 반환값
: 게시글 번호와 제목
(제목은 article 영역에 띄울 것), 게시글 번호는 article 넘어갈 때 필요하다.
📓 이전글 DAO
• 검색 조건이 all 인 경우, 생년월일 검색인 경우, 기타 다른 경우 등을 고려해서 sql 문에 WHERE 조건 넣기
• 검색인 경우, WHERE 조건은 게시글 번호 num 만 받아서 sql 문을 작성한다.
public BoardDTO preReadBoard(long num, String condition, String keyword) {
BoardDTO dto = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sb = new StringBuilder();
try {
if(keyword!=null && keyword.length() != 0) {
//검색일때
sb.append(" SELECT num, subject ");
sb.append(" FROM bbs ");
sb.append(" WHERE num < ? ");
if(condition.equals("all")) {
sb.append(" AND ( INSTR(subject, ?) >= 1 OR INSTR(content, ?) >= 1 ) ");
} else if(condition.equals("reg_date")) {
keyword = keyword.replaceAll("(\\-|\\.|\\/)", "");
sb.append(" AND (TO_CHAR(reg_date, 'YYYYMMDD') = ? ) ");
} else {
sb.append(" AND (INSTR (" + condition + ", ? ) >= 1 )");
}
sb.append(" ORDER BY num DESC ");
sb.append(" FETCH FIRST 1 ROWS ONLY ");
pstmt = conn.prepareStatement(sb.toString());
pstmt.setLong(1, num);
pstmt.setString(2, keyword);
if(condition.equals("all")) {
pstmt.setString(3, keyword);
}
} else {
//검색 아닐 때
sb.append(" SELECT num, subject ");
sb.append(" FROM bbs ");
sb.append(" WHERE num < ? ");
sb.append(" ORDER BY num DESC ");
sb.append(" FETCH FIRST 1 ROWS ONLY ");
pstmt = conn.prepareStatement(sb.toString());
pstmt.setLong(1, num);
}
rs = pstmt.executeQuery();
if(rs.next()) {
dto = new BoardDTO();
dto.setNum(rs.getLong("num"));
dto.setSubject(rs.getString("subject"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs!=null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
}
return dto;
}
📓 다음글 DAO (이전글 DAO 와 부등호만 다르다)
• 검색 조건이 all 인 경우, 생년월일 검색인 경우, 기타 다른 경우 등을 고려해서 sql 문에 WHERE 조건 넣기
• 검색인 경우, WHERE 조건은 게시글 번호 num 만 받아서 sql 문을 작성한다.
public BoardDTO nextReadBoard(long num, String condition, String keyword) {
BoardDTO dto = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sb = new StringBuilder();
try {
if(keyword!=null && keyword.length() != 0) {
//검색일때
sb.append(" SELECT num, subject ");
sb.append(" FROM bbs ");
sb.append(" WHERE num > ? ");
if(condition.equals("all")) {
sb.append(" AND ( INSTR(subject, ?) >= 1 OR INSTR(content, ?) >= 1 ) ");
} else if(condition.equals("reg_date")) {
keyword = keyword.replaceAll("(\\-|\\.|\\/)", "");
sb.append(" AND (TO_CHAR(reg_date, 'YYYYMMDD') = ? ) ");
} else {
sb.append(" AND (INSTR (" + condition + ", ? ) >= 1 )");
}
sb.append(" ORDER BY num ASC ");
sb.append(" FETCH FIRST 1 ROWS ONLY ");
pstmt = conn.prepareStatement(sb.toString());
pstmt.setLong(1, num);
pstmt.setString(2, keyword);
if(condition.equals("all")) {
pstmt.setString(3, keyword);
}
} else {
//검색 아닐 때
sb.append(" SELECT num, subject ");
sb.append(" FROM bbs ");
sb.append(" WHERE num > ? ");
sb.append(" ORDER BY num ASC ");
sb.append(" FETCH FIRST 1 ROWS ONLY ");
pstmt = conn.prepareStatement(sb.toString());
pstmt.setLong(1, num);
}
rs = pstmt.executeQuery();
if(rs.next()) {
dto = new BoardDTO();
dto.setNum(rs.getLong("num"));
dto.setSubject(rs.getString("subject"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs!=null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
}
return dto;
}
✔️ 수정, 삭제 서블릿
: 수정과 삭제 기능을 위한 서블릿을 작성해야한다.
'JSP' 카테고리의 다른 글
[JSP] 세션 Session 설정하기 지우기 (0) | 2022.10.10 |
---|---|
[JSP] 쿠키 설정 / 가져오기 (Cookie) (0) | 2022.10.10 |
[JSP] 글 리스트 Servlet 서블릿/DAO (1) | 2022.10.05 |
[JSP] Servlet 서블릿 작성 + 글쓰기 Servlet 서블릿/DAO (0) | 2022.10.05 |
[JSP] Servlet 서블릿 게시판 만들기 (개요) (0) | 2022.10.05 |
블로그의 정보
개발자 미니민의 개발로그
mini_min