简介
MyBatis中多表之间的关系
- 本次案例主要以最为简单的用户(User)、账户(Account)、角色(Role)的模型来分析Mybatis多表关系。
- 用户为User 表,账户为Account表。
- 一对多关系
- 一个用户(User)可以开设多个账户(Account)
- 从查询 用户信息(User) 出发,关联查询 账户信息(Account)属于一对多查询
- 一个用户(User)可以开设多个账户(Account)
- 一对一关系(多对一)
- 多个账户(Account)可以对应一个用户(User)
- 单个账户(Account)只能属于一个用户(User)
- 从查询 账户信息(Account) 出发,关联查询 用户信息(User)属于一对一查询
- 多对多关系
- 一个用户(User)可以拥有多个角色(Role)
- 一个角色(Role)可以赋予多个用户(User)
- 多对多关系其实我们看成是双向的一对多关系。
- 一对多关系
- 用户为User 表,账户为Account表。
目录结构
- src
- main
- java
- cn.water.dao
- UserDao.java(一对多 持久层接口)
- AccountDao.java(一对一 持久层接口)
- cn.water.domain
- User.java(一对多 实体类)
- Account.java(一对一 实体类)
- cn.water.dao
- resources
- cn.water.dao
- User.xml(一对多 映射配置文件)
- Account.xml(一对一 映射配置文件)
- SqlMapConfig.xml(MyBatis主配置文件)
- jdbcConfig.properties(数据库连接信息文件)
- cn.water.dao
- java
- test
- java.cn.water
- MybatisTest.java(测试类)
- java.cn.water
- main
MyBatis主配置文件
jdbcConfig.properties
1 | jdbc.driver=com.mysql.jdbc.Driver |
SqlMapConfig.xml
1 |
|
实体类
Account.java
1 | package cn.water.domain; |
User.java
1 | package cn.water.domain; |
持久层接口
AccountDao.java
1 | package cn.water.dao; |
UserDao.java
1 | package cn.water.dao; |
测试类
MyBatisTest.java
1 | package cn.water; |
一对一查询(延迟)
- @One注解代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
- 注解
- @One:实现一对一结果集封装
- select:指定用来多表查询的sqlmapper
- fetchType:覆盖全局的配置参数(延迟加载:lazyLoadingEnabled)
- @One:实现一对一结果集封装
账户类 持久层接口
1 | "SELECT * FROM account") ( |
用户类 持久层接口
1 | "SELECT * FROM user WHERE id = #{id}") ( |
测试类
1 |
|
运行结果
![](13.注解 多表查询 延迟加载\注解 一对一查询 延迟查询.png)
一对多查询(延迟)
- @Many注解代替了<Collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
- 注解
- @Many:实现一对多结果集封装
- select:指定用来多表查询的sqlmapper
- fetchType:覆盖全局的配置参数(延迟加载:lazyLoadingEnabled)
- @Many:实现一对多结果集封装
用户类 持久层接口
1 | "SELECT * FROM user") ( |
账户类 持久层接口
1 | "SELECT * FROM account WHERE uid = #{id}") ( |
测试类
1 |
|
运行结果
![](13.注解 多表查询 延迟加载\注解 一对多查询 延迟查询.png)