본문으로 바로가기

마이바티스 활용

category 데이터베이스/마이바티스 2019. 1. 23. 18:50

마이바티스 활용

1) 흐름

 

마이바티스를 앞서 설명 드렸듯이 흐름을 살펴봅시다.

 

한 개의 댓글 데이터를 가져오는 경우를 예를 들어보죠.

 

1. 우선 설정 파일을 작성 해주고, 매퍼구문을 작성

2. JSP 파일에서 서비스의 메소드 호출

3. 서비스에서 Repository(Dao)의 객체 생성 후 메서드 호출

4. Repository에서 SqlSession 객체 생성 후 namespace를 통해 SqlSession의 메소드(selectOne)호출

5. Repository에서 namespace를 통해 지정된 매퍼 구문의 id를 통해 매퍼 구문 .xml 파일 호출하여 매핑 구문 실행

 

이러한 흐름으로 구성이 됩니다.

 

1. 매퍼구문을 작성하기 위해 xml파일을 생성하고

 

<select id="selectCommentByPrimaryKey" parameterType="long" resultMap="constructorResultMap">

SELECT

comment_no,

user_id,

comment_content,

reg_date

FROM comment

WHERE comment_no=#{commentNo}

</select>

 

 


 

2. JSP파일에서

 

CommentResultMapService commentResultMapService=new CommentResultMapService()

 

로 서비스 객체를 생성해주고 넘겨받은 댓글 번호(commentNo)를 서비스의 메서드

 

commentResultMapService.selectByPrimaryKey(commentNo)의 인자로 전달합니다.


 

 

3. 서비스에서는

CommentSessionResultMapRepository commentSessionResultMapRepository = new

 

CommentSessionResultMapRepository()로 레퍼지토리 객체를 생성 해주고

 

레퍼지토리의 메서드인 selectCommentByPrimaryKey(commentNo)를 호출합니다.


 

 

4. 레퍼지토리에서는

 

namespace="ldg.mybatis.repository.mapper.CommentMapperResultMap.selectCommentByPrimaryKey"

 

를 선언해주고

 

SqlSession sqlSession= getSqlSessionFactory().openSession()으로 SqlSession 객체 생성 후

 

sqlSession.selectOne(namespace,commentNo) 를 호출하여 매퍼구문의 SQL구문을 실행합니다.

 

마이바티스는 이런 식으로 흐름이 구성된다고 할 수 있습니다.

 

 

 


 

2) 매핑구문

 

이번엔 매핑구문을 작성하는 방법에 대해 좀더 자세히 알아보도록 하겠습니다.

 

앞서 매핑구문은 XML에 작성한다고 배웠습니다.

 

하지만 여러 방법이 존재합니다.

1. XML만 사용

2. 인터페이스만 사용

3. XML과 인터페이스 함께 사용

 

 

이 방법은 여러 분들의 자유입니다.

 

1. XML만 사용

사용 법에 대해 알아보자면

 


<mapper namespace="ldg.mybatis.repository.mapper.CommentMapper">
     <cache />

 <select id="selectCommentByCondition" parameterType="hashmap" resultType="Comment">
  SELECT
   comment_no,
   user_id,
   comment_content,
   reg_date
  FROM comment
  <if test="commentNo != null">
   WHERE comment_no = #{commentNo}
  </if>
 </select>

 

 <select id="selectCommentByPrimaryKey" parameterType="long" resultMap="constructorResultMap">
  SELECT
   comment_no,
   user_id,
   comment_content,
   reg_date
  FROM comment
  WHERE comment_no = #{commentNo}
 </select>


</mapper>

 

 

id가 selectCommentByCondition인 구문은 동적 SQL문으로 WHERE 조건으로 if 태그가 쓰였으며

 

댓글번호인 commentNo가 널이 아닐 경우 WHere 조건으로 들어가게 됩니다.

 

이를 레퍼지토리에서

 

1. selectCommentByPrimamryKey 매핑 구문

sqlSession.selectOne("ldg.mybatis.repository.mapper.CommentMapper.selectCommentByPrimamryKey", 1L);

 

2. selectCommentByCondition 매핑 구문

sqlSession.selectList("ldg.mybatis.repository.mapper.CommentMapper.selectCommentByPrimamryKey", new HashMap<String,Object>());

 

이 두 방법으로 매핑구문을 사용하면 됩니다.


 

 

