From 8c91f9554c27097b3096b2d14980b8155193aa05 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 25 Jul 2023 13:34:51 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20Active=20Record=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.ts | 1 + docs/zh/base/active-record.md | 141 ++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 docs/zh/base/active-record.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 7bb627d8..b0277067 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -63,6 +63,7 @@ export default defineConfig({ {text: 'QueryWrapper', link: '/zh/base/querywrapper'}, {text: 'QueryWrapperChain', link: '/zh/base/query-wrapper-chain'}, {text: 'Db + Row', link: '/zh/base/db-row'}, + {text: 'Active Record', link: '/zh/base/active-record'}, {text: 'IService', link: '/zh/base/service'}, {text: 'SpringBoot 配置文件', link: '/zh/base/configuration'}, {text: 'MyBatisFlexCustomizer', link: '/zh/base/mybatis-flex-customizer'}, diff --git a/docs/zh/base/active-record.md b/docs/zh/base/active-record.md new file mode 100644 index 00000000..d8148ba7 --- /dev/null +++ b/docs/zh/base/active-record.md @@ -0,0 +1,141 @@ +# Active Record + +[Active Record 模式](http://www.martinfowler.com/eaaCatalog/activeRecord.html)出自 Martin Fowler +写的《[企业应用架构模式](https://book.douban.com/subject/4826290/)》书中。在 Active Record +模式中,对象中既有持久存储的数据,也有针对数据的操作。Active Record 模式把数据存取逻辑作为对象的一部分,处理对象的用户知道如何把数据写入数据库,还知道如何从数据库中读出数据。 + +在 MyBatis-Flex 中实现 Active Record +功能十分简单,只需继承 [Model](https://gitee.com/mybatis-flex/mybatis-flex/blob/main/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/Model.java) +即可。 + +::: tip 注意事项 + +- 使用 Active Record 功能时,项目中必须注入对应实体类的 BaseMapper 对象! +- 如果不想手动创建 Mapper 接口,可以使用 [APT](../others/apt.md#配置文件和选项) 辅助生成。 + ::: + +## 使用示例 + +在以下示例当中,使用了 [Lombok](https://www.projectlombok.org/) 对实体类进行了增强,以便我们全链式调用: + +1. `@Table` 标记了实体类对应的数据表。 +2. `@Data` 为我们生成了 setter/getter、toString、equals、hashCode 等方法, + 其中 `staticConstructor = "create"` 为我们创建了一个 `create()` 静态方法用于链式调用。 +3. `@Accessors(chain = true)` 为我们开启了 `return this;` 这样既可以被序列化,又可以链式调用。 + +```java + +@Table("tb_account") +@Accessors(chain = true) +@Data(staticConstructor = "create") +public class Account extends Model { + + @Id(keyType = KeyType.Auto) + private Long id; + private String userName; + private Integer age; + private Date birthday; + +} +``` + +这样我们就可以流畅的使用 Active Record 功能了: + +```java +@RestController +@RequestMapping("/account") +public class AccountController { + + @PostMapping("save") + public boolean save(@RequestBody Account account) { + return account.save(); + } + +} +``` + +## 保存数据 + +`Model` 提供了 `save` 方法来保存数据,调用该方法前需要将保存数据填充: + +```java +Account.create() + .setUserName("张三") + .setAge(18) + .setBirthday(new Date()) + .save(); +``` + +## 删除数据 + +`Model` 提供了 `remove` 方法来删除数据: + +- 根据主键删除 + +```java +Account.create() + .setId(1L) + .removeById(); +``` + +- 根据条件删除 + +```java +Account.create() + .where(Account::getId).eq(1L) + .remove(); +``` + +## 更新数据 + +`Model` 提供了 `update` 方法来更新数据,调用该方法前需要将更新数据填充: + +- 根据主键更新 + +```java +Account.create() + .setId(1L) + .setAge(100) + .updateById(); +``` + +- 根据条件更新 + +```java +Account.create() + .setAge(100) + .where(Account::getId).eq(1L) + .update(); +``` + +## 查询数据 + +### 查询一条数据 + +`Model` 提供了 `one` 方法来查询一条数据: + +```java +Account.create() + .where(Account::getId).eq(1L) + .one(); +``` + +### 查询多条数据 + +`Model` 提供了 `list` 方法来查询多条数据: + +```java +Account.create() + .where(Account::getAge).ge(18) + .list(); +``` + +### 查询分页数据 + +`Model` 提供了 `page` 方法来查询分页数据: + +```java +Account.create() + .where(Account::getAge).ge(18) + .page(Page.of(1,10)); +```