yoni

[43][JDBC] JCF, VO(DTO) 기반 영화 정보 시스템 제작 ★ 본문

java of educational by contents

[43][JDBC] JCF, VO(DTO) 기반 영화 정보 시스템 제작 ★

yoni-1117 2018. 12. 28. 11:07
[01] JCF, VO(DTO) 기반 영화 정보 시스템 제작
- java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
  Eclipse는 MySQL 드라이버가 연동이되어있어 에러가 발생하지 않았으나,
  콘솔(Dos)에서의 실행은 인식이안됨으로 Driver를 실행시 명시해야합니다.

- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
  MySQL Daemon(Service)을 시작하지 않았습니다. mysqld.exe 실행
 

- 실행: java -cp %CLASSPATH%;C:/201812_java/mysql-connector.jar jdbc2.MovieProcUse
  
1. SQL
- 테이블명: movie
- 논리적 모델링 속성: 영화번호, 제목, 평점, 출연, 등록 날짜
- 물리적 모델링 컬럼: movieno(PK), title, good, name, rdate
- 목록
  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
  ───────────────────────────────
  .....
 
▷ /src/jdbc2/movie.sql
-------------------------------------------------------------------------------------
기존 파일 사용  
-------------------------------------------------------------------------------------
    
    
2. VO(DTO)
- VO: Value Object, 값 객체
- DTO: Data Transfer Object, 데이터 전송 객체
- 테이블 컬럼을 변수로 선언, 테이블 컬럼이 아닌 변수도 선언 가능
 
▷ jdbc2.MovieVO.java
-------------------------------------------------------------------------------------
package jdbc2;
 
public class MovieVO {
/*
  movieno INT                NOT NULL AUTO_INCREMENT, -- 영화 번호
  title       VARCHAR(100) NOT NULL, -- 영화 제목(연도)
  good     FLOAT             NOT NULL, -- 평점
  name    VARCHAR(30)    NOT NULL,-- 출연
  rdate    DATETIME         NOT NULL, -- 등록 날짜
 */
  
  
  
}
 
 
 
 
------------------------------------------------------------------------------------- 
  
  
3. DAO
 
▷ jdbc2.MovieDAO.java
-------------------------------------------------------------------------------------
package jdbc2;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
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 int 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(" "); 
      
      pstmt = con.prepareStatement(sql.toString()); // SQL 실행 객체 생성
      pstmt.setString(1,     );
      pstmt.setDouble(2,     );
      pstmt.setString(3,      );
      
      count = pstmt.executeUpdate(); // INSERT, UPDATE, DELETE SQL 실행
      
    } 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){ }
    }
    
    return count;
  }
 
  public ArrayList<MovieVO> list() {
    ArrayList<MovieVO> list =    .....   
    
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
      sql.append(" SELECT movieno, title, good, name, rdate");      
      sql.append(" FROM movie"); 
      sql.append(" ORDER BY movieno DESC"); 
      
      pstmt = con.prepareStatement(sql.toString()); // SQL 실행 객체 생성
      rs = pstmt.executeQuery(); // SELECT
 
      // true일 경우 순환, 레코드가 있는지 검사
      // next() 최초 호출시는 첫번째 레코드로 이동
      // next() 두번째 호출부터 다음 레코드로 이동하여 마지막 레코드까지 이동
      while(rs.next()) {
        .....
 
        
        list.add(movieVO);
      }
 
    } 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){ }
    }
    
    return list;
  }
  
  /**
   * 조회
   * @param movieno 조회할 번호
   */
  public MovieVO read(int movieno) {
    MovieVO movieVO = null;
    
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
      sql.append(" SELECT movieno, title, good, name, rdate");      
      sql.append(" FROM movie"); 
      sql.append(" "); 
      
      pstmt = con.prepareStatement(sql.toString()); // SQL 실행 객체 생성
      pstmt.setInt(1, movieno);
      rs = pstmt.executeQuery(); // SELECT
 
      // true일 경우 실행, 레코드가 있는지 검사
      // next() 최초 호출시는 첫번째 레코드로 이동
      // next() 두번째 호출부터 다음 레코드로 이동하여 마지막 레코드까지 이동
      if (rs.next()) {
 
 
      } 
 
    } 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){ }
    }
    
    return .....;
  }
  
  /**
   * 수정
   */
  public int update(   .....   ) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
      sql.append(" UPDATE movie");      
      sql.append(" "); 
      sql.append(" ");
      
      pstmt = con.prepareStatement(sql.toString()); // SQL 실행 객체 생성
      pstmt.setString(1, );
      pstmt.setDouble(2, );
      pstmt.setString(3,  );
      pstmt.setInt(4, );
            
      count = pstmt.executeUpdate(); // INSERT, UPDATE, DELETE SQL 실행
      
    } 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){ }
    }
    
    return count;
  }
 
  /**
   * 삭제
   * @param movieno 영화번호
   */
  public int delete(int movieno) {
    try {
      Class.forName(className); // 문자열로된 클래스명을 메모리에 상주, 객체 생성 안함.
      con = DriverManager.getConnection(url, user, password); // DBMS에 연결
      sql = new StringBuffer();
      sql.append(" DELETE FROM movie");      
      sql.append(" ");
      
      pstmt = con.prepareStatement(sql.toString()); // SQL 실행 객체 생성
      pstmt.setInt(1, );
            
      count = pstmt.executeUpdate(); // INSERT, UPDATE, DELETE SQL 실행
      
    } 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){ }
    }
    
    return count;
  }
  
}
 
  
------------------------------------------------------------------------------------- 
   
  

