Back Ground

게시판 만들기 - DAO 본문

JSP/게시판 만들기

게시판 만들기 - DAO

Back 2016. 6. 15. 22:27

package pdh.DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import util.DBManager;

public class BoardDAO {
    //기본 생성자
    private BoardDAO(){}
   
    //싱글톤
    private static BoardDAO instance= new BoardDAO();
    public static BoardDAO getInstance(){
        return instance;
    }
   
    //=======================================================================List 모든 컬럼 보여주기
    public List<BoardVO> selectAllBoards(){
        String sql = "select * from boardtest1 order by num desc";
        List<BoardVO> list = new ArrayList<BoardVO>();   
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
       
        try{
          /*conn- Mysql연결 
            stmt- sql연결
            rs-저장*/
            conn = DBManager.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
           

            while(rs.next()){
               
                //BoardVO 인스턴스가 밖에 있으면 저장된 가장 처음부분만 불러와서
                //sql문 첫번째 컬럼만 나오게 된다.
                BoardVO bVo = new BoardVO();
               
               
                 //ResultSet에 SQL이 저장 되있는데 getInt | getString으로 불러 온다.
                bVo.setNum(rs.getInt("num"));
                bVo.setName(rs.getString("name"));
                bVo.setEmail(rs.getString("email"));
                bVo.setPass(rs.getString("pass"));
                bVo.setTitle(rs.getString("title"));
                bVo.setContent(rs.getString("content"));
                bVo.setReadcount(rs.getInt("readcount"));
                bVo.setWritedate(rs.getTimestamp("writedate"));
           
                list.add(bVo); //list에 bVo 값들을 추가한다.
            }// next로 더 이상 읽을게 없을때까지 반복
            
        }catch(Exception e){e.printStackTrace();//예외상황
        }finally{
            DBManager.close(conn, stmt, rs); //사용한 conn, stmt, rs 를 닫아준다.
        }
        return list; //bVo를 반복하여 담은 값(list)를 return(돌려준다)
    }//=======================================================================selectAllBoards END



    //=======================================================================게시글 입력하기
    public void insertBoard(BoardVO bVo){
        String sql = "insert into boardtest1 ( name, email, pass, title, content,writedate) values(?,?,?,?,?,now())";
        //오라클에서 num을 증가시킬땐[SQL] create sequence board_seq(시퀀스이름) start with 1 increment by 1; 를하고
        //"insert into boardtest1 (num, name, email, pass, title, content) values(board_seq.nextval,?,?,?,?,?)"; 을 하면 된다
        //board_seq.nextval (시퀀스이름.다음값)
        //MySQL에서 writedate의 Date(날짜)값을 입력하기위해 now()를 사용한다.
       
       
        Connection conn =null; //초기화 시킨다.
        PreparedStatement pstmt = null;
        //Statement :SQL을 동작시키는데 Prepared(준비된)Statement는 ?로 값이 들어오는게 모를때 사용한다
        //Statement로 쓰는경우는 정확히 컬럼값이 주어져 있을때만 사용한다.
        try{
            conn = DBManager.getConnection();
            pstmt = conn.prepareStatement(sql);//sql의 값을 넣어 연결한다.
           
            //sql values에 ? 에 들어갈 순서 대로 BoardVO bVo로 받아온 값을 넣어준다.
            pstmt.setString(1, bVo.getName()); //(순서, 파라메타 값);
            pstmt.setString(2, bVo.getEmail());
            pstmt.setString(3, bVo.getPass());
            pstmt.setString(4, bVo.getTitle());
            pstmt.setString(5, bVo.getContent());
           
            pstmt.executeUpdate(); //SQL을 담은 PreparedStatement를 실행한다.
        }catch(Exception e){
            e.printStackTrace();
        }finally{// try | catch가 끝나고 무조건 실행
            DBManager.close(conn,pstmt);//DBManager에서 끌어다 사용한 Connection과 Statement를 종료한다.
        }
    }
    //=======================================================================insertBoard END
   
   
   
   
    //=======================================================================조회수 올리기
    public void updateReadCount(String num){
        String sql = "update boardtest1 set readcount = readcount+1 where num=?";
        //readcount를 readcount+1로 해서 +1을 증가시킨다. 조건은 num의 값 지정한것만
       
        Connection conn=null;
        PreparedStatement pstmt =null;
        try{
            conn = DBManager.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, num);
           
            pstmt.executeUpdate();
        }catch(SQLException e){//SQL에서 일어날 예외상황 처리
            e.printStackTrace();
        }finally{
            DBManager.close(conn, pstmt);
        }
    }
    //=======================================================================updateReadCount End






