2015년 8월 3일 월요일

신입SW인력을 위한 실전 자바(Java) 스프링(Spring) 동영상과정 28~30 Mybatis

이 게시물은
http://www.wiz.center/258
http://www.wiz.center/259
http://www.wiz.center/260

해당 링크를 청취하고 작성한 글입니다.

본인 이해도 확인을 위해서 작성한 것이니
스프링에 대해서 알고 있다면 쑥 훝어보고 끝내시고

좀 깊게 알고 싶다면 위의 링크부터 시작해서
총 30개 강의로 이루어진 스프링 과정을 청취하세요


1. Mybatis 사용 준비(기본 설정)
    Java에서 작성한 쿼리부분을 XML로 대체하여 간단하게 사용
    하고자 하여 만들어진 라이브러리

예제1) 강의안에 주어진 예제를 mysql 용으로 만들기

작성1 예제에는 이미 설정되어 있지만 Mybatis를 사용하려면
         해당 jar 파일을 추가해야 된다.
         pom.xml에 다음 내용이 있는지확인 및 추가

  
   org.mybatis
   mybatis
   3.2.8
  
  
   org.mybatis
   mybatis-spring
   1.2.2
  


작성 2. 예제 작성을 위해 28-1 예제를 import 및
          board 라는 테이블을 생성

CREATE TABLE IF NOT EXISTS `board` (
  `mId` int(11) NOT NULL AUTO_INCREMENT,
  `mWriter` varchar(100) NOT NULL,
  `mContent` varchar(300) NOT NULL,
  PRIMARY KEY (`mId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


작성 3. pom.xml 에 mysql_connection 플러그인 추가



 mysql
 mysql-connector-java
 5.1.31



작성 4. web.xml 의 db connection 을 아래와 같이 변경


  
  
  
  
 

 
  
 


작성 5. insert 쿼리 변경

 @Override
 public void writeDao(final String mWriter, final String mContent) {
  System.out.println("writeDao()");
  this.template.update(new PreparedStatementCreator() {
   @Override
   public PreparedStatement createPreparedStatement(Connection con)
     throws SQLException {
//    String query = "insert into board (mId, mWriter, mContent) values (board_seq.nextval, ?, ?)";
    String query = "insert into board (mWriter, mContent) values (?, ?)";
    PreparedStatement pstmt = con.prepareStatement(query);
    pstmt.setString(1, mWriter);
    pstmt.setString(2, mContent);
    return pstmt;
   }
  });
 }


결과 ) web server 띄운후 아래 링크로 리스트 뜨는거 확인
        별루 변경안해도 되니 굿.!!!!
http://localhost:8181/spring_mybatis/list

2. Mybatis 사용하기위한 작업 (list 보는거 적용하기)
    사용해보면 좀더 직관적이고 사용하기 편하기 때문에
    Mybatis를 사용하게 된다고 한다.

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

예제 2 기존 Spring 구현 예제를 Mybatis 적용하여 구현하기

작성1 servlet-context.xml 에 다른 bean 객체를 추가한다.
       이때 sqlSessionFactory 의 property mapperLocations 에게
       주어지는 value 값이 쿼리를 작성할 xml 위치이다.
      그리고 Java 단에서 사용할 객체는 팩토리를 포함한
      sqlSession 임


 
 

 

 



작성2 com.javalec.spring_mybatis.dao.mapper 패키지를 생성하고
        그 밑에 IDao.xml 를 생성하여 아래와 같이 작성한다.
        여기서는 list 조회 sql 구문은 적용한 상태이다.
     mapper namespace 는 interface 위치를 기입한다.
     각 실행문 id 는 interface에 명시되어 있는 메서드명을 입력한다.
     resultType 은 각 실행 결과를 담을 타입을 명시해준다. (풀 경로 기입)
        안에 쿼리를 기입한다.

<?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="com.javalec.spring_mybatis.dao.IDao">
<select id="listDao" resultType="com.javalec.spring_mybatis.dto.ContentDto">
SELECT * FROM BOARD ORDER BY MID DESC
</select>

<insert id="writeDao">

</insert>

<delete id="deleteDao">

</delete>
</mapper>


작성3 Controller.java 에 멤버변수 를 하나 추가
          bean 등록이 되어 있기 때문에 setter 없이
          @Autowired 로 추가 가능함.

        @Autowired
 private SqlSession sqlSession;


작성3-2) Controller.java 에 list 요청에 대한 응답을 작성
            이전의 dao 객체의 메서드를 호출하는 대신
             sqlSession 의 setMapper(); 를 호출하여
             xml 의 해당 sql이 진행되도록 연결해주면
            값을 바로 모델에 넣어주고 리턴이 된다.

@RequestMapping("/list")
public String list(Model model) {
// ArrayList dtos = dao.listDao();
 IDao dao = sqlSession.getMapper(IDao.class);
// ArrayList dtos = dao.listDao();
 model.addAttribute("list", dao.listDao());
 return "/list";
}


결과 )  리스트가 정상적으로 뜨면 mybatis가 잘 적용됨.


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

3. mybatis 사용시 조건 추가하기 (delete, insert 적용)
-------------------------------
예제 계속 진행

작성1 IDao.xml 수정
         여기서 insert 에서 ? 대신에 #{param1} 을 작성
          param1~ 예약어로 param뒤에 숫자는 순서대로
          작성하는게 원칙임 여기서 앞에 # 과 $를 붙일 수 있는데
          #{param0} : 컬럼 형식에 맞춰서 입력값을 형변환함
          ${param0} : 입력 데이터 형식을 그대로 입력


 INSERT INTO BOARD (MWRITER, MCONTENT) VALUES (#{param1}, #{param2})


 DELETE FROM BOARD WHERE MID = #{param1}



작성2 HomeController.java 의 2개 메서드를 아래와 같이 수정
          여기서 파라미터는 입력한 순서대로 param1~~~ 으로
          대응된다.

@RequestMapping("/write")
public String write(HttpServletRequest request, Model model) {
 IDao dao = sqlSession.getMapper(IDao.class);
 dao.writeDao(request.getParameter("mWriter"), request.getParameter("mContent"));
 return "redirect:list";
}

@RequestMapping("/delete")
public String delete(HttpServletRequest request, Model model) {
 IDao dao = sqlSession.getMapper(IDao.class);
 dao.deleteDao(request.getParameter("mId"));
 return "redirect:list";
}


결과 ) http://localhost:8181/spring_mybatis/list
    접속후 삭제 및 글 등록이 제대로 되는지 확인
----------------------------------------------------------

mybatis 문서 가이드
(좀더 복잡한 경우에 대한 적용방법에 대해서 확인 가능)

http://blog.mybatis.org/

댓글 없음:

댓글 쓰기