개발자 미니민의 개발스터디

[JSP] 글 수정,삭제 Servlet 서블릿/DAO

by mini_min

JSP

[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;


}

 

✔️ 수정, 삭제 서블릿

: 수정과 삭제 기능을 위한 서블릿을 작성해야한다.

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기