1.首先给出几张必要的表和对应的.java文件
1.1t_user表和user.java文件
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable{
private Integer uid; //用户id
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
private List<Account> accountList; //用户和账号的一对多关系
private List<Role> roleList; //用户和角色的一对多关系
}
1.2t_role表和Role.java文件
@Data
public class Role implements Serializable{
private Integer rid;
private String rName;
private String rDesc;
private List<User> userList;// 角色和用户的一对多关系
}
1.3t_account表和Account.java
@Data
public class Account implements Serializable{
private Integer aid;
private Double money;
private Integer uid;
private User user;
}
1.4 t_user和t_role的中间表user_role
2.多对多映射查询分析
根据用户的uid,查询出用户的信息,然后查询出该用户的所有角色信息。由于每个用户可以有多个角色,每个角色也可以由多个用户担任因此是多对多映射。
以uid=1为例进行查询:
3.在UserDao中添加查询方法:findUserRolesByUid()
public interface UserDao {
/**
* 根据用户的uid,查询出用户的信息,然后查询出该用户的所有角色信息
* @param uid
* @return
*/
User findUserRolesByUid(int uid);
}
4.配置UserDao.xml文件
<!--自定义映射规则-->
<resultMap id="userRolesMap" type="User">
<id column="uid" property="uid"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
<!--使用collection标签进行一对多的映射-->
<collection property="roleList" ofType="Role">
<result property="rid" column="rid"/>
<result property="rName" column="rName"/>
<result property="rDesc" column="rDesc"/>
</collection>
</resultMap>
<select id="findUserRolesByUid" parameterType="int" resultMap="userRolesMap">
select * from t_user u,t_role r,user_role ur where ur.uid=u.uid and ur.rid=r.rid and u.uid=#{uid}
</select>
5.配置文件编写
@Test
public void testFindUserRolesByUid() throws IOException {
SqlSession sqlSession = SqlSessionFactoryUtil.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.findUserRolesByUid(1);
System.out.println(user);
SqlSessionFactoryUtil.closeAndCommit(sqlSession);
}