java of educational by contents

[참고] Java + MyBATIS 3.4.1 + MySQL 5.6의 연동 및 JAR 배포

yoni-1117 2018. 12. 16. 16:35

[01] MyBATIS 3.4.1 개론 
     - SQL과 비즈니스 로직(자바)이 분리되어 있어 개발 및 배포 및 관리가
       뛰어납니다. 

     - 자바 개발시 SQL이 DAO class에 포함되어 있으면 SQL을 추출하여 테스트가
       어렵고 SQL이 변경되는 경우 관련 자바 코드를 변경해야하는 단점이 있으나
       MyBATIS를 이용하면 자바와 DBMS의 연결을 XML을 이용하여 분리함으로
       독립적인 팀 개발이 가능하며 개발 시간을 단축 할 수 있습니다.

     - 일반 SQL뿐만 아니라 저장 프로시져까지 MyBATIS는 처리할 수 있습니다.
       . Stored procedure도 SQL을 JAVA에서 분리하나 데이터베이스 종속적으로
         DBMS를 변경하면 재사용할 수 없고 MySQL 용으로 다시 프로시저를
         제작해야합니다. 

     - 파라미터와 제어문을 이용하여 동적으로 실행 할 SQL을 지정할 수 있습니다. 


1. 실행 아키텍쳐

                             

                                                                                  
                          SqlMapConfig 
                                 ↓ 
                          SQL Map 파일 
                                 ↓ 
입력 ----------> SQL Mapping 구문 ----> MyBATIS 실행 ----> 출력 
Hashtable                   XML                      ↓                   Hashtable  
POJO                                                  DBMS                POJO(VO(DTO), ArrayList...) 
원시 타입                                            MySQL               원시 타입(int, double...)
                                                        MariaDB
                                                         Oracle
  
  
2. 다운 로드 및 설치(Spring을 사용하지 않는 경우, JSP Model 1 기반) 
    - iBATIS 2.0은 MyBATIS 2와 같습니다.
    - iBATIS 3.0부터는 MyBATIS 3로 변경되고 Annotation 기반으로
      문법이 일부 변경됨. 
    - 전자정부 프레임웍 및 대부분의 기업은 MyBATIS를 사용합니다. 
    - http://www.mybatis.org
    - download: https://github.com/mybatis/mybatis-3/releases 
    - Maven 저장소를 이용한 빠른 다운로드: https://mvnrepository.com/artifact/org.mybatis/mybatis 
    
   
    
3. 프로젝트 생성

Project Type: java project 
         name: movieMybatis
     package: movie
  
  
4. VO(DTO)

▷ /src/movie/MovieVO.java
-------------------------------------------------------------------------------------
package movie;
 
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, -- 등록 날짜
 */
  private int movieno;
  private String title;
  private double good;
  private String name;
  private String rdate;
  
  public MovieVO() {
    
  }
 
  public MovieVO(int movieno, String title, double good, String name, String rdate) {
    this.movieno = movieno;
    this.title = title;
    this.good = good;
    this.name = name;
    this.rdate = rdate;
  }
  
  // getter
  public int getMovieno() {
    return movieno;
  }
  
  // setter
  public void setMovieno(int movieno) {
    this.movieno = movieno;
  }
 
  public String getTitle() {
    return title;
  }
 
  public void setTitle(String title) {
    this.title = title;
  }
 
  public double getGood() {
    return good;
  }
 
  public void setGood(double good) {
    this.good = good;
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public String getRdate() {
    return rdate;
  }
 
  public void setRdate(String rdate) {
    this.rdate = rdate;
  }
    
}
  
  
-------------------------------------------------------------------------------------


5. Mybatis
1) Mapper 환경 설정

▷ /src/mybatis_config.xml
-------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <typeAliases>
    <typeAlias type="movie.MovieVO" alias="MovieVO"/>  <!-- package 생략 사용 가능 -->
  </typeAliases>
 
  <environments default="development"> <!-- 개발모드 설정으로 기본값 -->
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED"> <!-- Connection pool 지원 -->
        <property name="driver" value="org.gjt.mm.mysql.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>
 
  <mappers>
    <mapper resource="movie/movie.xml"/>
  </mappers>
</configuration>
 



<property name="url" value="jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr"/>
여기에 &는 xml이 인식을 못해서 ;으로 바꿔줘야함
 
-------------------------------------------------------------------------------------
   
2) 각각의 테이블 환경 설정 

▷ /src/movie/movie.xml
-------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="movie">
 
