插入数据后得到主键
<insert id="insertComment" parameterType="com.zsy.domain.Comment" useGeneratedKeys="true" keyProperty="id">
insert into
comment (uid, content, vid)
values (#{userId}, #{content}, #{videoId})
</insert>
不需要添加什么其它的配置,只需要在insert标签里面添加useGeneratedKeys="true" keyProperty="id"
,这里的keyProperty
为自己定义的JavaBean的属性。
这里注意的是,上面的做法必须在设计表的时候指定主键自动增长,且主键唯一。同时参数必须为JavaBean,这样在插入成功之后作为参数的JavaBean的id会自动赋值为主键。
collection标签的运用
这里描述一下场景,实现一个评论功能,最终前端得到的数据除了评论的具体信息之外,还需要评论者的相关信息,如头像,昵称之类的,得到的效果如下:
如果只是使用普通的select语句加上collection标签,那么回复列表将得不到用户的信息,这个时候可以使用collection标签的select
和column
属性,前者是查询语句,后者是查询的时候用到的参数,这样一来就可以把两个操作结合在一起,可以少写一些垃圾代码。下面贴一下项目中的部分代码:
resultMap
<!-- 评论对应一个resultMap-->
<resultMap type="com.zsy.domain.Comment" id="commentResultMap">
<id column="id" property="id"/>
........
<!-- replyList为列表,这里注意不要指定ofType等属性,会冲突
select指定为mapper中的方法
-->
<collection property="replyList" select="com.zsy.mapper.CommentMapper.getReply"
column="{commentId=id}">
</collection>
</resultMap>
<!-- 回复对应一个resultMap-->
<resultMap type="com.zsy.domain.Comment" id="replyResultMap">
<id column="id" property="id"/>
........
</resultMap>
mapper
<select id="getComment" resultMap="commentResultMap">
SELECT
.....
FROM
comment AS c
LEFT JOIN user ON user.id = c.id
WHERE
c.vid = #{videoId}
</select>
<select id="getReply" resultMap="replyResultMap">
SELECT
......
FROM
reply AS r
LEFT JOIN user ON user.id = r.id
WHERE
r.cid = #{commentId}
</select>
mapper接口
@Repository
public interface CommentMapper {
List<Comment> getComment(String videoId);
List<Comment> getReply(Integer commentId);
}