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 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 ## where select
```java ```java
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
@ -533,36 +550,57 @@ Firebird 下执行的代码如下:
SELECT * FROM "tb_account" ORDER BY "id" DESC ROWS 20 TO 30 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 类, 通过开发工具构建项目(如下图), ```java
或者执行 maven 编译命令: `mvn clean package` 都可以自动生成。这个原理和 lombok 一致。 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 ```java
String userName = null; QueryWrapper query = QueryWrapper.create()
Integer id = null; .from(Article.class)
QueryWrapper query1 = QueryWrapper.create() .leftJoin(Account.class).as("a").on(
.where(ACCOUNT.AGE.ge(18)) wrapper -> wrapper.where(Account::getId).eq(Article::getAccountId)
.and(ACCOUNT.USER_NAME.like(userName)) )
.and(ACCOUNT.ID.ge(id)); .where(Account::getId).ge(100, If::notEmpty)
.and(wrapper -> {
QueryWrapper query2 = QueryWrapper.create() wrapper.where(Account::getId).ge(100)
.where(ACCOUNT.AGE.ge(18)); .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 序列化 ## QueryWrapper 序列化
@ -617,4 +655,39 @@ byte[] bytes = fst.asByteArray(wrapper);
//反序列化得到 QueryWrapper //反序列化得到 QueryWrapper
QueryWrapper newWrapper = (QueryWrapper) fst.asObject(bytes); 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); // 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(ARTICLE.ALL_COLUMNS)
// .select(ACCOUNT.USER_NAME.as(ArticleDTO::getAuthorName) // .select(ACCOUNT.USER_NAME.as(ArticleDTO::getAuthorName)
// , ACCOUNT.AGE.as(ArticleDTO::getAuthorAge) // , ACCOUNT.AGE.as(ArticleDTO::getAuthorAge)
@ -116,19 +122,18 @@ public class EntityTestStarter {
// ) // )
.from(Article.class) .from(Article.class)
// .leftJoin(Account.class).as("a").on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID)) // .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) .where(Account::getId).ge(100, If::notEmpty)
.and(queryWrapper -> { .and(wrapper -> {
queryWrapper wrapper.where(Account::getId).ge(100)
.where(Account::getId).ge(100)
.or(Account::getAge).gt(200) .or(Account::getAge).gt(200)
.and(Article::getAccountId).eq(200) .and(Article::getAccountId).eq(200)
.or(queryWrapper1 -> { .or(wrapper1 -> {
queryWrapper1.where(Account::getId).like("a",If::notEmpty); wrapper1.where(Account::getId).like("a", If::notEmpty);
}) })
; ;
}); });
System.out.println(asWrapper1.toSQL()); System.out.println(query.toSQL());
// .and(query->query.and); // .and(query->query.and);
// .andEq(Account::getId,100); // .andEq(Account::getId,100);
// .and(new Brackets(column)) // .and(new Brackets(column))