yoni

[40][JDBC] 영화 정보 시스템, 등록, 목록, 조회, 수정, 삭제, MovieDAO.java 제작 ★ 본문

java of educational by contents

[40][JDBC] 영화 정보 시스템, 등록, 목록, 조회, 수정, 삭제, MovieDAO.java 제작 ★

yoni-1117 2018. 12. 15. 18:20
[01]  DBMS 입출력처리 기능의 제작

- 실행: java -cp %CLASSPATH%;C:/201810_java/mysql-connector.jar jdbc.MovieDAOUse


1. 등록(기초 코드를 참고하여 개발합니다.)
  - Duplicate entry '1' for key 'PRIMARY'
    . PK(Primary Key) 컬럼인 newsno컬럼의 값이 중복되면 발생됨

  - 각 라인마다 SQL문 앞에는 공백이 없으면 에러 남으로 공백을 1칸을 줍니다.

  - SQL문 마지막에 ';'은 생략합니다.


  - INSERT, UPDATE, DELETE SQL 실행 메소드는 처리된 레코드의 갯수를 리턴
    count = pstmt.executeUpdate();

  - SELECT 실행 메소드는 Record 집합 리턴
    ResultSet rs = pstmt.executeQuery();


  - Connection, PreparedStatement, ResultSet 객체는 자바와 DBMS 서버 연결이
    불안정해짐으로 사용 종료시 즉시 메모리 해제를 하는 것을 권장합니다. 
    예)
    }finally{
      try{
        if (rs != null){ rs.close(); }
      }catch(Exception e){ }
 
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
 


 
[실행 화면]

처리 성공



▷ jdbc.MovieDAO.java, create() 메소드 제작
-------------------------------------------------------------------------------------
package jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
public class MovieDAO {
  Connection con = null;              // DBMS 연결
  PreparedStatement pstmt = null; // SQL 실행
  ResultSet rs = null;                   // SELECT 결과를 저장
  StringBuffer sql = null;              // SQL 문장
  int count = 0;                         // 처리된 레코드 갯수
 
  String className = "org.gjt.mm.mysql.Driver"; // MySQL 연결 Drvier 
  String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr"; 
  String user = "root"; 
  String password = "1234";
  
  public void create() {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();

      .....
 
  
      if (count == 1) {
        System.out.println("등록 처리 성공");
      } else {
        System.out.println("등록 처리 실패");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
 
  /**
   * 등록
   * @param title 영화명
   * @param good 평점
   * @param name 주연
   */
  public void create(String title, double good, String name) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
 
      .....
      
      if (count == 1) {
        System.out.println("등록 처리 성공");
      } else {
        System.out.println("등록 처리 실패");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
  
  
}
 
 ->답
package jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
public class MovieDAO {
  Connection con = null;              // DBMS 연결
  PreparedStatement pstmt = null; // SQL 실행
  ResultSet rs = null;                   // SELECT 결과를 저장
  StringBuffer sql = null;              // SQL 문장
  int count = 0;                         // 처리된 레코드 갯수
 //DB접속정보
  //javadb는 데이터베이스이다.
  String className = "org.gjt.mm.mysql.Driver"; // MySQL 연결 Drvier 
  String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr"; 
  String user = "root"; 
  String password = "1234";
  
  public void create() {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();

      sql.append(" INSERT INTO movie(title, good, name, rdate)");//맨앞줄에 한칸을 띄어야함
      sql.append(" VALUES('인터스텔라(영화, 2014)', 10.0, '앤헤서웨이', now())");
      
      pstmt = con.prepareStatement(sql.toString());//prepareStatement 이게 무슨함수냐
      count = pstmt.executeUpdate();
      
      if (count == 1) {
        System.out.println("등록 처리 성공");
      } else {
        System.out.println("등록 처리 실패");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
 
  /**
   * 등록
   * @param title 제목
   * @param good 평점
   * @param name 주연
   */
  public void create(String title, double good, String name) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
 
      sql.append(" INSERT INTO movie(title, good, name, rdate)");//맨앞줄에 한칸을 띄어야함
      sql.append(" VALUES(?, ?, ?, now())");
      
      pstmt = con.prepareStatement(sql.toString());//prepareStatement 이게 무슨함수냐
      pstmt.setString(1, title);
      pstmt.setDouble(2, good);
      pstmt.setString(3, name);
      
      count = pstmt.executeUpdate();
      
      if (count == 1) {
        System.out.println("등록 처리 성공");
      } else {
        System.out.println("등록 처리 실패");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
  
  
}
-------------------------------------------------------------------------------------
 
▷ jdbc.MovieDAOUse.java 
-------------------------------------------------------------------------------------
package jdbc;
 
public class MovieDAOUse {
 
  public static void main(String[] args) {
      .....
 
  }
 
}
 
->답
package jdbc;
 
public class MovieDAOUse {
 
  public static void main(String[] args) {
     MovieDAO movieDAO = new MovieDAO();
     //movieDAO.create();
     movieDAO.create("안시성", 10.0, "조인성");
    
 
  }
 
}
 
  
 
-------------------------------------------------------------------------------------



2. 전체 레코드 목록 출력
   - SELECT SQL 실행
     pstmt = con.prepareStatement(sql);
     rs = pstmt.executeQuery();

   - next(): 최초 호출시 첫번째 레코드로 이동,
              다음 호출부터는 자동으로 다음 레코드로 이동하여 
              마지막 레코드까지 이동합니다.
              따라서 next() 메소드의 연속 호출은 SELECT 결과의
              모든 레코드를 출력 할 수 있습니다.

 

[실행 화면]
4. 커뮤터: 리암 니슨(7.9) 2018-08-29
───────────────────────────────
3. 러브 액츄얼리(2003): 휴 그랜트(10.0) 2018-08-28
───────────────────────────────
2. 인터스텔라(미드, 2014): 앤헤서웨이(10.0) 2018-08-28
───────────────────────────────
1. 배틀스타 갤럭티카(미드, 2004): 제이미 밤버(9.9) 2018-08-28
───────────────────────────────
 

▷ jdbc.MovieDAO.java, create() 메소드를 복사하여 list() method 제작
-------------------------------------------------------------------------------------
  public void list() {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
 
      .....
 
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (rs != null){ rs.close(); }
      }catch(Exception e){ }
 
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
  
 
 
-------------------------------------------------------------------------------------
 
▷ jdbc.MovieDAOUse.java 변경 
-------------------------------------------------------------------------------------
 
    movieDAO.list();
 
-------------------------------------------------------------------------------------
  
 
3. 하나의 레코드 조회
 
[실행 화면]

1. 배틀스타 갤럭티카(미드, 2004): 제이미 밤버(9.9) 2018-08-28
───────────────────────────────
  
 
▷ jdbc.MovieDAO.java, list() 메소드를 복사하여 read() method 제작
-------------------------------------------------------------------------------------

  /**
   * 조회
   * @param movieno 조회할 번호
   */
  public void read(int movieno) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
 
      .....
 
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (rs != null){ rs.close(); }
      }catch(Exception e){ }
      
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
 
   
-------------------------------------------------------------------------------------
 
▷ jdbc.MovieDAOUse.java 변경 
-------------------------------------------------------------------------------------
.....
 
 
-------------------------------------------------------------------------------------
 
 
4. 레코드를 수정하는 소스

[실행 화면]

처리 성공

▷ jdbc.MovieDAO.java, create() 메소드를 복사하여 update() method 제작
-------------------------------------------------------------------------------------
  /**
   * 수정
   * @param movieno 영화번호
   * @param title 영화명
   * @param good 평점
   * @param name 주연
   */
  public void update(   .....   ) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
 
      .....
      
      if (count == 1) {
        System.out.println("수정 처리 성공");
      } else {
        System.out.println("수정 처리 실패");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
 
 
 
-------------------------------------------------------------------------------------
 
▷ jdbc.MovieDAOUse.java 변경 
-------------------------------------------------------------------------------------
.....
 
 
 
-------------------------------------------------------------------------------------
 
  
5. 레코드를 삭제하는 소스
   - int cnt = pstmt.executeUpdate(); 

▷ jdbc.MovieDAO.java, update() 메소드를 복사하여 delete() method 제작
-------------------------------------------------------------------------------------
  /**
   * 삭제
   * @param movieno 영화번호
   */
  public void delete(int movieno) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
 
      .....
      
      if (count == 1) {
        System.out.println("삭제 처리 성공");
      } else {
        System.out.println("삭제 처리 실패");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }finally{
      try{
        if (pstmt != null){ pstmt.close(); }
      }catch(Exception e){ }
 
      try{
        if (con != null){ con.close(); }
      }catch(Exception e){ }
    }
  }
   
 
-------------------------------------------------------------------------------------
 
▷ jdbc.MovieDAOUse.java 변경 
-------------------------------------------------------------------------------------
 
.....
 
 
-------------------------------------------------------------------------------------
 


Comments