mybatis中的多表操作
本篇为多表连接操作,下一篇为多表级联操作
表之间的关系有几种:
-
一对一
-
一对多
-
多对一
-
多对多
示例:用户和账户
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用户)
步骤:
- 建立两张表:用户表,账户表
-
建立两个实体类:用户实体类和账户实体类,让用户和账户的实体类能体现出一对一或者一对多的关系
(以上体现出实体类中一对一的关系) -
建立两个配置文件:分别为用户配置文件和账户配置文件
-
实现配置:
- 当我们查询用户时,可以同时得到用户下所包含的账户信息
- 当我们查询账户时,可以同时得到账户所属用户的信息
一对一:
按照上述前三步操作之后,我们就来实现配置
- dao/mapper下建立两个接口,实现映射方法
-
在对应的配置文件下写查询语句,重点在于resultmap的使用
eg:当我们想查询账户以及账户所对应的用户时
这是账户的表结构
可以看出,账户表中存在外键uid,用来连接用户表中的id
这就是我们对应表里的查询语句
- resultMap标签的介绍:
-
当用户所建的实体类中的属性名和数据库中的字段名不一样时,resultType标签就不能满足我们的需求了,这时候就需要resultMap来建立我们属性与字段名的映射
-
resultMap的id是标识,相当于这个resultMap的名字,当在写sql语句的标签中使用resultMap时,就可以将id填入;type是要映射的哪一个实体类,可以写全路径名,可以写别名。
-
resultMap标签里id标签为主键,result标签是非主键,property属性时实体类中的属性名,column属性为数据库中的列名
-
当关系为一对一时,我们在resultMap标签中可以使用association标签,其中property,column和上述相同,JavaType是决定将结果映射到哪一个实体类上,在association标签中还可以继续写另一个实体类与表的映射。
-
多对一/一对多:
与以上步骤相同,不同之处在于:
- 实体类中表现出一对多的关系:
可以与上面一对一的关系做对比,看有什么不同
-
resultMap中的改动以及sql语句的变动
在一对多或者多对一关系中,resultMap标签中不能再使用association标签,而要使用collection标签
ofType属性是表示在集合中的元素的类型
根据需求,我们要显示所有的用户以及用户所属账号,所以sql语句要用到左外连接。
多对多:
示例:用户与角色
用户可以有多个角色
角色也可以赋予多个用户
-
建立三张表:用户表,角色表,以及中间表(桥表)
让用户和角色之间要具有多对多的关系,必须要使用到中间表,中间表包含用户表与角色表的主键,作为中间表的外键,以及自身的主键。
-
建立两个实体类:用户实体类和角色实体类,各自包含一个对对方的集合引用
3. 建立两个配置文件:分别为用户配置文件和角色配置文件
-
实现配置:
- 当我们查询用户时,可以同时得到用户下所包含的角色信息
- 当我们查询角色时,可以同时得到具有该角色的用户的信息
同样,在一对多的基础上,差别就在sql语句,多个一对多不就是多对多么
下一篇
mybatis中的延迟加载