Mybatis框架(一)-- 快速入门
Mybatis框架(二)-- 原理解析
Mybatis框架(三)-- 详细配置参数
Mybatis框架(四)-- 其他配置
Mybatis框架(五)-- 多表查询
Mybatis框架(六)-- 延迟加载
Mybatis框架(七)-- 缓存
Mybatis框架(八)-- 注解开发
Mybatis中的多表查询
-
表之间的关系有几种:
一对多
多对一
一对一
多对多 -
举例:
用户和订单就是一对多 订单和用户就是多对一 一个用户可以下多个订单 多个订单属于同一个用户 人和身份证号就是一对一 一个人只能有一个身份证号 一个身份证号只能属于一个人 老师和学生之间就是多对多 一个学生可以被多个老师教过 一个老师可以交多个学生
特例:
如果拿出每一个订单,他都只能属于一个用户。
所以Mybatis就把多对一看成了一对一。
解决方法:
- 定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。
- 使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。(重点介绍)
一对一
一对一在关系表中表现为从表含有主表的外键,在Java类中表现为从表含有主表的引用。用于封装的关键标签为association
下例为,将查询信息封装到AccountUser
类中的配置方式。AccountUser
中含有一个User
类的引用。
<mapper namespace="com.yy.dao.IAccountDao">
<resultMap id="accountUserMap" type="accountUser">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<association property="user" javaType="User"> 配置accountUser中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>
</association>
</resultMap>
<select id="getOne2One" resultMap="accountUserMap">
SELECT u.* ,a.id aid,a.uid,a.MONEY FROM user u,account a WHERE u.id = a.UID
</select>
</mapper>
association简化:
<mapper namespace="com.yy.dao.IAccountDao">
<resultMap id="accountUserMap" type="accountUser">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<association property="user" 在accountUser类中成员变量user
javaType="User" user,类型为User
column="uid" 此处column是外键,指示Mybatis把uid作为外键与user的主键关联
select="com.yy.dao.IUserDao.findByID">
</association>
</resultMap>
<select id="getOne2One" resultMap="accountUserMap">
SELECT * from account
</select>
</mapper>
一对多
一对多在关系表中表现为多个从表都含有主表的外键,在Java类中表现为主表含有多个从表的引用集合的引用。用于封装的关键标签为collection
下例为,将查询信息封装到user
类中的配置方式。user
中含有一个AccountUser
类的List的引用。
<mapper namespace="com.yy.dao.IUserDao">
<resultMap id="UserAccountMap" type="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 property="accounts" ofType="AccountUser">
<id column="aid" property="id"></id>
<result column="money" property="money"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="UserAccountMap">
SELECT u.*,a.id as aid,a.MONEY
FROM user u left OUTER JOIN account a
on u.id = a.uid
</select>
</mapper>
查询一个User的多个Account时,表中会有重复,但Mybatis会为我们自动封装
多对多
多对多在关系表中使用中间表来表示,中间表同时包含两个表的主键,在Java类中表现为各自包含对方一个集合引用。
实质时两个一对多关系。