最近在练习时 遇到了类似于 企鹅里的好友分组功能,使用的持久层框架是mybatis 第一次处理这种关系 记录一下 备忘。。
首先是表结构:
<user_group > 好友分组 、 <t_group> 用户与好友分组的关联表 、 <t_user> 用户表
实现需求的返回格式:
之后就到了重点,处理这种数据格式 重点在Mybatis的resultMap 和 对应的实体类:
分组实体类 UserGroupsView
public class UserGroupsView {
/**
* 好友分组ID
*/
@Id
private Integer id;
/**
* 好友分组名
*/
@Column(name = "groupname" )
private String groupName;
/**
* 分组下好友集合
*/
private List<UserGroupView> userGroupViewList;
}
分组下好友实体类UserGroupView
public class UserGroupView {
/**
* 好友分组ID
*/
@Id
@Column(name="user_group_id")
private Integer userGroupId;
/**
* 好友ID
*/
@Column(name = "friend_id")
private Integer friendId;
/**
* 用户昵称
*/
private String username;
/**
* 在线状态 online:在线、offline:离线、hide:隐身
*/
private String status;
/**
* 用户签名
*/
private String sign;
/**
* 头像URL
*/
private String avatar;
/**
* 是否删除 0,(否)/1,(是)
*/
@Column(name = "is_delete")
private Integer isDelete;
}
在mybatis中的处理:
这里的重点应该是 id为UserGroupsMap 中的返回集合类型上,这个resultMap返回的集合 对应着UserGroupView实体类 所以返回到 分组实体类中 是一个集合。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.UserGroupMapper">
<resultMap id="BaseResultMap" type="com.model.UserGroup">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="group_id" jdbcType="INTEGER" property="groupId"/>
<result column="friend_id" jdbcType="INTEGER" property="friendId"/>
</resultMap>
<resultMap id="UserGroupMap" type="com.model.view.UserGroupView">
<id column="user_group_id" jdbcType="INTEGER" property="userGroupId"/>
<result column="friend_id" jdbcType="INTEGER" property="friendId"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="status" jdbcType="VARCHAR" property="status"/>
<result column="sign" jdbcType="VARCHAR" property="sign"/>
<result column="avatar" jdbcType="VARCHAR" property="avatar"/>
<result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
</resultMap>
<resultMap id="UserGroupsMap" type="com.model.view.UserGroupsView">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="groupname" jdbcType="INTEGER" property="groupName"/>
<collection property="userGroupViewList" resultMap="UserGroupMap"/>
</resultMap>
<select id="selectGroups" resultMap="UserGroupsMap">
SELECT
t_group.id,
t_group.groupname,
user_group.id AS user_group_id,
t_user.id AS friend_id,
t_user.username,
t_user.`status`,
t_user.sign,
t_user.avatar
FROM
user_group
INNER JOIN t_user ON user_group.friend_id = t_user.id
INNER JOIN t_group ON t_group.id = user_group.group_id
WHERE
<!-- 这里暂时把userId写死-->
t_group.user_id = 1
</select>
</mapper>
对应mapper的interface
public interface UserGroupMapper extends Mapper<UserGroup> {
// 获取用户好友分类 及其分类下的好友
List<UserGroupsView> selectGroups();
}
执行sql语句的返回结果大概是这样: