【JavaWeb】MyBatis_Collection的用法

Collection反映间接关联的关系,association反映直接关联

举个例子

有两张表Blog和Comments

Blog 博客表
int blog_id PK
List<Comment> clist

Comment 评论表
int comment_id PK
int blog_id FK

根据Mybatis,分成两层结构,dao层的.java是接口,xml是配置文件,entity是实体层,根据数据库中的表创建

com.example.dao
    BlogMapper.java
    BlogMapper.xml
    CommentMapper.java
    CommentMapper.xml

com.example.entity
    Blog.java
    Comment.java

我就假设博客表里只有博客Id和评论集合两个属性了,其他属性与collection案例无关,我就没写,如果有的话,在BlogMapper.xml里面的<resultMap>里面也要写上一一对应的。

要说明collection的用法,就比如现在我们想获取一个评论集合,该集合体现在表中就是List<Comment> clist

要用mybatis把这个集合填上,该怎么填呢?我们首先想到的就是,用blog_id外键在comment表中查,于是我们在BlogMapper.java和CommentMapper.xml中添加上

Comment.java

Goods getGoodsByBlogId(int blog_id);
CommentMapper.xml

<select id="getCommentByBlogId" resultType="上面写的resultType后面的id是什么就填什么">
    select * from comment where blog_id = #{blog_id}
</select>

.java里面函数的参数是什么就必须在sql语句后面写什么,还有就是select后面的id里面的函数名字要和java里面的函数名一致,非常容易写错!!!建议复制粘贴

现在Blog类可以调用getCommentByBlogId这个函数来获取同一篇博客的评论了,所以在Blog.java和Blog.xml中改

BlogMapper.java

<resultMap id="BaseResultMap" type="com.example.entity.Blog">
<collection colum="blog_id" property="clist" ofType="com.example.dao.Goods" select="com.example.dao.CommentMapper.selectCommentById"/>
</resultMap>

<selection id="getBlogById" resultMap="BaseResultMap" parameterType="int">
    select * from Blog where blog_id = #{blog_id}
</selection>

这里的 resultMap后面的id“BaseResultMap”要和下面sql语句上面一行的resultMap一致

resultMap标签后面的type意思是这个BlogMapper要返回的对象, 所以就是Blog

为什么要写这个resultMap呢?如果数据库中每一列的名字和实体类中的每一个属性名字都写的一模一样就不用写resultMap,犹豫这里有个List在数据库中并没有列与其对应,所以要写resultMap

collection后面的colum参数代表数据库中的一个属性,比如是blog_id,并且将会被传递给后面的select所调用的函数,作为参数

ofType指List列表中的泛型(Comment)

上面说到,因为我们要创建这个类,但是List又无法在数据库中找到直接对应的列,所以collection就把column中的值传递给select中的函数,让函数查找回很多个Comments,接着MyBatis再把他们封装成一个List

下面的getBlogById是通过blog表的主键查找博客,我一开有疑问,为什么完成这个功能需要这个看似不相关的函数?

因为resultMap需要一个方法来调用他,他才能激活,所以需要添加这个函数来激活resultMap

大概是这个意思,如果有说的不对的地方请指正,谢谢

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值