diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index fecc130e..10d4188c 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -54,6 +54,9 @@ export default defineConfig({ { text: 'SQL 审计', link: '/zh/audit' }, { text: '多数据源', link: '/zh/multi-datasource' }, { text: '事务管理', link: '/zh/tx' }, + { text: '字段权限', link: '/zh/columns_permission' }, + { text: '字段加密', link: '/zh/columns_encrypt' }, + { text: '字典回显', link: '/zh/columns_dict' }, ] }, { diff --git a/docs/zh/columns_dict.md b/docs/zh/columns_dict.md new file mode 100644 index 00000000..90bb6f5a --- /dev/null +++ b/docs/zh/columns_dict.md @@ -0,0 +1,50 @@ +# 字典回写 + +字典回写,指的是在一个实体类中,可能会有很多业务字段,当我们发现有某个数据库字段赋值后,主动去为业务赋值。 + +比如,在数据库存有一个字段为 sex,类型为 int,用于保存用户的性别,0 :女,1 :男,2 :未知。 同时,在 entity 实体类中,还存在一个业务属性 sexString,用于在前台显示,那么我们使用如下的解决方案。 + + +**step 1:** 为实体类编写一个 set 监听器(`SetListener`) + +```java +public class AccountOnSetListener implements SetListener { + @Override + public Object onSet(Object entity, String property, Object value) { + Account account = (Account) entity; + if (property.equals("sex") && value != null){ + switch (value){ + case 0: + account.setSexString('女'); + break; + case 1: + account.setSexString('男'); + break; + default: + account.setSexString('未知'); + } + } + return value; + } +} +``` + +**step 2:** 为实体类配置 `onSet` 监听 + +```java 1 +@Table(value = "tb_account", onSet = AccountOnSetListener.class) +public class Account { + + @Id(keyType = KeyType.Auto) + private Long id; + + private int sex; + + @Column(ignore = true) //非数据库字段,需配置忽略该属性 + private String sexString; + + //getter setter +} +``` + +更多的 `onSet` 还可以参考 [这里](./table.md)。 \ No newline at end of file diff --git a/docs/zh/columns_encrypt.md b/docs/zh/columns_encrypt.md new file mode 100644 index 00000000..271a709a --- /dev/null +++ b/docs/zh/columns_encrypt.md @@ -0,0 +1,41 @@ +# 字段加密 + +字段加密,指的是数据库在存入了明文内容,但是当我们进行查询时,返回的内容为加密内容,而非明文内容。 + +以下是 MyBatis-Flex 字段加密示例: + +**step 1:** 为实体类编写一个 set 监听器(`SetListener`) + +```java +public class AccountOnSetListener implements SetListener { + @Override + public Object onSet(Object entity, String property, Object value) { + + if (value != null){ + //对字段内容进行加密 + value = encrypt(value); + } + + return value; + } +} +``` + +**step 2:** 为实体类配置 `onSet` 监听 + +```java 1 +@Table(value = "tb_account", onSet = AccountOnSetListener.class) +public class Account { + + @Id(keyType = KeyType.Auto) + private Long id; + + private String userName; + + private String password; + + //getter setter +} +``` + +更多的 `onSet` 还可以参考 [这里](./table.md)。 \ No newline at end of file diff --git a/docs/zh/columns_permission.md b/docs/zh/columns_permission.md new file mode 100644 index 00000000..83263fd6 --- /dev/null +++ b/docs/zh/columns_permission.md @@ -0,0 +1,51 @@ +# 字段权限 + +字段权限,指的是在一张表中设计了许多字段,但是不同的用户(或者角色)查询,返回的字段结果是不一致的。 +比如说:tb_account 表中,有 user_name 和 password 字段,但是 password 字段只允许用户本人查询, +或者超级管理员查询,这种场景下,我们会用到 字段权限 的功能。 + +在 `@Table()` 注解中,有一个配置名为 `onSet`,用于设置这张表的 `设置` 监听,这里的 `设置` 监听指的是: +当我们使用 sql 、调用某个方法去查询数据,得到的数据内容映射到 entity 实体,mybatis 通过 setter 方法去设置 entity 的值时的监听。 + + +以下是示例: + +**step 1:** 为实体类编写一个 set 监听器(`SetListener`) + +```java +public class AccountOnSetListener implements SetListener { + @Override + public Object onSet(Object entity, String property, Object value) { + if (property.equals("password")){ + + //去查询当前用户的权限 + boolean hasPasswordPermission = getPermission(); + + //若没有权限,则把数据库查询到的 password 内容修改为 null + if (!hasPasswordPermission){ + value = null; + } + } + return value; + } +} +``` + +**step 2:** 为实体类配置 `onSet` 监听 + +```java 1 +@Table(value = "tb_account", onSet = AccountOnSetListener.class) +public class Account { + + @Id(keyType = KeyType.Auto) + private Long id; + + private String userName; + + private String password; + + //getter setter +} +``` + +更多的 `onSet` 还可以参考 [这里](./table.md)。 \ No newline at end of file diff --git a/docs/zh/table.md b/docs/zh/table.md index fa0b794f..01d04d03 100644 --- a/docs/zh/table.md +++ b/docs/zh/table.md @@ -109,8 +109,13 @@ public class MyInsertListener implements InsertListener { ## onSet -onSet 可以用于配置:查询数据 entity (或者 entity 列表、分页等)时,对 entity 的属性设置的监听,这种场景 -可以用于一些数据转换,业务字段赋值、字段权限等场景。 +onSet 可以用于配置:查询数据 entity (或者 entity 列表、分页等)时,对 entity 的属性设置的监听,可以用于如下的差场景。 + +- 场景1:字段权限,不同的用户或者角色可以查询不同的字段内容。 +- 场景2:字典回显,entity 中定义许多业务字段,当数据库字段赋值时,主动去设置业务字段。 +- 场景3:一对多,一对一查询,entity 中定义关联实体,在监听到字段赋值时,主动去查询关联表赋值。 +- 场景4:字段加密,监听到内容被赋值时,对内容进行加密处理。 +- 场景5:字段脱敏,出字段内容进行脱敏处理 示例代码如下: diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountOnSetListener.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountOnSetListener.java index 96e94020..522e6c23 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountOnSetListener.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountOnSetListener.java @@ -5,7 +5,6 @@ import com.mybatisflex.annotation.SetListener; public class AccountOnSetListener implements SetListener { @Override public Object onSet(Object entity, String property, Object value) { -// System.out.println(">>>>>>> entity: " + entity); System.out.println(">>>>>>> property: " + property +" value:" + value); return value; }