</mapper>
 
 

-------------------------------------------------------------------------------------
 
 
6. DAO

▷ /src/movie/MovieDAO.java
-------------------------------------------------------------------------------------
package movie;
 
import java.io.IOException;
import java.io.Reader;
import java.util.List;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class MovieDAO {
  private SqlSessionFactory factory;
  
  public MovieDAO() {
    try {
      Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); // bin
      factory = new SqlSessionFactoryBuilder().build(reader);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 
  /**
   * 등록
   * @param title 영화명
   * @param good 평점
   * @param name 주연
   */
  public int create(MovieVO movieVO) { // Call By Reference
    int cnt = 0;
    SqlSession sqlSession = factory.openSession();
 
    sqlSession.commit();
    sqlSession.close();
    
    return cnt;
  }
  
  /**
   * 목록
   */
  public List<MovieVO> list() {
    List<MovieVO> list = null;
    
    SqlSession sqlSession = factory.openSession();
 
    sqlSession.commit();
    sqlSession.close();
    
    return list;
  }
  
  /**
   * 조회
   * @param movieno 조회할 번호
   */
  public MovieVO read(int movieno) {
    MovieVO movieVO = new MovieVO();
    
    SqlSession sqlSession = factory.openSession();
 
    sqlSession.commit();
    sqlSession.close();
    
    return movieVO;
  }
  
  /**
   * 수정
   * @param movieno 영화번호
   * @param title 영화명
   * @param good 평점
   * @param name 주연
   */
  public int update(MovieVO movieVO) {
    int cnt = 0;
    SqlSession sqlSession = factory.openSession();
 
    sqlSession.commit();
    sqlSession.close();
    
    return cnt;
  }
 
  /**
   * 삭제
   * @param movieno 영화번호
   */
  public int delete(int movieno) {
    int cnt = 0;
    SqlSession sqlSession = factory.openSession();
 
    sqlSession.commit();
    sqlSession.close();
    
    return cnt;
  }
  
}
 
 
-------------------------------------------------------------------------------------
 
 
7. Process

▷ /src/movie/MovieProcess.java
-------------------------------------------------------------------------------------
package movie;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MoveAction;
 
public class MovieProc {
  MovieDAO movieDAO = null;
  Scanner in = null;
  
  public MovieProc() {
    movieDAO = new MovieDAO();
    in = new Scanner(System.in);
 
  }
  
  public void menu() {
    int menu = 0; // 지역 변수
    
    while(true) {
      System.out.println();
      System.out.println("Movie chart(Mybatis ver 4.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() {
    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();
    
    // movieDAO.create(title, good, name);
    MovieVO movieVO = new MovieVO();
    // movieVO.setMovieno(movieno);
    movieVO.setTitle(title);
    movieVO.setGood(good);
    // movieVO.setRdate(rdate);
    movieVO.setName(name);
    
    movieDAO.create(movieVO);
    
  }
  
  public void list() {
    List<MovieVO> list = movieDAO.list();
    int count = list.size(); // 레코드 갯수 산출
    
    for (int i=0; i < count; i++) {
      MovieVO movieVO = list.get(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());
    
    MovieVO movieVO = movieDAO.read(movieno);
    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 update() {
    // 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();
    
    // movieDAO.update(movieno, title, good, name);
    MovieVO movieVO = new MovieVO();
    movieVO.setMovieno(movieno);
    movieVO.setTitle(title);
    movieVO.setGood(good);
    // movieVO.setRdate(rdate);
    movieVO.setName(name);
    
    movieDAO.update(movieVO);
    
  }
  
  public void delete() {
    int movieno = 0;
    
    System.out.print("삭제할 영화번호: ");
    movieno = Integer.parseInt(in.nextLine());
    
    movieDAO.delete(movieno);
    
  }
  
}
   
 
-------------------------------------------------------------------------------------
 

8. Main class
- 실행 방법

C:
CD\
CD 201812_java\ws_java\movieMybatis\bin
java -cp %CLASSPATH%;C:/201812_java/mysql-connector.jar;C:/201812_java/mybatis-3.4.1.jar movie.MovieProcUse
  
- JAR 실행
java -jar movieMybatis.jar

   
▷ /src/movie/MovieProcessUse.java
-------------------------------------------------------------------------------------
package movie;
 
public class MovieProcUse {
 
  public static void main(String[] args) {
    MovieProc movieProc = new MovieProc();
    movieProc.menu();
 
  }
 
}
 
 

-------------------------------------------------------------------------------------