마이바티스 활용
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);
}
'데이터베이스 > 마이바티스' 카테고리의 다른 글
@Param 하나의 객체와 일반 타입 변수 (0) | 2019.07.15 |
---|---|
마이바티스 결과 매핑(결과매핑 or 생성자) (0) | 2019.01.24 |
마이바티스 CRUD(삭제) (0) | 2019.01.09 |
마이바티스 CRUD(수정) (0) | 2019.01.07 |
마이바티스 CRUD(삽입) (0) | 2019.01.04 |