Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
yangyang0507 committed May 13, 2024
1 parent 363e5ca commit dfdbec0
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 33 deletions.
56 changes: 48 additions & 8 deletions src/content/docs/plugins/data-change-recorder.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,57 @@ sidebar:
order: 6
---

## DataChangeRecorderInnerInterceptor
在数据库操作中,记录数据变动和控制操作的安全性是非常重要的。MyBatis-Plus 提供了一个数据变动记录插件 `DataChangeRecorderInnerInterceptor`,它不仅能够自动记录操作日志,还支持安全阈值控制,例如限制批量更新或插入的数量。

> 插件为安全控制一部分,会自动记录操作日志,支持安全阈值控制,例如场景: 限制批量更新插入数量不超过 1000 条记录。
插件地址 👉 [DataChangeRecorderInnerInterceptor](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataChangeRecorderInnerInterceptor.java)
## 插件简介

测试用例 👉 [testOptLocker4WrapperIsNull](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java)
`DataChangeRecorderInnerInterceptor` 是 MyBatis-Plus 提供的一个拦截器,它可以在执行数据库操作时自动记录数据变动,并且可以根据配置的安全阈值来控制操作,比如限制一次批量更新或插入的记录数不超过 1000 条。

为了更好地理解如何使用 `DataChangeRecorderInnerInterceptor`,你可以参考官方提供的测试用例:

::: warning 注意事项:
- 👉 [testOptLocker4WrapperIsNull](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java)

- 查阅插件主体部分使用说明,注入数据变动记录插件
这个测试用例展示了如何使用插件进行数据变动记录和安全控制

:::
## 如何使用

### 配置拦截器

在你的 Spring Boot 配置类中,添加 `DataChangeRecorderInnerInterceptor` 到拦截器链中,并根据需要配置安全阈值:

```java
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DataChangeRecorderInnerInterceptor dataChangeRecorderInnerInterceptor = new DataChangeRecorderInnerInterceptor();
// 配置安全阈值,例如限制批量更新或插入的记录数不超过 1000 条
dataChangeRecorderInnerInterceptor.setBatchUpdateLimit(1000);
interceptor.addInnerInterceptor(dataChangeRecorderInnerInterceptor);
return interceptor;
}
}
```

在这个例子中,我们设置了批量操作的安全阈值为 1000 条记录。

### 使用插件

配置好插件之后使用 MyBatis-Plus 提供的 CRUD 方法,插件会自动记录数据变动并执行安全控制:

当执行批量更新或插入操作时,如果操作的记录数超过了配置的安全阈值,插件会抛出异常。

## 注意事项

- 确保在配置拦截器时设置了合适的安全阈值,以防止不安全的批量操作。
- 插件会自动记录数据变动,但你需要自行实现日志记录的逻辑。
- 在配置和使用插件时,要考虑到数据库的性能和操作的实际需求。

`DataChangeRecorderInnerInterceptor` 是一个强大的工具,它可以帮助你自动记录数据变动并控制操作的安全性。通过合理配置,你可以确保数据库操作的安全性和数据的完整性。记得在使用时遵循最佳实践,确保系统的安全性和稳定性。
75 changes: 66 additions & 9 deletions src/content/docs/plugins/data-permission.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@ sidebar:
order: 4
---

## DataPermissionInterceptor
DataPermissionInterceptor 是 MyBatis-Plus 提供的一个插件,用于实现数据权限控制。它通过拦截执行的 SQL 语句,并动态拼接权限相关的 SQL 片段,来实现对用户数据访问的控制。

> 插件原理和租户插件类似动态拦截执行 `SQl` 然后拼接权限部分 `SQL片段` , 该插件一直是免费开源的,`企业高级特性-数据范围`功能也是基于该原理实现,只不过添加了注解支持。
插件地址 👉 [DataPermissionInterceptor](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataPermissionInterceptor.java)
## 插件原理

测试用例 👉 [DataPermissionInterceptorTest](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/DataPermissionInterceptorTest.java)
DataPermissionInterceptor 的工作原理与租户插件类似,它会在 SQL 执行前拦截 SQL 语句,并根据用户权限动态添加权限相关的 SQL 片段。这样,只有用户有权限访问的数据才会被查询出来。

- 核心代码 `SQL片段` 组装逻辑如下:
## 插件地址和测试用例

