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
大概是这个意思,如果有说的不对的地方请指正,谢谢