2.인터페이스만 사용

 

앞서 썼던 selectCommentByPrimamryKey , selectCommentByCondition 매핑구문을 에노테이션으로

 

인터페이스에서 정의를 할 수 있습니다.

 

public interface CommentMapper{

@Select({

"SELECT comment_no,user_id,comment_content,reg_date

FROM COMMENT WHERE comment_no=#{commentNO}")

}

 

Comment selectCommentByPrimamryKey(Long commentNo);

}

 

형식으로 인터페이스를 @Select 어노테이션을 이용하여 작성합니다.

 

XML을 인터페이스로 바꾸기 위해서는 다음 규칙만 적용해줍니다.

 

매핑 구문 네임스페이스를 -> 인터페이스 패키지명과 인터페이스명

=>public interface CommentMapper

매핑구문 아이디-> 에노테이션 가진 메서드 이름

=>Comment selectCommentByPrimamryKey(Long commentNo);

매핑 구문 결과 데이터 타입(ResultType)-> 에노테이션 메소드의 반환 타입

=>Comment

매핑구문의 파라미터 타입(ParameterType) -> 에노테이션 메소드의 파라미터 타입

=>Long commentNo

 

인터페이스의 단점은 동적SQL구문을 작성하기 까다롭다는 것입니다.

 

따라서 마이바티스는

@SelectProvider

@InsertProvider

@UpdateProvider

@DeleteProvider

 

를 제공합니다.

 

위에서 selectCommentByCondition 매핑 구문을 인터페이스로 동적SQL식으로 작성한다면 ?

 

public interface CommentMapper{

@SelectProvider(type=CommentSqlProvider.class, method="selectCommentByCondtion")

List<Comment> selectCommentByCondition(Map<String,Object> condition);

}

 

이를 위해서 SqlProvider 클래스가 있어야한다.'

 

아래처럼 작성해줍니다.

 

public class CommentSqlProvider {
 public String selectCommentByCondition(Map<String, Object> condition) {
  BEGIN();
  SELECT("comment_no, user_id, comment_content, reg_date");
  FROM("comment");
  WHERE("comment_no = #{commentNo}");

  return SQL();
 }
}

 

 

 이를 호출하는 코드는 XML만 사용 했을때와는 살짝 다릅니다.

 public Comment selectCommentByPrimaryKey(Long commentNo) {
  SqlSession sqlSession = getSqlSessionFactory().openSession();
  Comment result = null;
  try {
   result = sqlSession.getMapper(CommentMapperResultMap.class).selectCommentByPrimaryKey(commentNo);

  } catch (Exception e) {
   LOGGER.warn("{} : {}", e.getMessage(), e);
  } finally {
   sqlSession.close();
  }
  return result;
 }

 

 public List<Comment> selectCommentByCondition(Map<String, Object> condition) {
  SqlSession sqlSession = getSqlSessionFactory().openSession();
  List<Comment> result = null;
  try {
   result = sqlSession.getMapper(CommentMapper.class).selectCommentByCondition(condition);
  } catch (Exception e) {
   LOGGER.warn("{} : {}", e.getMessage(), e);
  } finally {
   sqlSession.close();
  }
  return result;
 }

 

위는 인터페이스로 적용 시킬 경우의 레퍼지토리 코드입니다.

 

앞서 썼던 XML과는 확연히 다릅니다.


 

3.인터페이스와 XML 함께 사용

 

간단합니다. XML에서는 매핑구문만 남기고 인터페이스에서는 SQL을 정의하지 않고 메소드만 선언하면 됩니다.

 

<mapper namespace="ldg.mybatis.repository.mapper.CommentMapper">
     <cache />

 

 <select id="selectCommentByPrimaryKey" parameterType="long" resultMap="constructorResultMap">
  SELECT
   comment_no,
   user_id,
   comment_content,
   reg_date
  FROM comment
  WHERE comment_no = #{commentNo}
 </select>


</mapper>

 

위 처럼 XML에 SQL구문을 작성하고

 

인터페이스는 아래 처럼 메소드만 선언 합니다. (어노테이션 작성 x)

 

public interface CommentMapper{

@Select({

"SELECT comment_no,user_id,comment_content,reg_date

FROM COMMENT WHERE comment_no=#{commentNO}")

}

 

Comment selectCommentByPrimamryKey(Long commentNo);

}