docs: update docs

This commit is contained in:
开源海哥 2023-07-10 11:19:47 +08:00
parent e3253fd62e
commit 81016ec601
2 changed files with 55 additions and 45 deletions

View File

@ -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'},

View File

@ -1,12 +1,12 @@
# 一对多、多对一
# 关联查询
在 MyBatis-Flex 中,我们内置了 3 种方,帮助用户进行关联查询,比如 `一对多``一对一``多对一``多对多`等场景,他们分别是:
在 MyBatis-Flex 中,我们内置了 3 种方,帮助用户进行关联查询,比如 `一对多``一对一``多对一``多对多`等场景,他们分别是:
- Relations 注解
- Field Query
- Join Query
- 方案1Relations 注解
- 方案2Field Query
- 方案3Join Query
## Relations 注解
## 方案 1Relations 注解
在 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
## 方案 2Field Query
以下是文章的 `多对多` 示例,一篇文章可能归属于多个分类,一个分类可能有多篇文章,需要用到中间表 `article_category_mapping`
@ -469,7 +479,7 @@ List<Article> articles = mapper.selectListByQuery(query
这些不仅仅只适用于 `一对多``一对一``多对一``多对多`等场景。任何 `Article` 对象里的属性,需要二次查询赋值的,都是可以通过这种方式进行,比如一些统计的场景。
## Join Query
## 方案 3Join Query
Join Query 是通过 QueryWrapper 构建 `Left Join` 等方式进行查询,其原理是 MyBatis-Flex 自动构建了 MyBatis 的 `<resultMap>`
,我们只需要关注 MyBatis-Flex 的 SQL 构建即可。