mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
docs: update docs
This commit is contained in:
parent
e3253fd62e
commit
81016ec601
@ -57,8 +57,8 @@ export default defineConfig({
|
||||
text: '基础功能',
|
||||
items: [
|
||||
{text: '增、删、改', link: '/zh/base/add-delete-update'},
|
||||
{text: '查询(多表和分页)', link: '/zh/base/query'},
|
||||
{text: '一对多、多对一', link: '/zh/base/relations-query'},
|
||||
{text: '基础查询', link: '/zh/base/query'},
|
||||
{text: '关联查询', link: '/zh/base/relations-query'},
|
||||
{text: '批量操作', link: '/zh/base/batch'},
|
||||
{text: 'QueryWrapper', link: '/zh/base/querywrapper'},
|
||||
{text: 'Db + Row', link: '/zh/base/db-row'},
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
# 一对多、多对一
|
||||
# 关联查询
|
||||
|
||||
在 MyBatis-Flex 中,我们内置了 3 种方式,帮助用户进行关联查询,比如 `一对多`、`一对一`、`多对一`、`多对多`等场景,他们分别是:
|
||||
在 MyBatis-Flex 中,我们内置了 3 种方案,帮助用户进行关联查询,比如 `一对多`、`一对一`、`多对一`、`多对多`等场景,他们分别是:
|
||||
|
||||
- Relations 注解
|
||||
- Field Query
|
||||
- Join Query
|
||||
- 方案1:Relations 注解
|
||||
- 方案2:Field Query
|
||||
- 方案3:Join Query
|
||||
|
||||
## Relations 注解
|
||||
## 方案 1:Relations 注解
|
||||
|
||||
在 MyBatis-Flex 中,提供了 4 个 Relations 注解,他们分别是:
|
||||
|
||||
@ -18,6 +18,8 @@
|
||||
添加了以上配置的实体类,在通过 `BaseMapper` 的方法查询数据时,需要调用 select*****WithRelations**() 方法,Relations 注解才能生效。
|
||||
否则 MyBatis-Flex 自动忽略 Relations 注解。
|
||||
|
||||
BaseMapper 提供的 withRelations 方法列表,详情点击[这里](/zh/base/query.html#relations-注解查询)。
|
||||
|
||||
## 一对一 `@RelationOneToOne`
|
||||
|
||||
假设有一个账户,账户有身份证,账户和身份证的关系是一对一的关系,代码如下所示:
|
||||
@ -57,7 +59,7 @@ public class IDCard implements Serializable {
|
||||
- **selfField** 当前实体类的属性
|
||||
- **targetField** 目标对象的关系实体类的属性
|
||||
|
||||
> PS: 若 **selfField** 是主键,且当前表只有 1 个主键时,可以不填写。
|
||||
> PS: 若 **selfField** 是主键,且当前表只有 1 个主键时,可以不填写。因此,以上的配置可以简化为 `@RelationOneToOne(targetField = "accountId")`
|
||||
|
||||
假设数据库 5 条 Account 数据,然后进行查询:
|
||||
|
||||
@ -128,7 +130,7 @@ public class Book implements Serializable {
|
||||
- **selfField** 当前实体类的属性
|
||||
- **targetField** 目标对象的关系实体类的属性
|
||||
|
||||
> PS: 若 **selfField** 是主键,且当前表只有 1 个主键时,可以不填写。
|
||||
> PS: 若 **selfField** 是主键,且当前表只有 1 个主键时,可以不填写。因此,以上的配置可以简化为 `@RelationOneToOne(targetField = "accountId")`
|
||||
|
||||
|
||||
|
||||
@ -154,7 +156,7 @@ WHERE account_id IN (1, 2, 3, 4, 5)
|
||||
|
||||
假设一个账户有很多本书籍,一本书只能归属一个账户所有;账户和书籍的关系是一对多的关系,书籍和账户的关系为多对一的关系,代码如下:
|
||||
|
||||
Account.java 一对多的配置:
|
||||
Account.java:
|
||||
```java 8
|
||||
public class Account implements Serializable {
|
||||
|
||||
@ -163,9 +165,6 @@ public class Account implements Serializable {
|
||||
|
||||
private String userName;
|
||||
|
||||
@RelationOneToMany(selfField = "id", targetField = "accountId")
|
||||
private List<Book> books;
|
||||
|
||||
//getter setter
|
||||
}
|
||||
```
|
||||
@ -193,7 +192,8 @@ public class Book implements Serializable {
|
||||
- **selfField** 当前实体类的属性
|
||||
- **targetField** 目标对象的关系实体类的属性
|
||||
|
||||
> PS: 若 **targetField** 目标对象的是主键,且目标对象的表只有 1 个主键时,可以不填写。
|
||||
> PS: 若 **targetField** 目标对象的是主键,且目标对象的表只有 1 个主键时,可以不填写。因此,以上的配置可以简化为
|
||||
> `@RelationManyToOne(selfField = "accountId")`
|
||||
|
||||
|
||||
|
||||
@ -239,13 +239,6 @@ public class Role implements Serializable {
|
||||
private Long id;
|
||||
private String name;
|
||||
|
||||
@RelationManyToMany(
|
||||
joinTable = "tb_role_mapping",
|
||||
selfField = "id", joinSelfColumn = "role_id",
|
||||
targetField = "id", joinTargetColumn = "account_id"
|
||||
)
|
||||
private List<Account> accounts;
|
||||
|
||||
//getter setter
|
||||
}
|
||||
```
|
||||
@ -260,7 +253,24 @@ public class Role implements Serializable {
|
||||
|
||||
> 注意:selfField 和 targetField 配置的是类的属性名,joinSelfColumn 和 joinTargetColumn 配置的是中间表的字段名。
|
||||
>
|
||||
> 若 **selfField** 和 **targetField** 分别是两张关系表的主键,且表只有 1 个主键时,可以不填写。
|
||||
> 若 **selfField** 和 **targetField** 分别是两张关系表的主键,且表只有 1 个主键时,可以不填写。因此,以上配置可以简化如下:
|
||||
```java {7-11}
|
||||
public class Account implements Serializable {
|
||||
|
||||
@Id(keyType = KeyType.Auto)
|
||||
private Long id;
|
||||
private String userName;
|
||||
|
||||
@RelationManyToMany(
|
||||
joinTable = "tb_role_mapping", // 中间表
|
||||
joinSelfColumn = "account_id",
|
||||
joinTargetColumn = "role_id"
|
||||
)
|
||||
private List<Role> roles;
|
||||
|
||||
//getter setter
|
||||
}
|
||||
```
|
||||
|
||||
## 父子关系查询
|
||||
|
||||
@ -369,7 +379,7 @@ JSON 输出内容如下:
|
||||
|
||||
|
||||
|
||||
## Field Query
|
||||
## 方案 2:Field Query
|
||||
|
||||
以下是文章的 `多对多` 示例,一篇文章可能归属于多个分类,一个分类可能有多篇文章,需要用到中间表 `article_category_mapping`。
|
||||
|
||||
@ -469,7 +479,7 @@ List<Article> articles = mapper.selectListByQuery(query
|
||||
这些不仅仅只适用于 `一对多`、`一对一`、`多对一`、`多对多`等场景。任何 `Article` 对象里的属性,需要二次查询赋值的,都是可以通过这种方式进行,比如一些统计的场景。
|
||||
|
||||
|
||||
## Join Query
|
||||
## 方案 3:Join Query
|
||||
|
||||
Join Query 是通过 QueryWrapper 构建 `Left Join` 等方式进行查询,其原理是 MyBatis-Flex 自动构建了 MyBatis 的 `<resultMap>`
|
||||
,我们只需要关注 MyBatis-Flex 的 SQL 构建即可。
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user