Mybatis中的多表查询 多对多
示例:用户和角色
一个用户可以有多个角色
一个角色可以赋予多个用户
步骤:
1、建立两张表:用户表,角色表
让用户表和角色表具有多对多的关系。
需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
2、建立两个实体类:用户实体类和角色实体类
让用户和角色的实体类能体现出来多对多的关系
各自包含对方一个集合引用
3、建立两个配置文件
用户的配置文件
角色的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户所包含的角色信息
当我们查询角色时,可以同时得到角色的所赋予的用户信息
role表:
user表:
user_role表:
实现 Role 到 User 多对多
需求:
实现查询所有角色并且加载它所分配的用户信息
分析:
查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息
而是要通过中 间表(USER_ROLE 表)才能关联到用户信息。
实现的 SQL 语句:
SELECT role.id as rid , role.role_name , role.role_desc , user.*
FROM role
INNER JOIN user_role
ON ( role.id = user_role.rid)
INNER JOIN user
ON (user_role.uid = user.id);
创建角色实体类Role
public class Role implements Serializable { private Integer roleId; private String roleName; private String roleDesc;
//多对多的关系映射:一个角色可以赋予多个用户
private List<User> users;
/*get set toString*/ }
编写 Role 持久层接口
public interface IRoleDao { List<Role> findAll(); }
编写持久层接口IRoleDao对应的映射配置文件IRoleDao.xml
<?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.mkl.dao.IRoleDao"> <!--定义 role 表的 ResultMap--> <resultMap id="roleMap" type="role"> <id property="roleId" column="rid"></id> <result property="roleName" column="role_name"></result> <result property="roleDesc" column="role_desc"></result> <collection property="users" ofType="user"> <id column="id" property="id"></id> <result column="username" property="username"></result> <result column="address" property="address"></result> <result column="sex" property="sex"></result> <result column="birthday" property="birthday"></result> </collection> </resultMap> <!--查询所有--> <select id="findAll" resultMap="roleMap"> SELECT role.id as rid , role.role_name , role.role_desc, user.* FROM ROLE INNER JOIN USER_ROLE ON ( ROLE.id = USER_ROLE.rid) INNER JOIN USER ON (USER_ROLE.uid = USER .id); </select> </mapper>
User到Role 多对多
实体类User中 :
private List<Role> roles; /*get set */
IUserDao.xml :
<resultMap id="userMap" type="user"> <id column="id" property="id"></id> <result column="username" property="username"/> <result column="address" property="address"/> <result column="sex" property="sex"/> <result column="birthday" property="birthday"/> <collection property="roles" ofType="role"> <id property="roleId" column="rid"></id> <result property="roleName" column="role_name"></result> <result property="roleDesc" column="role_desc"></result> </collection> </resultMap> <!-- 查询所有user --> <select id="findAll" resultMap="userMap"> SELECT role.id as rid , role.role_name , role.role_desc, user.* FROM ROLE INNER JOIN USER_ROLE ON ( ROLE.id = USER_ROLE.rid) INNER JOIN USER ON (USER_ROLE.uid = USER .id); </select>