各位小伙伴
今天我们来了解
resultMap 的高级应用
mybatis 查询多表
数据库表结构中存在的几种多表关系:一对一 ,一对多, 多对一 ,多对多
一对一的关系
就比如我们创建一个数据库,有一个用户表,用户表就只会有一个用户名,密码什么的。然后在对应一个用户详情表,之所以要这样做,是因为我们的表的大小是记录数*字段数,要是设计了太多的字段,当数据记录过多的时候,就会减缓查询速度。
多对一的关系
用户表(主表)和部门表(从表)的关系:一个用户只能有一个部门,多个用户属于同一个部门 站在用户表的角度,用户表和部门表的关系是多对一。
需求: 查询用户信息的时候,需要讲用户所属的部门名称查询出来
第一种方式:普通 sql 关联查询,映射用户扩展对象
创建一个返回对象
用 resultType 标签返回新创建的对象 UserDept,写一下接口。
具体的 SQL 语句。
测试运行一下。
第二种方式:用 mybatis 的 resultMap 标签返回
创建一个Dept.Java
在 user 对象加入部门对象的属性,不要忘记set() get() 方法。
写一个接口
SQL语句对于多对一关系的从表的映射
association :用于多对一那个一的映射。
property:User对象里面新加的关联对象的属性名称。
javaType :属性的类型(部门对象)。
用 resultMap 标签返回查询结果
一对多的关系
部门表(主表)和用户(从表)的关系:一个部门有多个用户 站在部门表的角度看 部门表和用户表的关系是一对多的关系
需求:查询某个部门下面的所有用户信息
第一种方式:普通的 sql 关联查询,映射到部门扩展对象
创建一个返回对象 DeptUser.java
用 resultType 标签返回新创建的对象 DeptUser,写一个接口。
SQL语句
测试一下
第二种方式 :用 mybatis 的 resultMap 标签返回
在部门对象加入用户集合的属性
用 resultMap 标签返回查询结果,写一个接口。
SQL语句。
对于一对多关系的从表(用户表)的映射
collection :用于一对多那个多的映射
property:Dept 对象里面新加的关联集合对象的属性名称
ofType :属性的类型(用户对象)
测试一下
总结:
第一种方式:会随着sql的变化或者业务需求的变化,返回的对象就会发生改变,那我们每次需要重新定义实体对象,但是相对来说比较简单,所以应用广泛。
第二种方式:需要使用 resultMap 标签里面的 association 完成映射,稍微有点复杂,但是如果系统需要延迟加载,必须使用此方式才能完成。