본문 바로가기
java

22.12.05 java & DB(Oracle) 연동_6

by SoulMania 2023. 2. 20.

221205.zip
0.01MB
설명.txt
0.07MB

package db.ex2; //변수선언->입력->작업->출력

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//DB연결을 위한 클래스이다.
//JDBC Driver등록, 연결 Connection 얻기, 자원반납 기능을 제공
public class JdbcUtil {

//field --굳이 객체 생성하지 않아도 사용 및 접근이 가능하도록 static을 붙여준다.
static String url = "jdbc:oracle:thin:@127.0.0.1:1521/xe";
static String user = "scott";
static String password = "tiger";


//constructor //해당 클래스에 메소드들이 모두 static 으로 선언이 되어있어서 다른 클래스에서 JdbcUtil.메소드명하면 다 끌어다 쓸수 있지만. 만약에 static이 없다면 
                //해당클래스 참조변수 = new 해당클래스() 이런식으로 인스턴스화 시켜서 불러 써야한다. 이럴경우 메소드 형태보다는 매개변수 생성자 형태로 만들어놓으면 더 편하다.

//method
//1. JDBC Driver등록 & 2. 연결 Connection 얻기
//트라이캐치문 지우고 메인메소드명에 static붙이고 connection conn=null;을 메인 메소드 안으로 가져온다.
//한마디로 타라이 캐치 문으로 넣든지 아니면 메소드 전체에 static으로 선언하든
public static Connection getConnection() {
    Connection conn=null;
    try {
        Class.forName("oracle.jdbc.OracleDriver");
        System.out.println("1. JDBC Driver등록-성공");
    } catch (ClassNotFoundException e) {
        System.out.println("ClassNotFoundException발생 e="+e);
        e.printStackTrace();
    }

    //2.연결 Connection얻기
    //DriverManager.getConnection(연결DB서버url, 접속user명, 비밀번호)
    try {
        conn=DriverManager.getConnection(url, user, password);
        System.out.println("2. Connection얻기-성공");
    } catch (SQLException e) {
        System.out.println("SQLException발생");
        e.printStackTrace();
    }

    return conn;  //--> 메소드 명에 리턴타입을 Connection으로 명시 하였으므로 리턴값을 줘야한다.

}

//5. 자원반납  
//Statement 객체 또는 PreparedStatement 객체
public static void close(Statement pstmt) {
    try {
        if(pstmt!=null) {
        pstmt.close();    
        }
        System.out.println("pstmt 자원반납 진행");
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

//5. 자원반납  
//ResultSet 객체
public static void close(ResultSet rs) {
    try {
        if(rs!=null) {
        rs.close();    
        }
        System.out.println("rs 자원반납 진행");
    } catch (SQLException e) {
        e.printStackTrace();
    }

}




//접속종료 
public static void close(Connection conn) {
    try {
        if(conn!=null) {
        conn.close();    
        }    
        System.out.println("conn 자원반납 진행");
    } catch (SQLException e) {
        e.printStackTrace();
    }

    }

}


package db.ex2;

import java.util.Scanner;

//메인클래스

~

!
//web에서는 불필요한 부분

public class Main {

public static void main(String[] args) {
    NoticeBoardDAO ntBoardDAO = new NoticeBoardDAO();//DAO객체 생성
    Scanner sc = new Scanner(System.in);
    while(true){
        System.out.println();
        System.out.println();
        System.out.println("----------------------------------------------------");
        System.out.println("| 1.목록조회 | 2.상세조회 | 3.등록 | 4.수정 | 5.삭제 | 6.종료 |");
        System.out.println("----------------------------------------------------");
        System.out.print("위 리스트 중에 원하는 메뉴번호를 입력하세요. : ");
        int num = sc.nextInt(); //Scans the next token of the in

        if(num==1) {//1. 목록조회
            ntBoardDAO.getNoticeList();
        }else if(num==2) {//2. 상세조회
            System.out.print("조회할 글번호:");
            int nbno = sc.nextInt(); //user로부터 글번호를 입력받아 nbno변수에 저장
            ntBoardDAO.getNotice(nbno);
        }else if(num==3) {//3. 등록
            System.out.println("등록정보를 입력하세요.");
            System.out.println("제목 : ");
            String title = sc.next();
            System.out.println("내용 : ");
            String centent = sc.next();
            System.out.println("작성자 : ");
            String writer = sc.next();

// ntBoardDAO.addNotice(title, centent, writer);
boolean insertResult = ntBoardDAO.addNotice(title, centent, writer); //리턴타입이 있는 형태의 메소드로 변경해줄수 있다 !! boolean
System.out.println("insertResult = "+insertResult);

        }else if(num==4) {//4. 수정
            System.out.println("수정할 정보를 입력하세요.");
            System.out.println("수정할 글번호 : ");
            int nbno = sc.nextInt();
            System.out.println("제목 : ");
            String title = sc.next();
            System.out.println("내용 : ");
            String centent = sc.next();
            System.out.println("작성자 : ");
            String writer = sc.next();
            int resultRowCnt = ntBoardDAO.updateNotice( nbno, title, centent, writer);
            System.out.println("resultRowCnt = "+resultRowCnt);

        }else if(num==5) {//5. 삭제
            System.out.print("삭제할 글번호:");
            int nbno = sc.nextInt(); //user로부터 글번호를 입력받아 nbno변수에 저장
            int resultRowCnt = ntBoardDAO.delNotice(nbno);
            System.out.println("resultRowCnt = "+resultRowCnt);
        }else if(num==6) {//6. 종료
            break; //반복문 while 종료
        }else {
            System.out.println("기타-잘못된 번호");
        }
    }//while 문 종료6
    System.out.println("종료합니다.!!!");




    //db연결테스트

// Connection conn = JdbcUtil.getConnection();
// 클래스명 참조변수 = new 클래스명();
// 참조변수.메소드();

    //전체목록 조회

// JdbcUtil.close(conn);

}

}


package db.ex2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

//DAO:Data Access Object. db 연동
//DAO란 DB연동하여 DB작업을 제공하는 클래스이다.
//이 클래스는 Board관련 DB작업을 제공하는 클래스이다.
public class NoticeBoardDAO {
//field

//constructor


//method

// 목록조회 : get

List, select

,
// 상세조회 : get

, ~info, ~Detail
// 입력 : insert

, add

, register

, regi~
// 수정 : update

, modify

, modi

, change;
// 삭제 : delete

, del

, remove

//1.목록조회 -->    public 게시글목록 getNoticeList() {
public void getNoticeList() {
    System.out.println("getNoticeList()진입");
    PreparedStatement pstmt = null;
    Connection conn = null;
    ResultSet rs = null;

    String sql =     "select nbno, title, cre_date, writer " + 
                    "from notice " + 
                    "order by nbno desc";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 
        System.out.println("3. getNoticeList() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.

    //4.실행
        System.out.println("4. getNoticeList() 실행");
        while(rs.next()) {
            int nbno = rs.getInt(1);
            String title = rs.getString(2);
            Date cre_date = rs.getDate(3);
            String writer = rs.getString(4); 
            System.out.println("----------------------------------------");
            System.out.printf("| %5d | %5s | %5s | %5s | \r\n----------------------------------------\r\n", nbno, title, cre_date, writer);

// System.out.println(" ");//줄바꿈
}//while문 끝
//System.out.println("4.쿼리실행결과 리턴받은 row수="+resultCnt);

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. getNoticeList() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);
    JdbcUtil.close(rs);
    JdbcUtil.close(conn);

}//getNoticeList() 끝

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//2.상세조회   -->public 게시글 getNotice(매개변수리스트) {
public void getNotice(int nbno) {//int nbno는 글번호
    System.out.println("getNotice()진입 nbno="+nbno);
    PreparedStatement pstmt = null;
    Connection conn = null;
    ResultSet rs = null;


    String sql =     "select nbno, title, centent, cre_date, writer, rcnt, empno " + 
                    "from notice " + 
                    "where nbno = ?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 
        System.out.println("3. getNoticeList() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, nbno);
        rs = pstmt.executeQuery(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.

    //4.실행
        System.out.println("4. getNoticeList() 실행");
        if(rs.next()) {
            int no = rs.getInt(1);
            String title = rs.getString(2);
            String centent = rs.getString(3);
            Date cre_date = rs.getDate(4);
            String writer = rs.getString(5); 
            int rcnt = rs.getInt(6); 
            int empno = rs.getInt(7);  
            System.out.println("------------------------------------------------------------------");
            System.out.printf("| %5d | %5s | %5s | %5s | %5s | %5d | %5d | \r\n------------------------------------------------------------------\r\n", no, title, centent, cre_date, writer, rcnt, empno);
    //        System.out.println("              ");//줄바꿈
        }else {//조회한 사번인 사원이 존재하지않을 경우
            System.out.println("조회한 사번("+nbno+")인 사원이 존재하지 않아요"); 
            }

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. getNoticeList() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);
    JdbcUtil.close(rs);
    JdbcUtil.close(conn);
}//getNotice() 끝

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//3.등록 - title 제목, centent 내용, 작성자명 writer
//리턴값 - 입력성공시 true, 실패시 false
public boolean addNotice(String title, String centent, String writer) {
    System.out.printf("addNotice()진입 title:%s, centent:%s, writer:%s\r\n", title, centent, writer);
    PreparedStatement pstmt = null;
    Connection conn = null;

// ResultSet rs = null;
boolean result = false;

    String sql =     "insert into notice(nbno, title, centent, cre_date, writer, rcnt, empno) " + 
                    "values(notice_seq.nextval, ?, ?, SYSDATE, ?, 0,7900)";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. addNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, title);
        pstmt.setString(2, centent);
        pstmt.setString(3, writer);
        int resultcnt = pstmt.executeUpdate(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        System.out.println("리턴되는 행수");
        if(resultcnt==1) {
            System.out.println("입력성공");
            result=true;
        }else {
            System.out.println("입력실패");
            result=false;
        }



    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. addNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return result;
}

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//4.수정  - 글번호 nbno, title 제목, centent 내용, 작성자명 writer
public int updateNotice(int nbno, String title, String centent, String writer) {
    System.out.printf("updateNotice()진입  nbno:%d, title:%s, centent:%s, writer:%s\r\n", nbno, title, centent, writer);
    PreparedStatement pstmt = null;
    Connection conn = null;
    int resultcnt = 0;

// ResultSet rs = null;

    String sql =     "update notice set title=?, centent=?, writer=? " + 
                    "where nbno=?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. updateNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, title);
        pstmt.setString(2, centent);
        pstmt.setString(3, writer);
        pstmt.setInt(4, nbno);
        resultcnt = pstmt.executeUpdate(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        if(resultcnt>=1) {
            System.out.println("수정성공");
        }else {
            System.out.println("수정실패");
        }





    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. updateNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return resultcnt;
}

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//5.삭제 - nbno 글번호
/*리턴유형 int - delete 실행시 리턴되는 행수*/
public int delNotice(int nbno) {
    System.out.println("delNotice()진입 nbno="+nbno);
    PreparedStatement pstmt = null;
    Connection conn = null;
    int resultcnt = 0;//delete실행시 리턴되는 행수를 저장하기위한변수선언 및 초기화

// ResultSet rs = null;

    String sql =     "delete from notice where nbno=?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. delNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, nbno);
        resultcnt = pstmt.executeUpdate();
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        //여기에서는 삭제성공하면 1리턴
        //여기에서는 삭제실패하면 0리턴
        if(resultcnt>=1) {
            System.out.println("삭제성공");
        }else {
            System.out.println("삭제실패");
        }

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. delNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return resultcnt;

}

}


package db.ex3; //변수선언->입력->작업->출력

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//DB연결을 위한 클래스이다.
//JDBC Driver등록, 연결 Connection 얻기, 자원반납 기능을 제공
public class JdbcUtil {

//field --굳이 객체 생성하지 않아도 사용 및 접근이 가능하도록 static을 붙여준다.
static String url = "jdbc:oracle:thin:@127.0.0.1:1521/xe";
static String user = "scott";
static String password = "tiger";


//constructor //해당 클래스에 메소드들이 모두 static 으로 선언이 되어있어서 다른 클래스에서 JdbcUtil.메소드명하면 다 끌어다 쓸수 있지만. 만약에 static이 없다면 
                //해당클래스 참조변수 = new 해당클래스() 이런식으로 인스턴스화 시켜서 불러 써야한다. 이럴경우 메소드 형태보다는 매개변수 생성자 형태로 만들어놓으면 더 편하다.

//method
//1. JDBC Driver등록 & 2. 연결 Connection 얻기
//트라이캐치문 지우고 메인메소드명에 static붙이고 connection conn=null;을 메인 메소드 안으로 가져온다.
//한마디로 타라이 캐치 문으로 넣든지 아니면 메소드 전체에 static으로 선언하든
public static Connection getConnection() {
    Connection conn=null;
    try {
        Class.forName("oracle.jdbc.OracleDriver");
        System.out.println("1. JDBC Driver등록-성공");
    } catch (ClassNotFoundException e) {
        System.out.println("ClassNotFoundException발생 e="+e);
        e.printStackTrace();
    }

    //2.연결 Connection얻기
    //DriverManager.getConnection(연결DB서버url, 접속user명, 비밀번호)
    try {
        conn=DriverManager.getConnection(url, user, password);
        System.out.println("2. Connection얻기-성공");
    } catch (SQLException e) {
        System.out.println("SQLException발생");
        e.printStackTrace();
    }

    return conn;  //--> 메소드 명에 리턴타입을 Connection으로 명시 하였으므로 리턴값을 줘야한다.

}

//5. 자원반납  
//Statement 객체 또는 PreparedStatement 객체
public static void close(Statement pstmt) {
    try {
        if(pstmt!=null) {
        pstmt.close();    
        }
        System.out.println("pstmt 자원반납 진행");
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

//5. 자원반납  
//ResultSet 객체
public static void close(ResultSet rs) {
    try {
        if(rs!=null) {
        rs.close();    
        }
        System.out.println("rs 자원반납 진행");
    } catch (SQLException e) {
        e.printStackTrace();
    }

}




//접속종료 
public static void close(Connection conn) {
    try {
        if(conn!=null) {
        conn.close();    
        }    
        System.out.println("conn 자원반납 진행");
    } catch (SQLException e) {
        e.printStackTrace();
    }

    }

}


package db.ex3;

import java.util.Scanner;

//메인클래스

~

!
//web에서는 불필요한 부분

public class Main {

public static void main(String[] args) {
    NoticeBoardDAO ntBoardDAO = new NoticeBoardDAO();//DAO객체 생성
    Scanner sc = new Scanner(System.in);
    while(true){
        System.out.println();
        System.out.println();
        System.out.println("----------------------------------------------------");
        System.out.println("| 1.목록조회 | 2.상세조회 | 3.등록 | 4.수정 | 5.삭제 | 6.종료 |");
        System.out.println("----------------------------------------------------");
        System.out.print("위 리스트 중에 원하는 메뉴번호를 입력하세요. : ");
        int num = sc.nextInt(); //Scans the next token of the in

        if(num==1) {//1. 목록조회
            ntBoardDAO.getNoticeList();
        }else if(num==2) {//2. 상세조회
            System.out.print("조회할 글번호:");
            int nbno = sc.nextInt(); //user로부터 글번호를 입력받아 nbno변수에 저장

            //매개변수에 NoticeBoardDTO클래스의 객체주소를 넘겨준다.
            NoticeBoardDTO nbDTO = new NoticeBoardDTO(nbno);
            ntBoardDAO.getNotice(nbDTO);

// ntBoardDAO.getNotice(nbno);

        }else if(num==3) {//3. 등록
            System.out.println("등록정보를 입력하세요.");
            System.out.println("제목 : ");
            String title = sc.next();
            System.out.println("내용 : ");
            String centent = sc.next();
            System.out.println("작성자 : ");
            String writer = sc.next();

// ntBoardDAO.addNotice(title, centent, writer);
// boolean insertResult = ntBoardDAO.addNotice(title, centent, writer); //리턴타입이 있는 형태의 메소드로 변경해줄수 있다 !! boolean
// System.out.println("insertResult = "+insertResult);

            //NoticeBoardDTO타입의 객체를 생성해서 제시하자
            NoticeBoardDTO nbDTOobj= new NoticeBoardDTO();
            //user로부터 입력받은 제목, 내용 작성자를 
            //NoticeBoardDTO의  Setter를 호출하여 설정한 후
            nbDTOobj.setTitle(title);
            nbDTOobj.setCentent(centent);
            nbDTOobj.setWriter(writer);   
            //매개변수가 없는 기본 생성자를 사용하였기 때문에 기본적으로 DTO에 있는 필드값들은 null로 초기화 되었고 title은 Not null 값이기 때문에 에러가 난다.
            //그래서 메인에서 입력받은 값을 setter로 받아서 처리해야한다.

            //ntBoardDAO.addnotice()를 호출하면서 넘기자                
            boolean insertResult = ntBoardDAO.addNotice(nbDTOobj);
            System.out.println("updateNotice() 실행결과 = "+insertResult);


        }else if(num==4) {//4. 수정
            System.out.println("수정할 정보를 입력하세요.");
            System.out.println("수정할 글번호 : ");
            int nbno = sc.nextInt();
            System.out.println("제목 : ");
            String title = sc.next();
            System.out.println("내용 : ");
            String centent = sc.next();
            System.out.println("작성자 : ");
            String writer = sc.next();

            //외부에서 클래스명 참조변수 = new 클래스명();
            NoticeBoardDTO nbDTOobj= new NoticeBoardDTO();

            //필드값을 설정해서 ntBoardDAO의 updateNotice()호출시 넘긴다.
            nbDTOobj.setTitle(title);
            nbDTOobj.setCentent(centent);
            nbDTOobj.setWriter(writer);
            nbDTOobj.setNbno(nbno); 

            int resultRowCnt = ntBoardDAO.updateNotice(nbDTOobj);
            //업데이트 성공하면 true리턴 , 업데이트 실패하면 false리턴
            System.out.println("resultRowCnt = "+resultRowCnt);



        }else if(num==5) {//5. 삭제
            System.out.print("삭제할 글번호:");
            int nbno = sc.nextInt(); //user로부터 글번호를 입력받아 nbno변수에 저장
            //delNotice() 호출시 NoticeBoardDTO클래스 타입의 객체주소를 넘겨야한다.
            //객체생성 클래스명 참조변수=new 클래스명(int 글번호);
            //객체생성 NoticeBoardDTO 참조변수 = new NoticeBoardDTO(nbno);
            NoticeBoardDTO nbDTO = new NoticeBoardDTO(nbno);
            int resultRowCnt = ntBoardDAO.delNotice(nbDTO);

// int resultRowCnt = ntBoardDAO.delNotice(nbno);
System.out.println("resultRowCnt = "+resultRowCnt);
}else if(num==6) {//6. 종료
break; //반복문 while 종료
}else {
System.out.println("기타-잘못된 번호");
}
}//while 문 종료6
System.out.println("종료합니다.!!!");

    //db연결테스트

// Connection conn = JdbcUtil.getConnection();
// 클래스명 참조변수 = new 클래스명();
// 참조변수.메소드();

    //전체목록 조회

// JdbcUtil.close(conn);

}

}


package db.ex3;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

//DAO:Data Access Object. db 연동
//DAO란 DB연동하여 DB작업을 제공하는 클래스이다.
//이 클래스는 Board관련 DB작업을 제공하는 클래스이다.

//이 클래스에서는 매개변수로 NoticeBoardDTO를 사용하는 예시....
public class NoticeBoardDAO {
//field

//constructor


//method

// 목록조회 : get

List, select

,
// 상세조회 : get

, ~info, ~Detail
// 입력 : insert

, add

, register

, regi~
// 수정 : update

, modify

, modi

, change;
// 삭제 : delete

, del

, remove

//1.목록조회 -->    public 게시글목록 getNoticeList() {
public void getNoticeList() {
    System.out.println("getNoticeList()진입");
    PreparedStatement pstmt = null;
    Connection conn = null;
    ResultSet rs = null;

    String sql =     "select nbno, title, cre_date, writer " + 
                    "from notice " + 
                    "order by nbno desc";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 
        System.out.println("3. getNoticeList() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.

    //4.실행
        System.out.println("4. getNoticeList() 실행");
        while(rs.next()) {
            int nbno = rs.getInt(1);
            String title = rs.getString(2);
            Date cre_date = rs.getDate(3);
            String writer = rs.getString(4); 
            System.out.println("----------------------------------------");
            System.out.printf("| %5d | %5s | %5s | %5s | \r\n----------------------------------------\r\n", nbno, title, cre_date, writer);

// System.out.println(" ");//줄바꿈
}//while문 끝
//System.out.println("4.쿼리실행결과 리턴받은 row수="+resultCnt);

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. getNoticeList() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);
    JdbcUtil.close(rs);
    JdbcUtil.close(conn);

}//getNoticeList() 끝

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//2.상세조회   -->public 게시글 getNotice(매개변수리스트) {
public void getNotice(NoticeBoardDTO nbDTO) {//int nbno는 글번호
    System.out.println("getNotice()진입 nbno="+nbDTO); //주소찍힌다.
    System.out.println("getNotice()진입 nbno="+nbDTO.getNbno());
    PreparedStatement pstmt = null;
    Connection conn = null;
    ResultSet rs = null;


    String sql =     "select nbno, title, centent, cre_date, writer, rcnt, empno " + 
                    "from notice " + 
                    "where nbno = ?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 
        System.out.println("3. getNoticeList() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        //매개변수 nbDTO에는 NoticeBoardDTO 클래스의 객체주소가 저장되어있다.
        //nbDTO.getNbno():저장된 주소를 통해 getNono()메소드를 호출한다.
        /*pstmt.setInt(1, nbDTO.getNbno()):호출된 int타입의 값을 여기에서는 글번호를 가져와 1번째 ?의값으로 설정한다.*/
        pstmt.setInt(1, nbDTO.getNbno());
        rs = pstmt.executeQuery(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.

    //4.실행
        System.out.println("4. getNoticeList() 실행");
        if(rs.next()) {
            int no = rs.getInt(1);
            String title = rs.getString(2);
            String centent = rs.getString(3);
            Date cre_date = rs.getDate(4);
            String writer = rs.getString(5); 
            int rcnt = rs.getInt(6); 
            int empno = rs.getInt(7);  
            System.out.println("------------------------------------------------------------------");
            System.out.printf("| %5d | %5s | %5s | %5s | %5s | %5d | %5d | \r\n------------------------------------------------------------------\r\n", no, title, centent, cre_date, writer, rcnt, empno);
    //        System.out.println("              ");//줄바꿈
        }else {//조회한 사번인 사원이 존재하지않을 경우
            System.out.println("조회한 사번("+nbDTO.getNbno()+")인 사원이 존재하지 않아요"); 
            }

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. getNoticeList() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);
    JdbcUtil.close(rs);
    JdbcUtil.close(conn);
}//getNotice() 끝

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//3.등록 - title 제목, centent 내용, 작성자명 writer
//리턴값 - 입력성공시 true, 실패시 false
//매개변수 - NoticeBoardDTO ntDTO에는 주소가 저장되면주소가 출력되고
//주소가 저장되어있지 않으면 NULL이 출력된다.
public boolean addNotice(NoticeBoardDTO ntDTO) {

// public boolean addNotice(String title, String centent, String writer) {
// System.out.printf("addNotice()진입 title:%s, centent:%s, writer:%s\r\n", title, centent, writer);

    //주소가 저장되어있지 않으면 NULL출력
    System.out.println("addNotice() ntdTO = "+ntDTO);//주소출력
    System.out.printf("addNotice()진입 title:%s, centent:%s, writer:%s\r\n", 
                        ntDTO.getTitle(), ntDTO.getCentent(), ntDTO.getWriter());

    PreparedStatement pstmt = null;
    Connection conn = null;

// ResultSet rs = null;
boolean result = false;

    String sql =     "insert into notice(nbno, title, centent, cre_date, writer, rcnt, empno) " + 
                    "values(notice_seq.nextval, ?, ?, SYSDATE, ?, 0,7900)";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. addNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, ntDTO.getTitle());
        pstmt.setString(2, ntDTO.getCentent());
        pstmt.setString(3, ntDTO.getWriter());
        int resultcnt = pstmt.executeUpdate(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        System.out.println("리턴되는 행수");
        if(resultcnt==1) {
            System.out.println("입력성공");
            result=true;
        }else {
            System.out.println("입력실패");
            result=false;
        }



    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. addNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return result;
}

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//4.수정  - 글번호 nbno, title 제목, centent 내용, 작성자명 writer

// public int updateNotice(int nbno, String title, String centent, String writer) {

//매개변수 ntDTO에는 NoticeBoardDTO의 주소 또는 NULL저장
public int updateNotice(NoticeBoardDTO ntDTO) {

// System.out.printf("updateNotice()진입 nbno:%d, title:%s, centent:%s, writer:%s\r\n", nbno, title, centent, writer);

    //주소가 저장되어있지 않으면 NULL출력
    System.out.println("updateNotice() ntDTO = "+ntDTO);//주소출력
    System.out.printf("updateNotice()진입 nbno:%d, title:%s, centent:%s, writer:%s\r\n", 
                        ntDTO.getNbno(), ntDTO.getTitle(), ntDTO.getCentent(), ntDTO.getWriter());


    PreparedStatement pstmt = null;
    Connection conn = null;
    int resultcnt = 0;

// ResultSet rs = null;

    String sql =     "update notice set title=?, centent=?, writer=? " + 
                    "where nbno=?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. updateNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, ntDTO.getTitle());
        pstmt.setString(2, ntDTO.getCentent());
        pstmt.setString(3, ntDTO.getWriter());
        pstmt.setInt(4, ntDTO.getNbno());
        resultcnt = pstmt.executeUpdate(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        if(resultcnt>=1) {
            System.out.println("수정성공");
        }else {
            System.out.println("수정실패");
        }





    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. updateNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return resultcnt;
}

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//5.삭제 - nbno 글번호
/*리턴유형 int - delete 실행시 리턴되는 행수*/
public int delNotice(NoticeBoardDTO ntDTO) {
//public int delNotice(int nbno) {
    //참조변수 ntDTO에는 주소가 저장되었다.
    System.out.println("delNotice()진입 참조변수ntDTO="+ntDTO); //주소출력
    System.out.println("delNotice()진입 참조변수ntDTO="+ntDTO.getNbno()); //글번호 출력

// System.out.println("delNotice()진입 nbno="+nbno);
PreparedStatement pstmt = null;
Connection conn = null;
int resultcnt = 0;//delete실행시 리턴되는 행수를 저장하기위한변수선언 및 초기화
// ResultSet rs = null;

    String sql =     "delete from notice where nbno=?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. delNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, ntDTO.getNbno()); //1번째 ?에 글번호
        resultcnt = pstmt.executeUpdate();
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        //여기에서는 삭제성공하면 1리턴
        //여기에서는 삭제실패하면 0리턴
        if(resultcnt>=1) {
            System.out.println("삭제성공");
        }else {
            System.out.println("삭제실패");
        }

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. delNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return resultcnt;

}

}


package db.ex3;

import java.util.Date;

/*

  • DTO(Data Transfer Object)
    • 순수하게 데이터를 담아 계층 간으로 전달하는 객체이다.
    • 로직을 갖고 있지 않은 순수한 데이터 객체이며 메서드로는 getter/setter 만을 갖는다.
    • 여기서 getter/setter 이외에 다른 로직이 필요 없는 이유를 좀 더 자세히 살펴보자면,
      만약 DTO가 데이터 전달 만을 위한 객체라고 한다면
      완전히 데이터 '전달' 용도로만 사용하기 때문에
      getter/setter로직만이 필요하지 다른 로직이 필요하지 않은 것이다.
  • */

//이 클래스는 DB의 noticeBoard테이블의 데이터를 저장, 제공하는 역할을 하는 DTO클래스이다.
public class NoticeBoardDTO {

//field : 변수 초기화 및 전역변수 설정, 데이터 저장
//[접제][제] 데이터타입  필드명[=초기값]
//초기값을 생략하면 데이터타입별로 자동초기화 된다.
//(정수 = 0, 실수 = 0.0, boolean = false, char = 공백
    //-->프리미티브타입 
//배열,클래스, : null(힙영역안에 참조주소가 있는 타입)  
    //--> 레퍼런스타입

private int nbno = 0;            //글번호
private String title = null;    //제목
private String centent = null;    //내용
private Date cre_date = null;    //작성일
private String writer = null;    //작성자
private int rcnt = 0;            //조회수
private int empno = 0;            //사원번호(여기에서는 공지사항게시판을 관리하는 사원번호)




//constructor
    //[접제][제] 클래스명 (매개변수){}
    //외부에서 클래스명 참조변수 = new 클래스명();
    NoticeBoardDTO(){}//default constructor

    //외부에서 클래스명 참조변수 = new 클래스명(글번호);        
    NoticeBoardDTO(int nbno){
        this.nbno = nbno;
    }

    //외부에서 클래스명 참조변수 = new 클래스명(글번호, ~,~,~,~,~, 사번){};
    NoticeBoardDTO(int nbno, String title, String centent, Date cre_date, String writer, int rcnt, int empno){
        this.nbno = nbno;
        this.title = title;
        this.centent = centent;
        this.cre_date = cre_date;
        this.writer = writer;
        this.rcnt = rcnt;
        this.empno = empno;
    }



//getter setter는 ch07챕터에 machine01 클래스나 student01 클래스에 사용했던 방법이 잘 나와있다 .
    //생성자 이용해서 초기에 객체 생성시에 입력값을 세팅할 수도 있으나 getter setter의 메소드를 미리 선언해서 사용하면 그 이후에 값을 세팅하고 불러올 수 있다.
    //여기에서 필드 데이터를 하나하나 선언해서 메소드화하여 사용할 수도 있고 getinfo, setinfo 와 같이 한번에 세팅하고 한번에 불러올수있도록 메소드를 만들 수도 있다.


    //getter!!!
public int getNbno() {
    return nbno;
}
public String getTitle() {
    return title;
}
public String getCentent() {
    return centent;
}
public Date getCre_date() {
    return cre_date;
}
public String getWriter() {
    return writer;
}
public int getRcnt() {
    return rcnt;
}
public int getEmpno() {
    return empno;
}


//setter!!!
public void setNbno(int nbno) {
    this.nbno = nbno;
}
public void setTitle(String title) {
    this.title = title;
}
public void setCentent(String centent) {
    this.centent = centent;
}
public void setCre_date(Date cre_date) {
    this.cre_date = cre_date;
}
public void setWriter(String writer) {
    this.writer = writer;
}
public void setRcnt(int rcnt) {
    this.rcnt = rcnt;
}
public void setEmpno(int empno) {
    this.empno = empno;
}















//method
//[접제][제] 리턴유형 메소드명(매개변수){}


//getter



/*
public 리턴유형 get필드명() {
    return ~;
}

setter
public void set필드명(매개변수) {
    필드=매개변수;
}


//setter
 */

}


package db.ex4;

import java.util.Scanner;

//메인클래스

~

!
//web에서는 불필요한 부분

public class Main {

public static void main(String[] args) {
    NoticeBoardDAO ntBoardDAO = new NoticeBoardDAO();//DAO객체 생성
    Scanner sc = new Scanner(System.in);
    while(true){
        System.out.println();
        System.out.println();
        System.out.println("----------------------------------------------------");
        System.out.println("| 1.목록조회 | 2.상세조회 | 3.등록 | 4.수정 | 5.삭제 | 6.종료 |");
        System.out.println("----------------------------------------------------");
        System.out.print("위 리스트 중에 원하는 메뉴번호를 입력하세요. : ");
        int num = sc.nextInt(); //Scans the next token of the in

        if(num==1) {//1. 목록조회
            ntBoardDAO.getNoticeList();
        }else if(num==2) {//2. 상세조회
            System.out.print("조회할 글번호:");
            int nbno = sc.nextInt(); //user로부터 글번호를 입력받아 nbno변수에 저장

            //매개변수에 NoticeBoardDTO클래스의 객체주소를 넘겨준다.
            NoticeBoardDTO nbDTO = new NoticeBoardDTO(nbno); //매개변수의 주소를 넘기기 위한것

// ntBoardDAO.getNotice(nbDTO);

            //리턴유형이 NoticeBoardDTO클래스인 getNotice()호출
            NoticeBoardDTO resultNTDTO = ntBoardDAO.getNotice(nbDTO); //리턴유형을 담기위한 결과물 즉 리턴되어지는 값을 받기 위해서 선언하는것.

            //콘솔에 리턴받은 NoticeBoardDTO 객체내용을 출력
            System.out.println("리턴받은 NoticeBoardDTO = "+resultNTDTO); //주소

// "select nbno, title, centent, cre_date, writer, rcnt, empno "
// System.out.printf("| %5d | %5s | %5s | %5s | %5s | %5d | %5d | \r\n------------------------------------------------------------------\r\n", no, title, centent, cre_date, writer, rcnt, empno);
// System.out.println("--아래는 특정글번호의 상세내용이 컬럼별 한줄로 출력");
// System.out.println("--nbno컬럼값:"+resultNTDTO.getNbno());
// System.out.println("--title컬럼값:"+resultNTDTO.getTitle());
// System.out.println("--centent컬럼값:"+resultNTDTO.getCentent());
// System.out.println("--cre_date컬럼값:"+resultNTDTO.getCre_date());
// System.out.println("--writer컬럼값:"+resultNTDTO.getWriter());
// System.out.println("--rcnt컬럼값:"+resultNTDTO.getRcnt());
// System.out.println("--empno컬럼값:"+resultNTDTO.getEmpno());
// System.out.println("---------------------------------");
System.out.println("------------------------------------------------------------------");
System.out.printf("| %5d | %5s | %5s | %5s | %5s | %5d | %5d | \r\n------------------------------------------------------------------\r\n",
resultNTDTO.getNbno(), resultNTDTO.getTitle(), resultNTDTO.getCentent(), resultNTDTO.getCre_date(), resultNTDTO.getWriter(), resultNTDTO.getRcnt(), resultNTDTO.getEmpno());

        }else if(num==3) {//3. 등록
            System.out.println("등록정보를 입력하세요.");
            System.out.println("제목 : ");
            String title = sc.next();
            System.out.println("내용 : ");
            String centent = sc.next();
            System.out.println("작성자 : ");
            String writer = sc.next();

// ntBoardDAO.addNotice(title, centent, writer);
// boolean insertResult = ntBoardDAO.addNotice(title, centent, writer); //리턴타입이 있는 형태의 메소드로 변경해줄수 있다 !! boolean
// System.out.println("insertResult = "+insertResult);

            //NoticeBoardDTO타입의 객체를 생성해서 제시하자
            NoticeBoardDTO nbDTOobj= new NoticeBoardDTO();
            //user로부터 입력받은 제목, 내용 작성자를 
            //NoticeBoardDTO의  Setter를 호출하여 설정한 후
            nbDTOobj.setTitle(title);
            nbDTOobj.setCentent(centent);
            nbDTOobj.setWriter(writer);   
            //매개변수가 없는 기본 생성자를 사용하였기 때문에 기본적으로 DTO에 있는 필드값들은 null로 초기화 되었고 title은 Not null 값이기 때문에 에러가 난다.
            //그래서 메인에서 입력받은 값을 setter로 받아서 처리해야한다.

            //ntBoardDAO.addnotice()를 호출하면서 넘기자                
            boolean insertResult = ntBoardDAO.addNotice(nbDTOobj);
            System.out.println("updateNotice() 실행결과 = "+insertResult);


        }else if(num==4) {//4. 수정
            System.out.println("수정할 정보를 입력하세요.");
            System.out.println("수정할 글번호 : ");
            int nbno = sc.nextInt();
            System.out.println("제목 : ");
            String title = sc.next();
            System.out.println("내용 : ");
            String centent = sc.next();
            System.out.println("작성자 : ");
            String writer = sc.next();

            //외부에서 클래스명 참조변수 = new 클래스명();
            NoticeBoardDTO nbDTOobj= new NoticeBoardDTO();

            //필드값을 설정해서 ntBoardDAO의 updateNotice()호출시 넘긴다.
            nbDTOobj.setTitle(title);
            nbDTOobj.setCentent(centent);
            nbDTOobj.setWriter(writer);
            nbDTOobj.setNbno(nbno); 

            int resultRowCnt = ntBoardDAO.updateNotice(nbDTOobj);
            //업데이트 성공하면 true리턴 , 업데이트 실패하면 false리턴
            System.out.println("resultRowCnt = "+resultRowCnt);



        }else if(num==5) {//5. 삭제
            System.out.print("삭제할 글번호:");
            int nbno = sc.nextInt(); //user로부터 글번호를 입력받아 nbno변수에 저장
            //delNotice() 호출시 NoticeBoardDTO클래스 타입의 객체주소를 넘겨야한다.
            //객체생성 클래스명 참조변수=new 클래스명(int 글번호);
            //객체생성 NoticeBoardDTO 참조변수 = new NoticeBoardDTO(nbno);
            NoticeBoardDTO nbDTO = new NoticeBoardDTO(nbno);
            int resultRowCnt = ntBoardDAO.delNotice(nbDTO);

// int resultRowCnt = ntBoardDAO.delNotice(nbno);
System.out.println("resultRowCnt = "+resultRowCnt);
}else if(num==6) {//6. 종료
break; //반복문 while 종료
}else {
System.out.println("기타-잘못된 번호");
}
}//while 문 종료6
System.out.println("종료합니다.!!!");

    //db연결테스트

// Connection conn = JdbcUtil.getConnection();
// 클래스명 참조변수 = new 클래스명();
// 참조변수.메소드();

    //전체목록 조회

// JdbcUtil.close(conn);

}

}


package db.ex4;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

//DAO:Data Access Object. db 연동
//DAO란 DB연동하여 DB작업을 제공하는 클래스이다.
//이 클래스는 Board관련 DB작업을 제공하는 클래스이다.

//이 클래스에서는 매개변수로 NoticeBoardDTO를 사용+
// 리턴유형을 NoticeBoardDTO로 지정
public class NoticeBoardDAO {
//field

//constructor


//method

//1.목록조회 -->    public 게시글목록 getNoticeList() {
public void getNoticeList() {
    System.out.println("getNoticeList()진입");
    PreparedStatement pstmt = null;
    Connection conn = null;
    ResultSet rs = null;

    String sql =     "select nbno, title, cre_date, writer " + 
                    "from notice " + 
                    "order by nbno desc";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 
        System.out.println("3. getNoticeList() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.

    //4.실행
        System.out.println("4. getNoticeList() 실행");
        while(rs.next()) {
            int nbno = rs.getInt(1);
            String title = rs.getString(2);
            Date cre_date = rs.getDate(3);
            String writer = rs.getString(4); 
            System.out.println("----------------------------------------");
            System.out.printf("| %5d | %5s | %5s | %5s | \r\n----------------------------------------\r\n", nbno, title, cre_date, writer);

// System.out.println(" ");//줄바꿈
}//while문 끝
//System.out.println("4.쿼리실행결과 리턴받은 row수="+resultCnt);

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. getNoticeList() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);
    JdbcUtil.close(rs);
    JdbcUtil.close(conn);

}//getNoticeList() 끝

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//2.상세조회   -->public 게시글 getNotice(매개변수리스트) {
//리턴유형이 NoticeBoardDTO클래스

// public void getNotice(NoticeBoardDTO nbDTO) {//int nbno는 글번호
public NoticeBoardDTO getNotice(NoticeBoardDTO nbDTO) {//int nbno는 글번호
System.out.println("getNotice()진입 nbno="+nbDTO); //주소찍힌다.
System.out.println("getNotice()진입 nbno="+nbDTO.getNbno());
PreparedStatement pstmt = null;
Connection conn = null;
ResultSet rs = null;
NoticeBoardDTO ntDTOobj = null;
//select결과로 받은 컬럼의 값들을 NoticeBoardDTO()객체로 만들기 위해 선언한 변수 및 초기화

    String sql =     "select nbno, title, centent, cre_date, writer, rcnt, empno " + 
                    "from notice " + 
                    "where nbno = ?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 
        System.out.println("3. getNoticeList() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        //매개변수 nbDTO에는 NoticeBoardDTO 클래스의 객체주소가 저장되어있다.
        //nbDTO.getNbno():저장된 주소를 통해 getNono()메소드를 호출한다.
        /*pstmt.setInt(1, nbDTO.getNbno()):호출된 int타입의 값을 여기에서는 글번호를 가져와 1번째 ?의값으로 설정한다.*/
        pstmt.setInt(1, nbDTO.getNbno());
        rs = pstmt.executeQuery(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.

    //4.실행
        System.out.println("4. getNoticeList() 실행");
        if(rs.next()) {//select 결과로 record가 존재할 경우

            int no = rs.getInt(1);
            String title = rs.getString(2);
            String centent = rs.getString(3);
            Date cre_date = rs.getDate(4);
            String writer = rs.getString(5); 
            int rcnt = rs.getInt(6); 
            int empno = rs.getInt(7);  
            ntDTOobj =    new NoticeBoardDTO(no, title, centent, cre_date, writer, rcnt, empno);

            //이제 리턴유형을 NoticeBoardDTO로 선언하고 그 값을 객체로 만들었으니 메인에서 뿌리면 되서 아래 프린트문은 필요없다!!

// System.out.println("------------------------------------------------------------------");
// System.out.printf("| %5d | %5s | %5s | %5s | %5s | %5d | %5d | \r\n------------------------------------------------------------------\r\n", no, title, centent, cre_date, writer, rcnt, empno);
// System.out.println(" ");//줄바꿈
}else {//select 결과로 record가 존재하지않을 경우
System.out.println("조회한 글번호"+nbDTO.getNbno()+"에 해당하는 글이 존재하지 않아요");
}

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. getNoticeList() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);
    JdbcUtil.close(rs);
    JdbcUtil.close(conn);



    return ntDTOobj;

}//getNotice() 끝

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//3.등록 - title 제목, centent 내용, 작성자명 writer
//리턴값 - 입력성공시 true, 실패시 false
//매개변수 - NoticeBoardDTO ntDTO에는 주소가 저장되면주소가 출력되고
//주소가 저장되어있지 않으면 NULL이 출력된다.
public boolean addNotice(NoticeBoardDTO ntDTO) {

// public boolean addNotice(String title, String centent, String writer) {
// System.out.printf("addNotice()진입 title:%s, centent:%s, writer:%s\r\n", title, centent, writer);

    //주소가 저장되어있지 않으면 NULL출력
    System.out.println("addNotice() ntdTO = "+ntDTO);//주소출력
    System.out.printf("addNotice()진입 title:%s, centent:%s, writer:%s\r\n", 
                        ntDTO.getTitle(), ntDTO.getCentent(), ntDTO.getWriter());

    PreparedStatement pstmt = null;
    Connection conn = null;

// ResultSet rs = null;
boolean result = false;

    String sql =     "insert into notice(nbno, title, centent, cre_date, writer, rcnt, empno) " + 
                    "values(notice_seq.nextval, ?, ?, SYSDATE, ?, 0,7900)";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. addNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, ntDTO.getTitle());
        pstmt.setString(2, ntDTO.getCentent());
        pstmt.setString(3, ntDTO.getWriter());
        int resultcnt = pstmt.executeUpdate(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        System.out.println("리턴되는 행수");
        if(resultcnt==1) {
            System.out.println("입력성공");
            result=true;
        }else {
            System.out.println("입력실패");
            result=false;
        }



    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. addNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return result;
}

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//4.수정  - 글번호 nbno, title 제목, centent 내용, 작성자명 writer

// public int updateNotice(int nbno, String title, String centent, String writer) {

//매개변수 ntDTO에는 NoticeBoardDTO의 주소 또는 NULL저장
public int updateNotice(NoticeBoardDTO ntDTO) {

// System.out.printf("updateNotice()진입 nbno:%d, title:%s, centent:%s, writer:%s\r\n", nbno, title, centent, writer);

    //주소가 저장되어있지 않으면 NULL출력
    System.out.println("updateNotice() ntDTO = "+ntDTO);//주소출력
    System.out.printf("updateNotice()진입 nbno:%d, title:%s, centent:%s, writer:%s\r\n", 
                        ntDTO.getNbno(), ntDTO.getTitle(), ntDTO.getCentent(), ntDTO.getWriter());


    PreparedStatement pstmt = null;
    Connection conn = null;
    int resultcnt = 0;

// ResultSet rs = null;

    String sql =     "update notice set title=?, centent=?, writer=? " + 
                    "where nbno=?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. updateNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, ntDTO.getTitle());
        pstmt.setString(2, ntDTO.getCentent());
        pstmt.setString(3, ntDTO.getWriter());
        pstmt.setInt(4, ntDTO.getNbno());
        resultcnt = pstmt.executeUpdate(); //--> 위에서 이미 sql을 매개변수로 받아서 처리 하였으므로 매개변수 없는 것으로 처리한다.
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        if(resultcnt>=1) {
            System.out.println("수정성공");
        }else {
            System.out.println("수정실패");
        }





    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. updateNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return resultcnt;
}

// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================
// ======================================================================================================================

//5.삭제 - nbno 글번호
/*리턴유형 int - delete 실행시 리턴되는 행수*/
public int delNotice(NoticeBoardDTO ntDTO) {
//public int delNotice(int nbno) {
    //참조변수 ntDTO에는 주소가 저장되었다.
    System.out.println("delNotice()진입 참조변수ntDTO="+ntDTO); //주소출력
    System.out.println("delNotice()진입 참조변수ntDTO="+ntDTO.getNbno()); //글번호 출력

// System.out.println("delNotice()진입 nbno="+nbno);
PreparedStatement pstmt = null;
Connection conn = null;
int resultcnt = 0;//delete실행시 리턴되는 행수를 저장하기위한변수선언 및 초기화
// ResultSet rs = null;

    String sql =     "delete from notice where nbno=?";

    //1. 드라이버등록 --> 2. 커넥션 얻기 --> 3. 객체준비 --> 4. 실행 --> 5. 반납
    conn = JdbcUtil.getConnection();//1.드라이버등록 및 2.커넥션 얻기

    //3.객체준비 & 4.실행
        System.out.println("3. delNotice() 객체 준비");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, ntDTO.getNbno()); //1번째 ?에 글번호
        resultcnt = pstmt.executeUpdate();
        System.out.println("4.쿼리실행결과 리턴받은 row수="+resultcnt);
        //여기에서는 삭제성공하면 1리턴
        //여기에서는 삭제실패하면 0리턴
        if(resultcnt>=1) {
            System.out.println("삭제성공");
        }else {
            System.out.println("삭제실패");
        }

    } catch (SQLException e) {
        e.printStackTrace();
    } 

    //5.반납
    System.out.println("5. delNotice() 메소드 자원반납 진행");
    JdbcUtil.close(pstmt);

// JdbcUtil.close(rs);
JdbcUtil.close(conn);

    return resultcnt;

}

}


package db.ex4;

import java.util.Date;

/*

  • DTO(Data Transfer Object)
    • 순수하게 데이터를 담아 계층 간으로 전달하는 객체이다.
    • 로직을 갖고 있지 않은 순수한 데이터 객체이며 메서드로는 getter/setter 만을 갖는다.
    • 여기서 getter/setter 이외에 다른 로직이 필요 없는 이유를 좀 더 자세히 살펴보자면,
      만약 DTO가 데이터 전달 만을 위한 객체라고 한다면
      완전히 데이터 '전달' 용도로만 사용하기 때문에
      getter/setter로직만이 필요하지 다른 로직이 필요하지 않은 것이다.
  • */

//이 클래스는 DB의 noticeBoard테이블의 데이터를 저장, 제공하는 역할을 하는 DTO클래스이다.
public class NoticeBoardDTO {

//field : 변수 초기화 및 전역변수 설정, 데이터 저장
//[접제][제] 데이터타입  필드명[=초기값]
//초기값을 생략하면 데이터타입별로 자동초기화 된다.
//(정수 = 0, 실수 = 0.0, boolean = false, char = 공백
    //-->프리미티브타입 
//배열,클래스, : null(힙영역안에 참조주소가 있는 타입)  
    //--> 레퍼런스타입

private int nbno = 0;            //글번호
private String title = null;    //제목
private String centent = null;    //내용
private Date cre_date = null;    //작성일
private String writer = null;    //작성자
private int rcnt = 0;            //조회수
private int empno = 0;            //사원번호(여기에서는 공지사항게시판을 관리하는 사원번호)




//constructor
    //[접제][제] 클래스명 (매개변수){}
    //외부에서 클래스명 참조변수 = new 클래스명();
    public NoticeBoardDTO(){}//default constructor

    //외부에서 클래스명 참조변수 = new 클래스명(글번호);        
    public NoticeBoardDTO(int nbno){
        this.nbno = nbno;
    }

    //외부에서 클래스명 참조변수 = new 클래스명(글번호, ~,~,~,~,~, 사번){};
    public NoticeBoardDTO(int nbno, String title, String centent, Date cre_date, String writer, int rcnt, int empno){
        this.nbno = nbno;
        this.title = title;
        this.centent = centent;
        this.cre_date = cre_date;
        this.writer = writer;
        this.rcnt = rcnt;
        this.empno = empno;
    }



//getter setter는 ch07챕터에 machine01 클래스나 student01 클래스에 사용했던 방법이 잘 나와있다 .
    //생성자 이용해서 초기에 객체 생성시에 입력값을 세팅할 수도 있으나 getter setter의 메소드를 미리 선언해서 사용하면 그 이후에 값을 세팅하고 불러올 수 있다.
    //여기에서 필드 데이터를 하나하나 선언해서 메소드화하여 사용할 수도 있고 getinfo, setinfo 와 같이 한번에 세팅하고 한번에 불러올수있도록 메소드를 만들 수도 있다.


    //getter!!!
public int getNbno() {
    return nbno;
}
public String getTitle() {
    return title;
}
public String getCentent() {
    return centent;
}
public Date getCre_date() {
    return cre_date;
}
public String getWriter() {
    return writer;
}
public int getRcnt() {
    return rcnt;
}
public int getEmpno() {
    return empno;
}


//setter!!!
public void setNbno(int nbno) {
    this.nbno = nbno;
}
public void setTitle(String title) {
    this.title = title;
}
public void setCentent(String centent) {
    this.centent = centent;
}
public void setCre_date(Date cre_date) {
    this.cre_date = cre_date;
}
public void setWriter(String writer) {
    this.writer = writer;
}
public void setRcnt(int rcnt) {
    this.rcnt = rcnt;
}
public void setEmpno(int empno) {
    this.empno = empno;
}















//method
//[접제][제] 리턴유형 메소드명(매개변수){}


//getter



/*
public 리턴유형 get필드명() {
    return ~;
}

setter
public void set필드명(매개변수) {
    필드=매개변수;
}


//setter
 */

}