4. Process
 
▷ jdbc2.MovieProc.java
-------------------------------------------------------------------------------------
package jdbc2;
 
import java.util.ArrayList;
import java.util.Scanner;
 
public class MovieProc {
  MovieDAO movieDAO = null;
  Scanner in = null;
  
  public MovieProc() {
    this.movieDAO = new MovieDAO();
    this.in = new Scanner(System.in);
  }
  
  public void menu() {
    int menu = 0; // 지역 변수
    
    while(true) {
      System.out.println();
      System.out.println("Movie chart(ver 2.0)");
      System.out.println("──────────");
      System.out.println("      1. 등록");
      System.out.println("      2. 목록");
      System.out.println("      3. 조회");
      System.out.println("      4. 수정");
      System.out.println("      5. 삭제");
      System.out.println("      9. 종료");
      System.out.println("──────────");
      System.out.print("메뉴 입력: ");
      menu = Integer.parseInt(in.nextLine()); // 번호 입력
      System.out.println();
      
      if (menu == 1) {
        create();
      } else if (menu == 2) {
        list();
      } else if (menu == 3) {
        read();
      } else if (menu == 4) {
        update();   
      } else if (menu == 5) {
        delete();              
      } else if (menu == 9) {
        System.out.println("즐거운 하루되세요~~");
        System.exit(0);
      }
    }
  }
  
  public void create() {
    // public void create(String title, double good, String name) {
    String title = "";
    double good = 0.0;
    String name = "";
    
    System.out.print("제목: " );
    title = in.nextLine();
    
    System.out.print("추천(0.0 ~ 10.0): ");
    good = Double.parseDouble(in.nextLine());
    
    System.out.print("주연: ");
    name = in.nextLine();
    
    .....
    
    int count = this.movieDAO.create(.....);
    
    if (count == 1) {
      System.out.println("등록 처리 성공");
    } else {
      System.out.println("등록 처리 실패");
    }
  }
  
  public void list() {
    .....
    int count = list.size(); 
    
    for (int i=0; i < count; i++) {
      .....
      
      System.out.print(movieVO.getMovieno() + ". ");
      System.out.print(movieVO.getTitle() + ": ");
      System.out.print(movieVO.getName());
      System.out.print("(" + movieVO.getGood() +") ");
      System.out.print(movieVO.getRdate().substring(0,  10));
      System.out.println();
      System.out.println("───────────────────────────────");
 
    }
    
    
  }
  
  public void read() {
    System.out.print("조회할 번호: ");
    int movieno = Integer.parseInt(in.nextLine());
    
    .....
    
    if (movieVO != null) {
      System.out.print(movieVO.getMovieno() + ". ");
      System.out.print(movieVO.getTitle() + ": ");
      System.out.print(movieVO.getName());
      System.out.print("(" + movieVO.getGood() +") ");
      System.out.print(movieVO.getRdate().substring(0,  10));
      System.out.println();
    } else {
      System.out.println("등록된 영화가 없습니다.");
    }
  }
  
  public void update() {
    int movieno = 0;
    String title = "";
    double good = 0.0;
    String name = "";
    
    System.out.print("영화번호: ");
    movieno = Integer.parseInt(in.nextLine());
    
    System.out.print("제목: " );
    title = in.nextLine();
    
    System.out.print("추천(0.0 ~ 10.0): ");
    good = Double.parseDouble(in.nextLine());
    
    System.out.print("주연: ");
    name = in.nextLine();
    
    .....
    
    int count = .....
    
    if (count == 1) {
      System.out.println("수정 처리 성공");
    } else {
      System.out.println("수정 처리 실패");
    }
  }
  
  public void delete() {
    int movieno = 0;
    
    System.out.print("삭제할 영화번호: ");
    movieno = Integer.parseInt(in.nextLine());
    
    int count = this.movieDAO.delete(movieno);
    
    if (count == 1) {
      System.out.println("삭제 처리 성공");
    } else {
      System.out.println("삭제 처리 실패");
    }
    
  }
  
}
 
 
------------------------------------------------------------------------------------- 
 
 
5. DAO 사용
▷ jdbc2.MovieProcUse.java 
-------------------------------------------------------------------------------------
package jdbc2;
 
public class MovieProcUse {
 
  public static void main(String[] args) {
    .....
 
  }
 
}
 
 
 
-------------------------------------------------------------------------------------
 


Comments