update docs

This commit is contained in:
开源海哥 2023-06-09 09:56:02 +08:00
parent 17d6bb3941
commit 7c700765ce
2 changed files with 110 additions and 32 deletions

View File

@ -260,6 +260,23 @@ SELECT * FROM tb_account
WHERE id >= ?
```
## where 动态条件 4
```java 1,5
String name = null;
QueryWrapper queryWrapper = QueryWrapper.create()
.select().from(ACCOUNT)
.where(ACCOUNT.ID.ge(100))
.and(ACCOUNT.USER_NAME.like(name, If::hasText));
```
其查询生成的 Sql 如下:
```sql
SELECT * FROM tb_account
WHERE id >= ?
```
## where select
```java
QueryWrapper queryWrapper = QueryWrapper.create()
@ -533,36 +550,57 @@ Firebird 下执行的代码如下:
SELECT * FROM "tb_account" ORDER BY "id" DESC ROWS 20 TO 30
```
## 存在疑问?
## Lambda 扩展
**疑问1示例代码中的 QueryWrapper 所需要的 "ACCOUNT" 从哪里来的?**
虽然 MyBaits-Flex 也支持 lambda 方式,但是并不推荐使用,建议在一些简单的场景下使用,以下是示例:
MyBatis-Flex 使用了 APTAnnotation Processing Tool在项目编译的时候
会自动根据 Entity 类定义的字段生成 "ACCOUNT" 类以及 Entity 对应的 Mapper 类, 通过开发工具构建项目(如下图),
或者执行 maven 编译命令: `mvn clean package` 都可以自动生成。这个原理和 lombok 一致。
简单示例:
```java
QueryWrapper query = QueryWrapper.create();
query.where(Account::getId).ge(100)
.and(Account::getUserName).like("michael")
.or(Account::getUserName).like(" ", If::hasText);
System.out.println(query.toSQL());
```
SQL 输入内容如下:
![](../../assets/images/build_idea.png)
```sql
SELECT * FROM WHERE `id` >= 100 AND `user_name` LIKE '%michael%'
```
> 更多关于 APT 的配置,请进入 [APT 配置章节](../others/apt.md) 了解。
## 特别注意事项!!!
在 QueryWrapper 的条件构建中,如果传入 null 值,则自动忽略该条件,这有许多的好处,不需要额外的通过 `when()` 方法判断。但是也带来一些额外的知识记忆点,
因此,正对这一点需要特别注意一下。
例如:
稍微复杂点的示例:
```java
String userName = null;
Integer id = null;
QueryWrapper query1 = QueryWrapper.create()
.where(ACCOUNT.AGE.ge(18))
.and(ACCOUNT.USER_NAME.like(userName))
.and(ACCOUNT.ID.ge(id));
QueryWrapper query2 = QueryWrapper.create()
.where(ACCOUNT.AGE.ge(18));
QueryWrapper query = QueryWrapper.create()
.from(Article.class)
.leftJoin(Account.class).as("a").on(
wrapper -> wrapper.where(Account::getId).eq(Article::getAccountId)
)
.where(Account::getId).ge(100, If::notEmpty)
.and(wrapper -> {
wrapper.where(Account::getId).ge(100)
.or(Account::getAge).gt(200)
.and(Article::getAccountId).eq(200)
.or(wrapper1 -> {
wrapper1.where(Account::getId).like("a", If::notEmpty);
})
;
});
System.out.println(query.toSQL());
```
在以上的 `query1``query2` 中,它们构建出来的 SQL 条件是完全一致的,因为 MyBatis-Flex 会自动忽略 null 值的条件。
SQL 输入内容如下:
```sql
SELECT * FROM `tb_article`
LEFT JOIN `tb_account` AS `a` ON `a`.`id` = `tb_article`.`account_id`
WHERE `a`.`id` >= 100 AND
(`a`.`id` >= 100
OR `a`.`age` > 200
AND `tb_article`.`account_id` = 200
OR (`a`.`id` LIKE '%a%' )
)
```
## QueryWrapper 序列化
@ -617,4 +655,39 @@ byte[] bytes = fst.asByteArray(wrapper);
//反序列化得到 QueryWrapper
QueryWrapper newWrapper = (QueryWrapper) fst.asObject(bytes);
```
```
## 特别注意事项!!!
在 QueryWrapper 的条件构建中,如果传入 null 值,则自动忽略该条件,这有许多的好处,不需要额外的通过 `when()` 方法判断。但是也带来一些额外的知识记忆点,
因此,正对这一点需要特别注意一下。
例如:
```java
String userName = null;
Integer id = null;
QueryWrapper query1 = QueryWrapper.create()
.where(ACCOUNT.AGE.ge(18))
.and(ACCOUNT.USER_NAME.like(userName))
.and(ACCOUNT.ID.ge(id));
QueryWrapper query2 = QueryWrapper.create()
.where(ACCOUNT.AGE.ge(18));
```
在以上的 `query1``query2` 中,它们构建出来的 SQL 条件是完全一致的,因为 MyBatis-Flex 会自动忽略 null 值的条件。
## 存在疑问?
**疑问1示例代码中的 QueryWrapper 所需要的 "ACCOUNT" 从哪里来的?**
MyBatis-Flex 使用了 APTAnnotation Processing Tool在项目编译的时候
会自动根据 Entity 类定义的字段生成 "ACCOUNT" 类以及 Entity 对应的 Mapper 类, 通过开发工具构建项目(如下图),
或者执行 maven 编译命令: `mvn clean package` 都可以自动生成。这个原理和 lombok 一致。
![](../../assets/images/build_idea.png)
> 更多关于 APT 的配置,请进入 [APT 配置章节](../others/apt.md) 了解。

View File

@ -108,7 +108,13 @@ public class EntityTestStarter {
// System.out.println(object);
//
QueryWrapper asWrapper1 = QueryWrapper.create()
QueryWrapper query1 = QueryWrapper.create();
query1.where(Account::getId).ge(100)
.and(Account::getUserName).like("michael")
.or(Account::getUserName).like(null,If::notNull);
System.out.println(query1.toSQL());
QueryWrapper query = QueryWrapper.create()
// .select(ARTICLE.ALL_COLUMNS)
// .select(ACCOUNT.USER_NAME.as(ArticleDTO::getAuthorName)
// , ACCOUNT.AGE.as(ArticleDTO::getAuthorAge)
@ -116,19 +122,18 @@ public class EntityTestStarter {
// )
.from(Article.class)
// .leftJoin(Account.class).as("a").on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID))
.leftJoin(Account.class).as("a").on(s -> s.where(Account::getId).eq(Article::getAccountId))
.leftJoin(Account.class).as("a").on(wrapper -> wrapper.where(Account::getId).eq(Article::getAccountId))
.where(Account::getId).ge(100, If::notEmpty)
.and(queryWrapper -> {
queryWrapper
.where(Account::getId).ge(100)
.and(wrapper -> {
wrapper.where(Account::getId).ge(100)
.or(Account::getAge).gt(200)
.and(Article::getAccountId).eq(200)
.or(queryWrapper1 -> {
queryWrapper1.where(Account::getId).like("a",If::notEmpty);
.or(wrapper1 -> {
wrapper1.where(Account::getId).like("a", If::notEmpty);
})
;
});
System.out.println(asWrapper1.toSQL());
System.out.println(query.toSQL());
// .and(query->query.and);
// .andEq(Account::getId,100);
// .and(new Brackets(column))