ybatis의resultType과resultMap 깊이 이해

1. 개요
MyBatis에서 select 맵을 조회할 때 반환 형식은resultType을 사용할 수도 있고resultMap을 사용할 수도 있습니다.resultType은 반환 형식을 직접 표시하고resultMap은 외부 ResultMap에 대한 인용이지만 ResultType과resultMap은 동시에 존재할 수 없습니다.
MyBatis가 조회 맵을 할 때 사실 조회된 모든 속성은 대응하는 맵에 놓여 있는데 그 중에서 키는 속성 이름이고 값은 대응하는 값이다.
① 반환 형식 속성이resultType일 때 MyBatis는 맵의 키 값을 resultType에서 지정한 대상에 대응하는 속성으로 추출합니다.그래서 사실 MyBatis의 모든 조회 맵의 반환 유형은 ResultMap입니다. 단지
반환 형식 속성이resultType일 때, MyBatis는 자동으로 대응하는 값을resultType에서 지정한 대상의 속성에 부여합니다.
② 제공된 반환 유형이resultMap일 때 맵이 영역 모델을 잘 나타내지 못하기 때문에 스스로 대응하는 대상으로 전환해야 한다. 이것은 복잡한 조회에서 매우 작용한다.
둘째, ResultType

Blog.java
public class Blog {
private int id;
private String title;
private String content;
private String owner;
private List<Comment> comments;
}
대응하는 데이터베이스 테이블에는 id, title, Content, Owner 속성이 저장되어 있습니다.

<typeAlias alias="Blog" type="com.tiantian.mybatis.model.Blog"/>
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from t_blog where id = #{id}
</select>
MyBatis는 자동으로 ResultMap 대상을 만들고 검색된 속성 이름을 바탕으로 키 값을 봉인하여 반환 형식이 Blog 대상인 것을 보고 ResultMap에서 Blog 대상에 대응하는 키 값을 추출하여 값을 부여합니다.
3. ResultMap
반환 형식이 직접ResultMap일 때도 매우 유용하다. 이것은 주로 복잡한 연합 조회를 하는 데 쓰인다. 왜냐하면 간단한 조회를 하는 것은 필요없기 때문이다.먼저 ResultMap으로 되돌아오는 간단한 조회를 보고 복잡한 조회의 용법을 보십시오.
① 간단한 조회 작성

<resultMap type="Blog" id="BlogResult">
<id column="id" property="id"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="owner" property="owner"/>
</resultMap>
<select id="selectBlog" parameterType="int" resultMap="BlogResult">
select * from t_blog where id = #{id}
</select>
select 맵에서resultMap의 값은 외부resultMap의 id로 결과를 되돌려주는resultMap을 나타냅니다. 외부resultMap의 type 속성은 이resultMap의 결과가 어떤 유형인지 나타냅니다. 여기가 블로그 유형입니다. 그러면 MyBatis는 이를 블로그 대상으로 꺼냅니다.resultMap 노드의 하위 노드 id는 이 대상을 표시하는 id이고, result 하위 노드는 간단한 속성을 표시하는 데 사용되며, 그 중의Column 속성은 데이터베이스에서 조회하는 속성을 나타내고,Property는 조회된 속성에 대응하는 값이 실체 대상에 부여되는 속성을 나타낸다.간단하게 조회하는resultMap의 작법은 이렇다.
② 복잡한 질의
Comment 클래스가 있는데 그 중 블로그의 인용이 있는데 어느 블로그에 대한Comment인지 나타낸다. 그러면 Comment를 조회할 때 그에 대응하는 블로그도 블로그 속성을 부여해야 한다.

