MyBatisPlus又在搞事了!发布神器,一个依赖轻松搞定权限问题( 二 )


@GetMapping("/info")
public String info(Article article) throws Exception {
return ParamsConfig.toJson(article);
}
// 添加一个敏感词然后再去观察是否生效 http://localhost:8080/add
// 观察【猫】这个词被过滤了 http://localhost:8080/info?content=%E7%8E%8B%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
// 嵌套敏感词处理 http://localhost:8080/info?content=%E7%8E%8B%E7%8C%AB%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
// 多层嵌套敏感词 http://localhost:8080/info?content=%E7%8E%8B%E7%8E%8B%E7%8C%AB%E5%AE%89%E7%9F%B3%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
@GetMapping("/add")
public String add() throws Exception {
Long id = 3L;
if (null == sensitiveWordsMapper.selectById(id)) {
System.err.println("插入一个敏感词:" + sensitiveWordsMapper.insert(new SensitiveWords(id, "猫")));
// 插入一个敏感词 , 刷新算法引擎敏感词
SensitiveWordsProcessor.reloadSensitiveWords();
}
return "ok";
}
// 测试访问下面地址观察控制台( 请求json参数 )
// idea 执行 resources 目录 TestJson.http 文件测试
@PostMapping("/json")
public String json(@RequestBody Article article) throws Exception {
return ParamsConfig.toJson(article);
}
}
 
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) VALUESn" +
"(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 层添加注解 , 按需求指哪打哪!!
 
@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));
}


推荐阅读