关联关系
银行卡数据模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXx7cS9D-1618219891862)(C:\Users\zhangjuan\AppData\Roaming\Typora\typora-user-images\image-20210412170527500.png)]
1、1对1查询
查询银行卡信息,关联查询下单用户信息。
SQL****语句
SELECT
bc.*,
user.username,
user.address
FROM
bankCard bc LEFT JOIN user
ON bc.user_id = user.id
方法一: resultType
定时属性值,此处不做分析
方法二:resultMap
使用resultMap进行结果映射,定义专门的resultMap用于映射一对一查询结果。
创建扩展po类
创建BindCardExt类(该类用于结果集封装),加入User属性,user属性中用于存储关联查询的用户信
息,因为银行卡关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
public class BindCardExt extends Orders {
private User user;// 用户对象
// get/set。。。。
}
Mapper映射文件
在UserMapper.xml中,添加以下代码:
<!-- 查询订单关联用户信息使用resultmap -->
<resultMap type="BindCardExt" id="bankCardAndUserRstMap">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<!-- 一对一关联映射 -->
<!--
property:Orders对象的user属性
javaType:user属性对应 的类型
-->
<association property="user" javaType="com.kkb.mybatis.po.User">
<!-- column:user表的主键对应的列 property:user对象中id属性-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findBankCardAndUserRstMap" resultMap="bankCardAndUserRstMap">
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
u.username,
u.address
FROM
orders o
JOIN `user` u ON u.id = o.user_id
</select>
注意:
-
association:表示进行一对一关联查询映射
-
property:表示关联查询的结果存储在com.kkb.mybatis.po.BankCard 的user属性中
-
javaType:表示关联查询的映射结果类型
-
使用resultMap进行结果映射时,具体是使用association完成关联查询的映射,将关联查询信息映射到
pojo对象中。
2、1对多的查询
查询所有用户信息及用户关联的银行卡信息。
sql语句
SELECT
u.*,
o.id oid,
o.number,
o.createtime
FROM
`user` u
LEFT JOIN bankCard o ON u.id = o.user_id
分析
主信息:用户信息
从信息:银行卡信息
在一对多关联查询时,只能使用resultMap进行结果映射。
1、一对多关联查询时,sql查询结果有多条,而映射对象是一个。
2、resultType完成结果映射的方式的一条记录映射一个对象。
3、resultMap完成结果映射的方式是以[主信息]为主对象,[从信息]映射为集合或者对象,然后封装到
主对象中。
修改po类
在User类中加入List bankCardList 属性
Mapper映射文件
在UserMapper.xml文件中,添加以下代码:
<resultMap type="user" id="userAndOrderRstMap">
<!-- 用户信息映射 -->
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<result property="address" column="address"/>
<!-- 一对多关联映射 -->
<collection property="orders" ofType="bankcards">
<id property="id" column="oid"/>
<result property="userId" column="id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
</collection>
</resultMap>
<select id="findUserAndOrderRstMap" resultMap="userAndOrderRstMap">
SELECT
u.*,
o.id oid,
o.number,
o.createtime
FROM
`user` u
LEFT JOIN bankCard o ON u.id = o.user_id
</select>
注意:
Collection标签:定义了一对多关联的结果映射。
property=“bankcards”**:关联查询的结果集存储在User对象的上哪个属性。
ofType=“bankcards”**:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也
可以使用全限定名。