表之间的关系
- 一对多/ 多对一/ 一对一/ 多对多
举例:
用户和订单就是一对多
订单和用户就是多对一
- 一个用户可以下多个订单
- 多个订单属于同一个用户
人和身份证号就是一对一
- 一个人只能有一个身份证号
- 一个身份证号只能属于一个人
老师和学生之间就是多对多
- 一个学生可以被多个老师教过
- 一个老师可以交多个学生
特例:
如果拿出每一个订单,它都只能属于一个用户。
所以Mybatis就把多对一看成了一对一。
一对一关系映射
示例:用户和账户
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用户)
步骤:
1、建立两张表:用户表,账户表
让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
2、建立两个实体类:用户实体类和账户实体类
让用户和账户的实体类能体现出来一对多的关系
3、建立两个配置文件
用户的配置文件
账户的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户下所包含的账户信息
当我们查询账户时,可以同时得到账户的所属用户信息
建表
1 | DROP TABLE IF EXISTS `user`; |
示例
查询所有账户操作,同时获取到该账户对应的用户的信息(多表查询常用方法)
SQL语句
SQL语句查询所有账户的时候同时获得当前账户的所有信息
1 | select u.*,a.id as aid,a.uid,a.money from account a ,user u where u.id=a.uid; |
SQL语句查询所有账户的时候同时获得当前账户的所地址和姓名
1 | select a.*,u.username,u.address from account a ,user u where u.id=a.uid; |
1. 从表实体应该包含一个主表实体的对象引用
在Account类中
1 | //从表实体应该包含一个主表实体的对象引用 |
2.IAccountDao的接口中
1 | package com.gsynf.dao; |
3.IAccountDao的mapper中
1 | ………………………… |
注意事项中的javaType=“User” 一定要指名主体表的实体类名然后column中指名从表的外键!!
1 | <association property="user" column="uid" javaType="User"> |
4.AccountDao的测试类中
1 | package com.gsynf.test; |
5.运行结果
第二种方法是创建一个AccountUser类
不建议使用
1 | package com.gsynf.domain; |
一对多关系映射
这里还是上一个一对一中用到的例子。
示例
查询所有用户操作,同时获取到用户下所有账户的信息(多表查询常用方法)
SQL语句
SQL语句查询所有账户的时候同时获得当前账户的所有信息
1 | select u.*,a.id as aid,a.uid,a.money from user u left outer join account a on u.id=a.uid |
1.从表实体应该包含一个主表实体的对象引用
1 | // 一对多关系引用:主表实体应该包含从表实体的集合引用 |
2.IUserDao的接口中
1 | public interface IUserDao { |
2.IUserDao的接口中
1 | package com.gsynf.dao; |
3.IUserDao的mapper中
1 | …………………… |
注意:一对一用的是association,一对多以及多对多用的是collection。
4.UserDao的测试类中
1 | //查询所有(一个用户下的账号信息) |
5.运行结果
多对多关系映射
示例:用户和角色
一个用户可以有多个角色
一个角色可以赋予多个用户
步骤:
1、建立两张表:用户表,角色表
让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
2、建立两个实体类:用户实体类和角色实体类
让用户和角色的实体类能体现出来多对多的关系
各自包含对方一个集合引用
3、建立两个配置文件
用户的配置文件
角色的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户所包含的角色信息
当我们查询角色时,可以同时得到角色的所赋予的用户信息
1 | DROP TABLE IF EXISTS `role`; |
示例:
查询所有角色操作,同时获取角色下所有用户信息;
查询所有用户操作,同时获取用户对应的所有角色信息;
SQL语句
1 | select u.*,r.id as rid,r.role_name,r.role_desc from role r |
新建Role实体类、IRoleDao接口、IRoleDao.xml配置文件、RoleTest这些步骤这里不再详细赘述。
1.一个实体应该包含另一个实体的的集合引用
1 | //多对多的关系映射:一个角色可以赋予给多个用户 |
注意其中每行末尾的空格
目的:为了查询角色下的用户信息
步骤:以role表(别名)为主表,左外连接user_role表(别名ur,此表为中间表),连接条件r.id = ur.rid 。
再以这两个表组合的表左外连接user表,连接条件u.id=ur.uid 。
注意:关于数据库的连接
2.IRoleDao的接口中
1 | package com.gsynf.dao; |
3.IRoleDao的mapper中
1 | …………………… |
4.RoleDao的测试类中
1 |
|
5.运行结果
查询所用用户,同时得到用户的所有角色信息,与上同理。**
6.SQL语句
1 | select u.*,r.id as rid,r.role_name,r.role_desc from user u |
7.一个实体应该包含另一个实体的的集合引用
1 | // 多对多关系映射 |
8.IUserDao的接口中
1 | package com.gsynf.dao; |
9.IUserDao的mapper中
1 | …………………… |
10.UserDao的测试类中
1 |
|
11.运行结果
注:转载文章请注明出处,谢谢~