1. Основные функции
- привязка словаря
- шифрование поля
- Десенсибилизация данных
- Динамическое обслуживание структуры таблицы
- Записи аудита данных
- Объем данных (разрешения на доступ к данным)
- Подтаблица базы данных, динамический источник данных, разделение чтения и записи, автоматическое переключение проверки работоспособности базы данных.
2. Используйте
2.1 Импорт зависимостей
- Spring Boot представляет пакеты автоматических аннотаций зависимостей
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-mate-starter</artifactId>
<version>1.0.8</version>
</dependency>
- Аннотация (используется субподрядной организацией)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-mate-annotation</artifactId>
<version>1.0.8</version>
</dependency>
2.2 Привязка словаря
- Например, результат словаря секса типа user_sex сопоставляется со свойством sexText.
@FieldDict(type = "user_sex", target = "sexText")
private Integer sex;
private String sexText;
- Реализуйте интерфейс IDataDict, чтобы предоставить источник данных словаря и внедрить его в контейнер Spring.
@Component
public class DataDict implements IDataDict {
/**
* 从数据库或缓存中获取
*/
private Map<String, String> SEX_MAP = new ConcurrentHashMap<String, String>() {{
put("0", "女");
put("1", "男");
}};
@Override
public String getNameByCode(FieldDict fieldDict, String code) {
System.err.println("字段类型:" + fieldDict.type() + ",编码:" + code);
return SEX_MAP.get(code);
}
}
2.3 Шифрование поля
Аннотацию атрибута @FieldEncrypt можно зашифровать и сохранить, а результат запроса будет автоматически расшифрован.Он поддерживает глобальную настройку алгоритма ключа шифрования и алгоритма ключа аннотации, а также может реализовывать IEncryptor внедрение пользовательских алгоритмов.
@FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
private String password;
2.4 Десенсибилизация данных
- Аннотация атрибута @FieldSensitive может автоматически снижать чувствительность исходных данных в соответствии с заданной стратегией.По умолчанию SensitiveType имеет 9 встроенных стратегий снижения чувствительности. Например: китайское имя, номер счета банковской карты, номер мобильного телефона, номер фиксированной линии, почтовый адрес, электронная почта, идентификационный номер, пароль, номерной знак Стратегия десенсибилизации, вы также можете настроить стратегию следующим образом:
@FieldSensitive(type = "testStrategy")
private String username;
@FieldSensitive(type = SensitiveType.mobile)
private String mobile;
- Пользовательская стратегия десенсибилизации testStrategy добавляется к стратегии по умолчанию и внедряется в контейнер Spring.
@Configuration
public class SensitiveStrategyConfig {
/**
* 注入脱敏策略
*/
@Bean
public ISensitiveStrategy sensitiveStrategy() {
// 自定义 testStrategy 类型脱敏处理
return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
}
}
2.5 Автоматическое обслуживание структуры данных DDL
- Решите инициализацию структуры таблицы обновлений, проблемы с обновлением версии SQL, в настоящее время поддерживаются MySql, PostgreSQL.
@Component
public class PostgresDdl implements IDdl {
/**
* 执行 SQL 脚本方式
*/
@Override
public List<String> getSqlFiles() {
return Arrays.asList(
// 内置包方式
"db/tag-schema.sql",
// 文件绝对路径方式
"D:\\db\\tag-data.sql"
);
}
}
- Не только фиксированное исполнение, но и динамическое исполнение! !
ddlScript.run(new StringReader("DELETE FROM user;\n" +
"INSERT INTO user (id, username, password, sex, email) VALUES\n" +
"(20, 'Duo', '123456', 0, 'Duo@baomidou.com');"));
- Это конец? ? Конечно нет, он также поддерживает выполнение с несколькими источниками данных! ! !
@Component
public class MysqlDdl implements IDdl {
@Override
public void sharding(Consumer<IDdl> consumer) {
// 多数据源指定,主库初始化从库自动同步
String group = "mysql";
ShardingGroupProperty sgp = ShardingKey.getDbGroupProperty(group);
if (null != sgp) {
// 主库
sgp.getMasterKeys().forEach(key -> {
ShardingKey.change(group + key);
consumer.accept(this);
});
// 从库
sgp.getSlaveKeys().forEach(key -> {
ShardingKey.change(group + key);
consumer.accept(this);
});
}
}
/**
* 执行 SQL 脚本方式
*/
@Override
public List<String> getSqlFiles() {
return Arrays.asList("db/user-mysql.sql");
}
}
2.6 Динамическое свободное переключение ведущий-ведомый с несколькими источниками данных
- Аннотация @Sharding поддерживает одно предложение, поэтому источник данных можно свободно использовать и переключать. !
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {
@Sharding("postgres")
Long selectByUsername(String username);
}
- Вы также можете настроить стратегию и отправить войска
@Component
public class MyShardingStrategy extends RandomShardingStrategy {
/**
* 决定切换数据源 key {@link ShardingDatasource}
*
* @param group 动态数据库组
* @param invocation {@link Invocation}
* @param sqlCommandType {@link SqlCommandType}
*/
@Override
public void determineDatasourceKey(String group, Invocation invocation, SqlCommandType sqlCommandType) {
// 数据源组 group 自定义选择即可, keys 为数据源组内主从多节点,可随机选择或者自己控制
this.changeDatabaseKey(group, sqlCommandType, keys -> chooseKey(keys, invocation));
}
}
Вы можете включить стратегию master-slave, и, конечно же, вы можете включить проверку работоспособности! ! !
2.7 Права на данные
- Добавьте аннотации к слою картографа:
// 测试 test 类型数据权限范围,混合分页模式
@DataScope(type = "test", value = {
// 关联表 user 别名 u 指定部门字段权限
@DataColumn(alias = "u", name = "department_id"),
// 关联表 user 别名 u 指定手机号字段(自己判断处理)
@DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> page, Long id, @Param("name") String username);
- Смоделируйте логику бизнес-процессинга:
@Bean
public IDataScopeProvider dataScopeProvider() {
return new AbstractDataScopeProvider() {
@Override
protected void setWhere(PlainSelect plainSelect, Object[] args, DataScopeProperty dataScopeProperty) {
// args 中包含 mapper 方法的请求参数,需要使用可以自行获取
/*
// 测试数据权限,最终执行 SQL 语句
SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5'))
AND u.mobile LIKE '%1533%'
*/
if ("test".equals(dataScopeProperty.getType())) {
// 业务 test 类型
List<DataColumnProperty> dataColumns = dataScopeProperty.getColumns();
for (DataColumnProperty dataColumn : dataColumns) {
if ("department_id".equals(dataColumn.getName())) {
// 追加部门字段 IN 条件,也可以是 SQL 语句
Set<String> deptIds = new HashSet<>();
deptIds.add("1");
deptIds.add("2");
deptIds.add("3");
deptIds.add("5");
ItemsList itemsList = new ExpressionList(deptIds.stream().map(StringValue::new).collect(Collectors.toList()));
InExpression inExpression = new InExpression(new Column(dataColumn.getAliasDotName()), itemsList);
if (null == plainSelect.getWhere()) {
// 不存在 where 条件
plainSelect.setWhere(new Parenthesis(inExpression));
} else {
// 存在 where 条件 and 处理
plainSelect.setWhere(new AndExpression(plainSelect.getWhere(), inExpression));
}
} else if ("mobile".equals(dataColumn.getName())) {
// 支持一个自定义条件
LikeExpression likeExpression = new LikeExpression();
likeExpression.setLeftExpression(new Column(dataColumn.getAliasDotName()));
likeExpression.setRightExpression(new StringValue("%1533%"));
plainSelect.setWhere(new AndExpression(plainSelect.getWhere(), likeExpression));
}
}
}
}
};
}
- Окончательный вывод выполнения SQL:
SELECT u.* FROM user u
WHERE (u.department_id IN ('1', '2', '3', '5'))
AND u.mobile LIKE '%1533%' LIMIT 1, 10
3. Наконец
Всем привет, я Dream TechnologyБрат Чун(micaМикросервисный компонент с открытым исходным кодом автор) Я используюmybatis-plus
Прошло более 4 лет (старший старший фанат),mybatis-plus
Это помогает нам значительно повысить эффективность разработки, унифицировать стиль разработки кода внутри предприятия и снизить затраты на обслуживание.
Если у всех в компании естьmybatis-mate
Используйте сцену, возможно, вы захотите ее поддержать. Болееmybatis-mate
Примеры использования см.git ee.com/secret all/no…