```
- **插件地址**[DataPermissionInterceptor](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataPermissionInterceptor.java)
- **测试用例**[DataPermissionInterceptorTest](https://gitee.com/baomidou/mybatis-plus/blob/3.0/mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/DataPermissionInterceptorTest.java)

## 核心代码
以下是 SQL 片段组装的核心逻辑代码:

```java
new DataPermissionInterceptor(new MultiDataPermissionHandler() {

@Override
Expand All @@ -36,8 +40,61 @@ new DataPermissionInterceptor(new MultiDataPermissionHandler() {
});
```

::: warning 注意事项:
:::note

- 查阅插件主体部分使用说明,注入数据权限插件,自定义执行 `SQL` 语句拼装
仔细阅读插件的主要部分使用说明,确保正确注入数据权限插件,并自行定制 `SQL` 拼装逻辑

:::

## JSQLParser
**JSQLParser** 是一个开源的 SQL 解析库,可方便地解析和修改 SQL 语句。它是插件实现权限逻辑的关键工具,MyBatis-Plus 的数据权限依托于 JSQLParser 的解析能力。

以下示例展示如何使用 JSQLParser 来修改 `SQL`

```java
// 示例 SQL
String sql = "SELECT * FROM user WHERE status = 'active'";
Expression expression;

try {
expression = CCJSqlParserUtil.parseCondExpression("status = 'inactive'");
PlainSelect select = (PlainSelect) ((Select) CCJSqlParserUtil.parse(sql)).getSelectBody();
select.setWhere(expression);

System.out.println(select); // 输出:SELECT * FROM user WHERE status = 'inactive'
} catch (JSQLParserException e) {
e.printStackTrace();
}
```

## 使用方法

### 第一步:实现数据权限逻辑
自定义 `MultiDataPermissionHandler`,实现特定业务逻辑。

```java
public class CustomDataPermissionHandler extends MultiDataPermissionHandler {
@Override
public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {
// 在此处编写自定义数据权限逻辑
try {
String sqlSegment = "..."; // 数据权限相关的 SQL 片段
return CCJSqlParserUtil.parseCondExpression(sqlSegment);
} catch (JSQLParserException e) {
e.printStackTrace();
return null;
}
}
}
```

### 第二步:注册数据权限拦截器
将自定义的处理器注册到 `DataPermissionInterceptor` 中。

```java
// 在 MyBatis 配置中
Interceptor dataPermissionInterceptor = new DataPermissionInterceptor(new CustomDataPermissionHandler());
mybatisConfiguration.addInterceptor(dataPermissionInterceptor);
```

通过使用 DataPermissionInterceptor,你可以轻松地在 MyBatis-Plus 应用中实现数据权限控制,确保用户只能访问其权限范围内的数据,从而提高数据的安全性。
76 changes: 69 additions & 7 deletions src/content/docs/plugins/dynamic-table-name.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,77 @@ sidebar:
order: 5
---

## DynamicTableNameInnerInterceptor
在数据库应用程序开发中,我们有时需要根据不同的条件查询不同的表。MyBatis-Plus 提供了一个动态表名插件 `DynamicTableNameInnerInterceptor`,它允许我们在运行时动态地改变 SQL 语句中的表名,这对于处理分表逻辑非常有用。

简单示例:
## 插件简介

👉 [mybatis-plus-sample-dynamic-tablename](https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-dynamic-tablename)
`DynamicTableNameInnerInterceptor` 是 MyBatis-Plus 提供的一个拦截器,它可以在执行 SQL 语句之前,根据配置的规则动态地替换表名。这个功能在处理分表逻辑时非常有用,比如根据日期将数据存储在不同的表中。

::: warning 注意事项:
## 快速开始

- 原理为解析替换设定表名为处理器的返回表名,表名建议可以定义复杂一些避免误替换
- 例如:真实表名为 user 设定为 mp_dt_user 处理器替换为 user_2019 等
### 配置拦截器

:::
在你的 Spring Boot 配置类中,添加 `DynamicTableNameInnerInterceptor` 到拦截器链中,并配置表名处理器:

```java
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
// 获取参数方法
Map<String, Object> paramMap = RequestDataHelper.getRequestData();
paramMap.forEach((k, v) -> System.err.println(k + "----" + v));

String year = "_2018";
int random = new Random().nextInt(10);
if (random % 2 == 1) {
year = "_2019";
}
return tableName + year;
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptor;
}
}
```

在这个例子中,我们定义了一个表名处理器,它会根据随机数决定将表名后缀设置为 `_2018``_2019`

### 使用动态表名

在你的 Mapper 接口中,不需要特别指定动态表名,因为表名将在运行时由拦截器动态处理。

```java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
// ...
}
```

当执行查询时,MyBatis-Plus 会自动将表名替换为实际的表名。

## 注意事项

- 为了防止误替换,建议将动态表名定义得复杂一些,例如使用前缀 `mp_dt_`
- 确保你的表名规则不会导致 SQL 注入等安全问题。
- 在配置动态表名时,要考虑到数据库的兼容性,确保替换后的表名符合数据库的命名规则。

## 示例项目

为了更好地理解如何使用 `DynamicTableNameInnerInterceptor`,你可以参考官方提供的示例项目:

- 👉 [mybatis-plus-sample-dynamic-tablename](https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-dynamic-tablename)

这个示例项目展示了如何根据年份动态地查询不同的用户表。

`DynamicTableNameInnerInterceptor` 是一个强大的工具,它可以帮助你轻松地处理动态表名的场景。通过合理配置,你可以让 MyBatis-Plus 自动为你处理复杂的分表逻辑,从而提高开发效率。记得在使用时遵循最佳实践,确保系统的安全性和稳定性。
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ sidebar:
order: 2
---

import SupportDb from '@/components/SupportDb.astro';

MyBatis-Plus 的分页插件 `PaginationInnerInterceptor` 提供了强大的分页功能,支持多种数据库,使得分页查询变得简单高效。

## 支持的数据库

`PaginationInnerInterceptor` 支持广泛的数据库,包括但不限于:

- MySQL, Oracle, DB2, H2, HSQL, SQLite, PostgreSQL, SQLServer, Phoenix, Gauss
- Clickhouse, Sybase, OceanBase, Firebird, Cubrid, Goldilocks, CSIIDB, Informix, TDengine, Redshift
- 达梦数据库, 虚谷数据库, 人大金仓数据库, 南大通用(华库)数据库, 南大通用数据库, 神通数据库, 瀚高数据库, 优炫数据库, 星瑞格数据库
<SupportDb />

如果你需要支持的数据库不在列表中,可以通过 [Pull Request](https://github.com/baomidou/mybatis-plus/pull/1550/files) 请求添加。

Expand Down Expand Up @@ -86,11 +86,11 @@ List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);

| 属性名 | 类型 | 默认值 | 描述 |
| :-: | :-: | :-: | :-: |
| records | List<T> | emptyList | 查询数据列表 |
| records | List&#60;T&#62; | emptyList | 查询数据列表 |
| total | Long | 0 | 查询列表总记录数 |
| size | Long | 10 | 每页显示条数,默认 10 |
| current | Long | 1 | 当前页 |
| orders | List<OrderItem> | emptyList | 排序字段信息 |
| orders | List&#60;OrderItem&#62; | emptyList | 排序字段信息 |
| optimizeCountSql | boolean | true | 自动优化 COUNT SQL |
| optimizeJoinOfCountSql | boolean | true | 自动优化 COUNT SQL 是否把 join 查询部分移除 |
| searchCount | boolean | true | 是否进行 count 查询 |
Expand Down
4 changes: 2 additions & 2 deletions src/content/docs/reference/question.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,15 @@ mybatis-plus:
- 异常二:
```log
```txt
Injection of autowired
```
原因:低版本不支持泛型注入,请升级 Spring 版本到 4+ 以上。
- 异常三:
```log
```txt
java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.getDefaultScriptingLanguageInstance() Lorg/apache/ibatis/scripting/LanguageDriver
```
Expand Down
4 changes: 2 additions & 2 deletions src/content/docs/resources/support.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ sidebar:
如果您正在使用这个项目并感觉良好,或者是想支持我们继续开发,您可以通过如下`任意`方式支持我们:

1. Star 并向您的朋友推荐或分享 [MyBatis-Plus](https://github.com/baomidou/mybatis-plus) 🚀
2. 轻轻点击一次页面右下角(ad) 🙃
2. 轻轻点击一次页面中的广告 🙃
3. 通过以下二维码进行一次性捐款,请我们喝一杯咖啡 ☕️

非常感谢! ❤️

<img align="center" height="400px" src="/img/donate.png"/>
<img align="center" height="400px" src="/images/content/donate.png"/>

### 成为赞助商

Expand Down

0 comments on commit dfdbec0

Please sign in to comment.