Mybatis(三)

2.1.3.1 QueryVo 中加入一个 List 集合用于封装参数
2.1.3.2 编写 UserDao 接口中方法
实现范围查询,在 UserDao 接口中添加方法
2.1.3.3 UserDao.xml 文件添加范围查询的配置

 

 

SQL 语句: select 字段 from user where id in (?)
<foreach> 标签用于遍历集合,它的属性:
collection: 代表要遍历的集合元素,注意编写时不要写 #{}
open: 代表语句的开始部分
close: 代表结束部分
item: 代表遍历集合的每个元素,生成的变量名
sperator: 代表分隔符

 

2.1.3.4 编写测试方法

Mybatis 的多表关联查询

本次案例主要以最为简单的用户和账户的模型来分析 Mybatis 多表关系。用户为 User 表,账户为
Account 表。一个用户( User )可以有多个账户( Account )。具体关系如下:

 

 3.1 一对一查询

案例:查询所有账户信息,关联查询下单用户信息。
注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对
一查询。如果从用户信息出发查询用户下的账户信息则为一对多查询,因为一个用户可以有多个账
3.1.1 方式一
3.1.1.1 定义账户信息的 PO
使用 resultType ,定义账户信息 po 类,此 po 类中包括了账户信息。具体实现如下:
3.1.1.2 编写 Sql 语句
实现查询账户信息时,也要查询账户所对应的用户信息。

 

SELECT 
 account.*,
 user.username,
 user.address
FROM
 account,
user
WHERE account.uid = user.id
MySQL 中测试的查询结果如下:

3.1.1.3 定义 AccountCustomer

为了能够封装上面 SQL 语句的查询结果,定义 AccountCustomer 类中要包含账户信息同时还要包含
用户信息,所以我们要在定义 AccountCustomer 类时可以继承 User 类。

 

3.1.1.4 定义 AccountDao 接口

定义 AccountDao 接口,用于查询 account 相关的账户信息。为了查询账户信息同时还能关联查询出
他的用户信息,所以我们的返回结果采用的是 AccountCustomer 类型

 3.1.1.5 定义 AccountDao.xml 文件中的查询配置信息

 

注意:因为上面查询的结果中包含了账户信息同时还包含了用户信息,所以我们的返回值类型
returnType 的值设置为 accountCustomer 类型,这样就可以接收账户信息和用户信息了。

 3.1.1.6 创建 AccountTest 测试类

编写 AccountTest 测试类,用于测试查询结果。

 

3.1.1.7 小结:
定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。此方法较为简单,使用普遍。
3.1.2 方式二
使用 resultMap ,定义专门的 resultMap 用于映射一对一查询结果。
通过面向对象的 (has a) 关系可以得知,我们可以在 Account 类中加入一个 User 类的对象来代表这个
账户是哪个用户的。
3.1.2.1 修改 Account
Account 类中加入 User 类的对象作为 Account 类的一个属性。

 3.1.2.2 修改 AccountDao 接口中的方法

注意:第二种方式,将返回值改 为了 Account 类型。
因为 Account 类中包含了一个 User 类的对象,它可以封装账户所对应的用户信息。

 3.1.2.3 重写 Account 类的 toString()方法

3.1.2.4 重新定义 AccountDao.xml 文件

 3.1.2.5 AccountTest 类中加入测试方法

 

 3.2 一对多查询

需求:查询所有用户信息及用户关联的账户信息。
分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要
将用户信息查询出来,我们想到了左外连接查询比较合适。
3.2.1 编写 SQL 语句
SELECT
u.*, acc.id id,
acc.uid,
 acc.money
FROM
user u
LEFT JOIN account acc ON u.id = acc.uid
测试该 SQL 语句在 MySQL 客户端工具的查询结果如下:

3.2.2 改写 User 类加入 List<User>

为了能够让查询的 User 信息中,带有他的个人多个账户信息,我们就需要在 User 类中添加一个集合,
用于存放他的多个账户信息,这样他们之间的关联关系就保存了。

 3.2.3 UserDao 接口中加入查询方法

UserDao 接口中加入查询方法:public List<User> findUserAccountList();

 

 3.2.4 修改 UserDao.xml 映射文件

collection 部分定义了用户关联的账户信息。表示关联查询结果集
property = "accList" 关联查询的结果集存储在 User 对象的上哪个属性。
ofType = "account" 指定关联查询的结果集中的对象类型即 List 中的对象类型。此处可以使用别
名,也可以使用全限定名。
<id /> <result/> 的意义同一对一查询。
3.2.5 测试方法

 

 

注意重写了 User 类和 Account 类的 toString() 方法。
User 类的 toString() 方法

Account 类的 toString()方法

 3.3 Mybatis 维护多对多关系

3.3.1 实现 Role User 多对多
通过前面的学习,我们使用 Mybatis 实现一对多关系的维护。多对多关系其实我们看成是双向的一
对多关系。工程结构如下:
3.3.1.1 用户与角色的关系模型
用户与角色的多对多关系模型如下
MySQL 数据库中添加角色表,用户角色的中间表。
角色表

用户角色中间表 

 

3.3.1.2 业务要求及实现 SQL 

 

需求:实现查询所有对象并且加载它所分配的用户信息。
分析:查询角色我们需要用到 Role 表,但角色分配的用户的信息我们并不能直接找到用户信息,而
是要通过中间表 (USER_ROLE ) 才能关联到用户信息。
下面是实现的 SQL 语句:
SELECT
 r.*,u.id uid,
 u.username username,
 u.birthday birthday,
 u.sex sex,
 u.address address
FROM 
 ROLE r
INNER JOIN 
 USER_ROLE ur
ON ( r.id = ur.rid)
INNER JOIN
 USER u
ON (ur.uid = u.id);
3.3.1.3 编写角色实体类
我们加载的信息中不仅有角色信息,同时还要加载关联加载具有该角色的用户信息。因为一个角色
可以分配给多个用户,所以我们可以考虑在 Role 类中加入一个 List<User> 的属性,用于存放这个角
色分配给了哪些用户对象。
具体的角色实体类( Role 类)如下:

其中 Role 类中 userList 集合就是用于存在该角色分配给的用户列表。  

 3.3.1.4 编写 RoleDao 接口

RoleDao 接口中添加一个用于查询所有角色并关联查询出它所分配的用户列表的方法。

3.3.1.5 编写 RoleDao.xml 映射文件 

添加 RoleDao.xml 文件,并在 SqlMapConfig.xml 文件中加载该映射文件。
第一步:
RoleDao.xml 文件中添加一个 resultMap 用于加载角色对象及它所关联的用户信息。

 第二步:在 RoleDao.xml 文件中加入 SQL 语句的映射

 

 

注意:为了显示效果,需要重载 Role 类的 toString()方法 

3.3.2 实现 User Role 的多对多 

3.3.2.1 User Role 的多对多
User 出发,我们也可以发现一个用户可以具有多个角色,这样用户到角色的关系也还是一对多关
系。这样我们就可以认为 User Role 的多对多关系,可以被拆解成两个一对多关系来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值