Mybatis框架(五)-- 多表查询

it2024-12-23  12

Mybatis框架(一)-- 快速入门 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类中表现为各自包含对方一个集合引用。

实质时两个一对多关系。

最新回复(0)