前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis 学习笔记(6) 关联查询

MyBatis 学习笔记(6) 关联查询

作者头像
张云飞Vir
发布2021-07-08 11:02:01
2220
发布2021-07-08 11:02:01
举报
文章被收录于专栏:写代码和思考

1. 背景

本节讲 高级查询。

2.关联查询

2.1 一对一映射:直接将结果写入到关联对象中

场景:一个博客文章一定有一个作者,通过一个 authorId 关联。 mybatis 可以支持这样左连接查询,一次性查出结果,还能将结果集直接写入到关联 的 author 对象中。

示例:

代码语言:javascript
复制
public class Blog {
    public long id;
    public String blogTitle;
    public String blogContent;
    public String authorId;

    public Author author;

}

public class Author {
    public long id;
    public String userName;
    public String userInfo;
}

xml映射文件:

代码语言:javascript
复制
    <select id="selectBlogList" resultMap="blogResult">
        select
          blog_title,
          blog_content ,
          author_id,
          A.user_name as 'author.userName',
          A.id as 'author.id'
        FROM blog as B LEFT JOIN author AS A ON B.author_id = A.id
    </select>
  • 注意这里用了别名, A.user_name as 'author.userName'。正是这句话实现了直接写入到 author 对象的 userName 自动中。mybatis 直接帮我们new 了一个 author ,并写入属性值。

是不是很方便呢。

完整代码示例见:https://github.com/vir56k/java_demo/tree/master/mybatisdemo6_query1

2.2 一对多映射:关联多个对象放入一个属性的集合中

场景:假设一个作者有多个文章,在文章表记录了作者的 auther_id。想一次查出 作者和作者所有的文章。

mybatis 的 <collection> 标签 用于在关联关系中描述一个集合。 示例:

代码语言:javascript
复制
<mapper namespace="cn.zyfvir.AuthorMapper">

    <resultMap id="authorResult" type="cn.zyfvir.Author">
        <id property="id" column="id"/>
        <result property="userName" column="user_name"/>
        <result property="userInfo" column="user_info"/>
        <collection property="blogList" ofType="cn.zyfvir.Blog" columnPrefix="blog.">
            <id property="id" column="id"/>
            <result property="blogTitle" column="blog_title"/>
            <result property="blogContent" column="blog_content"/>
        </collection>
    </resultMap>

    <select id="selectAuthorList" resultMap="authorResult">
        select
          A.id,
          A.user_name,
          B.id as 'blog.id',
          B.blog_title as 'blog.blog_title',
          B.blog_content as 'blog.blog_content'
        FROM author AS A LEFT JOIN blog as B ON B.author_id = A.id
    </select>
</mapper>

java 实体类定义:

代码语言:javascript
复制
public class Author {
    public long id;
    public String userName;
    public String userInfo;
    public List<Blog> blogList;
}
public class Blog {
    public long id;
    public String blogTitle;
    public String blogContent;
    public String authorId;
}
  • 在这个实体类定义中,blog 集合是author 的字段,它是list类型。
  • mybatis 会针对 id 做过滤重复的对象。

从打印的结果可以看到,数据库返回了 3条记录。而 mybatis 进行映射充足后,合并了重复项,list 集合中只有两条。

我的代码示例见:https://github.com/vir56k/java_demo/tree/master/mybatisdemo6_query2

3.参考:

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2.关联查询
    • 2.1 一对一映射:直接将结果写入到关联对象中
      • 2.2 一对多映射:关联多个对象放入一个属性的集合中
      • 3.参考:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档