//=======================================================================글 내용보기
   
    //게시판 글 상세 내용 보기 : 글번호로 찾아온다. : 실패 null
    public BoardVO selectOnBoardByNum(String num){
        String sql = "select * from boardtest1 where num = ?"; //num의 값에 일치하는것의 모든 컬럼값 찾아오기
       
        //초기화 시켜준다 (전역함수로 사용)
        BoardVO bVo = null;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
       
        try{
            //conn     MySQL 연결
            //pstmt SQL연결
            //rs     SQL저장
            conn = DBManager.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, num);
            rs = pstmt.executeQuery();
            //실행 executeQuery는 select 찾을때 (sql쿼리로 값의 변동이 없을때) 사용
            //       executeUpdate는 insert into, update, delete ... 같이 쿼리로 값이 변동이 있을시 사용
           
            if(rs.next()){
                bVo = new BoardVO();
               
                bVo.setNum(rs.getInt("num"));
                bVo.setName(rs.getString("name"));
                bVo.setPass(rs.getString("pass"));
                bVo.setEmail(rs.getString("email"));
                bVo.setTitle(rs.getString("title"));
                bVo.setContent(rs.getString("content"));
                bVo.setWritedate(rs.getTimestamp("writedate"));
                bVo.setReadcount(rs.getInt("readcount"));
               
                //저장되어있는 값을 보기만 하기 위해 .add(bVo)를 할 필요가 없다.
            }
        }catch(Exception e){e.printStackTrace();
        }finally{
            DBManager.close(conn, pstmt, rs);
        }
        return bVo; //bVo의 값을 전달하기 위해 bVo를 return
    }
    //=======================================================================selectOnBoardByNum End
   
   
    //=======================================================================게시글 수정하기
    public void updateBoard(BoardVO bVo){
        String sql = "update boardtest1 set name=?, email=?, pass=?, title=?, content=? where num=?";
        //업데이트(수정) 한다 name,email,pass,title,content를 (bVo로)받아온 값을 넣어 바꾼다.
        //조건은 num의 값에 일치하는 것 만
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        try{
            conn=DBManager.getConnection();
            pstmt=conn.prepareStatement(sql);
           
            pstmt.setString(1, bVo.getName());
            pstmt.setString(2, bVo.getEmail());
            pstmt.setString(3, bVo.getPass());
            pstmt.setString(4, bVo.getTitle());
            pstmt.setString(5, bVo.getContent());
            pstmt.setInt(6, bVo.getNum());
           
            pstmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            DBManager.close(conn, pstmt);
        }
    }
    //=======================================================================updateBoard END
   
   
   
   
    //=======================================================================비밀번호 확인
    //선택한 num값(게시글 번호)의 쿼리(pass)를 받아온것이 일치할때 BoardVO 값을 뿌린다.
    public BoardVO checkPassword(String pass, String num){
        String sql = "select * from boardtest1 where pass=? and num=?";
        //모두 컬럼값을 찾는데 Password와 num이 일치하는것을 찾는다.
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        BoardVO bVo = null;
        try{
            conn = DBManager.getConnection();
            pstmt = conn.prepareStatement(sql);
           
            pstmt.setString(1, pass);
            pstmt.setString(2, num);
            //checkPassword(인자String num)가 가져온 num이라서 String 이다.
           
            rs = pstmt.executeQuery();//select 쿼리 실행한다.
           
            if(rs.next()){//next 전체를 읽을때까지
                bVo = new BoardVO();
               
                bVo.setNum(rs.getInt("num"));
                bVo.setName(rs.getString("name"));
                bVo.setEmail(rs.getString("email"));
                bVo.setPass(rs.getString("pass"));
                bVo.setTitle(rs.getString("title"));
                bVo.setContent(rs.getString("content"));
                bVo.setReadcount(rs.getInt("readcount"));
                bVo.setWritedate(rs.getTimestamp("writedate"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            DBManager.close(conn, pstmt, rs);
        }
        return bVo;//next로 읽어온 bVo값을 돌려준다.
    }
    //=======================================================================checkPassword END
   
   
   
   
   
   
    //=======================================================================게시글 삭제
    public void deleteBoard(String num){
        String sql ="delete boardtest1 where num=?";
        //delete 삭제한다 boardtest1 테이블을 조건은 num에 일치하는 값만
       
        Connection conn=null;
        PreparedStatement pstmt=null;
        try{
            conn = DBManager.getConnection();
            pstmt=conn.prepareStatement(sql);
           
            pstmt.setString(1, num);
           
            pstmt.executeUpdate();//DB의 값이 변동/삭제 되기 때문에 executeUpdate를 사용
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            DBManager.close(conn, pstmt);
        }
    }
    //=======================================================================deleteBoard END
   






}//class BoardDAO END


' JSP > 게시판 만들기' 카테고리의 다른 글

게시판 만들기 - JS 자바스크립트  (0) 2016.06.16
게시판 만들기 - VO  (0) 2016.06.15
게시판 만들기 - DBCP  (0) 2016.06.15
게시판 만들기 - DBManager  (0) 2016.06.15
게시판 만들기 - MySQL  (0) 2016.06.15
Comments