多对多关系其实就是双向的多对一关系,只要学会多对一关系,就可以处理多对多关系,无非多对多关系需要一个中间表进行连接查询即可。
- 现有User表 Role表 和中间表 User_Role表
一 实现mybatis一对多的基本查询的步骤
-
1.创建对应的数据库表的实体类
- 2.创建实体类的Dao层接口
- 3.创建实体类的映射配置文件
- 4.编写sql语句
- 5.测试
1.1User类
1.2Role类
可能大家会发现Role类中声明了一个List<User>的引用
,这么做是为什么呢?
先来看看我们的需求:查询角色信息,并查询出该角色用户信息
我们知道一个用户可能有多个角色,一个角色可能被多个用户所共有,他们通过一个user_role表进行连接,因为这是一个一对多关系,所以将查询出来的用户信息封装到list集合中来表示一对多关系!!
-
2.1映射配置文件中如何配置信息呢?
<resultMap id="RoleMap" type="Role">
<id column="ID" property="ID"></id>
<result column="ROLE_NAME" property="roleName"></result>
<result column="ROLE_DESC" property="roleDesc"></result>
<collection property="userList" ofType="user">
<result column="id" property="id"></result>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="sex" property="sex"></result>
<result column="address" property="address"></result>
</collection>
</resultMap>
<select id="m2m2" resultMap="RoleMap">
SELECT role.*,user.`address`,user.`birthday`,user.`id`,user.`sex`,user.`username`
FROM user_role LEFT JOIN USER
ON user_role.`UID`=user.`id`
LEFT JOIN role
ON user_role.`RID`=role.`ID`
</select>
- 2.2 通过配置resultMap来指定返回信息的封装,其中
<collection>
标签的property对应Role中的成员变量名称,ofType写被封装类的全限定名称,这样对应的user就可以封装到,userlist中了。 - 记住collection标签中,不能写id标签,我试过如果写id标签,对应的集合只能封装一个对象,不能进行多个User对象的封装。可能id是主键,只允许有一个
- 3 测试
- 4 小结
- 什么时候用内联接,什么时候用外联接?
- 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行,如果不匹配,不会在查询结果集中显示
- 外联接可以是左向外联接、右向外联接
- 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
在本篇文章中的sql语句写法,应该用左外联接写法
因为要查询角色表的所有信息,并且查出用户信息,角色表的所有信息全部需要,用户信息如果有的话就查询出来,如果没有就为空