public class Comment {
private int id;
private String content;
private Date commentDate = new Date();
private Blog blog;
}
<!-- CommentMapper.xml -->
<resultMap type="Comment" id="CommentResult">
<association property="blog" select="selectBlog" column="blog" javaType="Blog"/>
</resultMap>
<select id="selectComment" parameterType="int" resultMap="CommentResult">
select * from t_Comment where id = #{id}
</select>
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from t_Blog where id = #{id}
</select>
먼저 id를 selectComment의 select 맵으로 요청한 다음에 id가 CommentResult인 ResultMap 대상을 얻을 수 있습니다. 대응하는 ResultMap의 반환 형식은 하나의 Comment 대상입니다. 그 중에서 association 노드가 하나이고 앞에서 말한 것처럼 간단한 조회에 대응하는 id,result 하위 노드가 없지만 대응하는 id 등 속성을 Comment 대상에 부여합니다.이것이 바로 앞에서 말한 MyBatis는 자동 봉인 기능을 가지고 있습니다. 반환 유형만 제공하면 MyBatis는 자신의 판단에 따라 조회 결과에 대응하는 대상을 봉인합니다. 따라서 앞의 간단한 조회에서resultMap에서 id가 대응하는 글자, 제목이 대응하는 필드를 명확하게 지적하지 않으면 MyBatis도 자신의 판단에 따라 봉인을 도와줍니다.MyBatis의 자체 판단은 조회의field나 그에 대응하는 별명과 되돌아오는 대상의 속성을 비교하는 것이다. 일치하고 유형도 일치하면 MyBatis는 값을 부여한다.위에서 대응한resultMap에서 하나의 블로그 속성을 연결했는데 그에 대응하는java 유형은 블로그이다. 상기 글쓰기에서 관련 대상은 하위 조회를 통해 연결된다. 물론 관련 조회를 통해 직접 연결할 수 있다.위의 association 하위 노드에서property 속성은resultMap 반환 유형의 관련 속성을 나타냅니다. 위의 예는Comment가 관리하는blog 속성입니다.select는 대응하는 관련 속성을 표시하는 select 맵을 표시합니다. 즉, id가 select에 대응하는 값의 select 맵을 요청하여 관련된 속성 대상을 조회합니다.Column은 현재 관련 대상이 id가CommentResult인resultMap에 대응하는 키 값이 맞다는 것을 나타냅니다. 이 키 값은 관련 대상의 하위 조회에 대한 매개 변수로 사용되며,selectComment에서 조회된 블로그 속성의 값을 매개 변수로 관련 대상인blog를 진행하는 하위 조회selectBlog의 매개 변수로 전달됩니다.javaType은 현재 연관된 객체가 JAVA에서 어떤 유형인지 나타냅니다.
상술한 소개는 일대일 또는 일대일의 상황에서 일대일의 관련에 대한 조회이다.실제 응용 프로그램에서 한 가지 더 많이 사용되는 응용 프로그램은 한 쌍을 통해 대응하는 많은 쪽을 찾아내고 많은 쪽을 꺼낼 때도 마찬가지로 한 쌍을 연결시켜야 한다. 블로그 대상을 꺼낼 때 대응하는 Comment를 모두 꺼내고 Comment를 꺼낼 때도 대응하는 블로그를 꺼내야 한다. 이것은 자바에서 한 번의 요청을 통해 꺼낸 것이다.

<!--  BlogMapper.xml  -->
<resultMap type="Blog" id="BlogResult">
<id column="id" property="id"/>
<collection property="comments" select="selectCommentsByBlog" column="id" ofType="Comment"></collection>
</resultMap>
<resultMap type="Comment" id="CommentResult">
<association property="blog" javaType="Blog" column="blog" select="selectBlog"/>
</resultMap>
<select id="selectBlog" parameterType="int" resultMap="BlogResult">
select * from t_blog where id = #{id}
</select>
<select id="selectCommentsByBlog" parameterType="int" resultMap="CommentResult">
select * from t_Comment where blog = #{blogId}
</select>
상기 요청의 입구는 id가selectBlog의select영사이고 반환 결과는 id가BlogResult의resultMap이고 id가BlogResult의 유형은Blog입니다. 그 중에서 id의 속성과 필드를 지정했습니다. id를 지정하면 MyBatis 내부의 구조 작용이 매우 큽니다.그중에 하나의comments 대상이 연결되어 있습니다. 블로그에 많은Comment가 있을 수 있기 때문에 이 comments는 하나의 집합이기 때문에 집합collection으로 비추고 그 중에서 select는 어떤 하위 조회를 해서 대응하는comments를 조회하는지를 나타냅니다. column은 상기에서 찾아낸 필드 값을 매개 변수로 하위 조회에 전달하고 ofType도 반환 형식을 나타냅니다. 이곳의 반환 형식은 집합 내부의 형식입니다.type이 아닌 ofType을 사용하는 이유는 MyBatis 내부에서 관련 association과 구별하기 위해서입니다.

public void selectCommentsByBlogTest() {
SqlSession session = Util.getSqlSessionFactory().openSession();
CommentMapper commentMapper = session.getMapper(CommentMapper.class);
List<Comment> comments = commentMapper.selectCommentsByBlog(6);
for (Comment comment : comments)
System.out.println(comment);
session.close();
}
public void testSelectOne() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
Blog blog = blogMapper.selectBlog(6);
List<Comment> comments = blog.getComments();
if (comments != null) {
for (Comment comment : comments)
System.out.println(comment);
}
session.close();
}
위에서 말한 것은 여러분께 소개해 드린 Mybatis 중의result Type과result Map입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기