以下是“mybatis高级映射一对多查询实现代码”的完整攻略。
一、什么是一对多查询
Mybatis中,一对多查询指的是查询一个实体对象时,它包含了多个关联对象。比如我们要查询一篇文章及其所有的评论,文章就是主实体对象,评论则是关联对象,一个文章可以对应多个评论,这就是一对多关系。
二、mybatis高级映射一对多查询实现代码
Mybatis中,要实现一对多查询,可以通过两种方式:一种是使用Mybatis自带的collection标签进行关联查询,另一种是使用ResultMap的association标签和collection标签进行关联查询。下面分别进行详细说明。
1. 使用Mybatis自带的collection标签进行关联查询
这种方式需要在mapper文件中使用collection标签,它会将查询到的多条记录映射成一个集合对象,并保存在主实体对象中。具体步骤如下:
(1)定义实体类及mapper接口
定义Article和Comment两个实体类,Article类中包含多个Comment对象;定义ArticleMapper接口,并添加查询方法getArticleById。
(2)编写mapper.xml文件
<!-- 查询文章及其评论列表 -->
<select id="getArticleById" resultMap="articleWithComments">
SELECT
a.id,
a.title,
a.content,
a.create_time,
c.id AS comment_id,
c.content AS comment_content,
c.create_time AS comment_create_time
FROM
tb_article AS a
LEFT JOIN tb_comment AS c ON a.id = c.article_id
WHERE
a.id = #{id}
</select>
<!-- 配置ResultMap -->
<resultMap id="articleWithComments" type="Article">
<id column="id" property="id"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="create_time" property="createTime"/>
<collection property="comments" ofType="Comment">
<id column="comment_id" property="id"/>
<result column="comment_content" property="content"/>
<result column="comment_create_time" property="createTime"/>
</collection>
</resultMap>
(3)调用Mapper接口并返回Article对象
在程序中调用getArticleById方法,传入文章id,返回Article对象。查询结果中,Article对象包含了该文章的所有评论信息。
2. 使用ResultMap的association标签和collection标签进行关联查询
这种方式也需要在mapper文件中定义关联关系,但是它将关联对象保存在一个独立的实体类中,与主实体类分离开来,更加灵活。具体步骤如下:
(1)定义实体类及mapper接口
定义Article和Comment两个实体类,Article类中包含一个CommentList对象;定义ArticleMapper接口,并添加查询方法getArticleById。
(2)编写mapper.xml文件
<!-- 查询文章及其评论列表 -->
<select id="getArticleById" resultMap="articleWithComments">
SELECT
a.id,
a.title,
a.content,
a.create_time,
c.id AS comment_id,
c.content AS comment_content,
c.create_time AS comment_create_time
FROM
tb_article AS a
LEFT JOIN tb_comment AS c ON a.id = c.article_id
WHERE
a.id = #{id}
</select>
<!-- 配置ResultMap -->
<resultMap id="articleWithComments" type="Article">
<id column="id" property="id"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="create_time" property="createTime"/>
<association property="commentList" resultMap="commentResult" javaType="CommentList"/>
</resultMap>
<resultMap id="commentResult" type="CommentList">
<collection property="commentList" ofType="Comment" resultMap="comment"/>
</resultMap>
<resultMap id="comment" type="Comment">
<id column="comment_id" property="id"/>
<result column="comment_content" property="content"/>
<result column="comment_create_time" property="createTime"/>
</resultMap>
(3)调用Mapper接口并返回Article对象
在程序中调用getArticleById方法,传入文章id,返回Article对象。查询结果中,Article对象包含了一个CommentList对象,该对象包含了该文章的所有评论信息。
3. 示例说明
为了更好地说明上述两种方式的使用,下面给出两个示例。
示例一:使用Mybatis自带的collection标签进行关联查询
// 1. 定义实体类
public class Article {
private Integer id;
private String title;
private String content;
private Date createTime;
private List<Comment> comments;
// 省略getter和setter方法
}
public class Comment {
private Integer id;
private String content;
private Date createTime;
// 省略getter和setter方法
}
// 2. 定义ArticleMapper接口
public interface ArticleMapper {
Article getArticleById(Integer id);
}
// 3. 编写mapper.xml文件
<!-- 略 -->
// 4. 调用mapper接口
@Autowired
private ArticleMapper articleMapper;
@Test
public void testGetArticleById() {
Integer id = 1;
Article article = articleMapper.getArticleById(id);
System.out.println(article);
}
// 5. 测试结果
Article(id=1, title=Mybatis教程, content=..., createTime=Wed Oct 27 14:22:25 CST 2021, comments=[Comment(id=1, content=很好的教程, createTime=Thu Oct 28 13:35:34 CST 2021), Comment(id=2, content=还可以, createTime=Thu Oct 28 13:35:34 CST 2021)])
示例二:使用ResultMap的association标签和collection标签进行关联查询
// 1. 定义实体类
public class Article {
private Integer id;
private String title;
private String content;
private Date createTime;
private CommentList commentList;
// 省略getter和setter方法
}
public class CommentList {
private List<Comment> commentList;
// 省略getter和setter方法
}
public class Comment {
private Integer id;
private String content;
private Date createTime;
// 省略getter和setter方法
}
// 2. 定义ArticleMapper接口
public interface ArticleMapper {
Article getArticleById(Integer id);
}
// 3. 编写mapper.xml文件
<!-- 略 -->
// 4. 调用mapper接口
@Autowired
private ArticleMapper articleMapper;
@Test
public void testGetArticleById() {
Integer id = 1;
Article article = articleMapper.getArticleById(id);
System.out.println(article);
}
// 5. 测试结果
Article(id=1, title=Mybatis教程, content=..., createTime=Wed Oct 27 14:22:25 CST 2021, commentList=CommentList(commentList=[Comment(id=1, content=很好的教程, createTime=Thu Oct 28 13:35:34 CST 2021), Comment(id=2, content=还可以, createTime=Thu Oct 28 13:35:34 CST 2021)]))
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis高级映射一对多查询实现代码 - Python技术站