mybatis中的多表查询:
-
表之间的关系有几种:
一对多
多对一
一对一
多对多- 以用户表和账户表为例
用户和订单就是一对多
订单和用户就是多对一
一个用户可以下多个订单
多个订单属于同一个用户
特例:
如果拿出每一个订单,他都只能属于一个用户。
所以Mybatis就把多对一看成了一对一。
- 以用户表和账户表为例
-
实现一对一操作查询
为了体现对应关系,从表实体应该包含一个主表实体的引用对象,
故向Account实体类中加入一个private User user;
查询所有账户,同时获取账户的所属用户名称以及它的地址信息
<!--查询所有账户,同时获取账户的所属用户名称以及它的地址信息-->
<!-- 建立对应关系 -->
<resultMap id="accountUserMap" type="account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<association property="user" column="uid" javaType="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</association>
</resultMap>
<select id="findAll" resultMap="accountUserMap">
SELECT a.*,u.address,u.username FROM account a,USER u WHERE a.uid =u.id
</select>
- 实现一对多操作查询
为了体现对应关系,主表实体应该包含一个从表实体的List集合对象,故向Account实体类中加入一个private List<Account> accounts;
查询所有用户,同时获取用户所有的账户信息
<!-- 定义User的resultMap-->
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!-- 配置user对象中accounts集合的映射 -->
<collection property="accounts" ofType="account">
<id column="aid" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userAccountMap">
select * from user u left outer join account a on u.id = a.uid
</select>
-
实现多对多操作查询
- 示例:用户和角色
一个用户可以有多个角色
一个角色可以赋予多个用户 - 步骤:
1、建立两张表:用户表,角色表
让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
2、建立两个实体类:用户实体类和角色实体类
让用户和角色的实体类能体现出来多对多的关系
各自包含对方一个集合引用
3、建立两个配置文件
用户的配置文件
角色的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户所包含的角色信息
当我们查询角色时,可以同时得到角色的所赋予的用户信息
- 示例:用户和角色