}
}
public long getMaxTime() {
return maxTime;
}
public PerformanceInterceptor setMaxTime(long maxTime) {
this.maxTime = maxTime;
return this;
}
public boolean isFormat() {
return format;
}
public PerformanceInterceptor setFormat(boolean format) {
this.format = format;
return this;
}
public boolean isWriteInLog() {
return writeInLog;
}
public PerformanceInterceptor setWriteInLog(boolean writeInLog) {
this.writeInLog = writeInLog;
return this;
}
public Method getMethodRegular(Class<?> clazz, String methodName) {
if (Object.class.equals(clazz)) {
return null;
}
for (Method method : clazz.getDeclaredMethods()) {
if (method.getName().equals(methodName)) {
return method;
}
}
return getMethodRegular(clazz.getSuperclass(), methodName);
}
/**
* 获取sql语句开头部分
*
* @param sql
* @return
*/
private int indexOfSqlStart(String sql) {
String upperCaseSql = sql.toUpperCase();
Set<Integer> set = new HashSet<>();
set.add(upperCaseSql.indexOf("SELECT "));
set.add(upperCaseSql.indexOf("UPDATE "));
set.add(upperCaseSql.indexOf("INSERT "));
set.add(upperCaseSql.indexOf("DELETE "));
set.remove(-1);
if (CollectionUtils.isEmpty(set)) {
return -1;
}
List<Integer> list = new ArrayList<>(set);
Collections.sort(list, Integer::compareTo);
return list.get(0);
}
private final static SqlFormatter sqlFormatter = new SqlFormatter();
/**
* 格式sql
*
* @param boundSql
* @param format
* @return
*/
public static String sqlFormat(String boundSql, boolean format) {
if (format) {
try {
return sqlFormatter.format(boundSql);
} catch (Exception ignored) {
}
}
return boundSql;
}
}
使用:
@RestController
@AllArgsConstructor
public class TestController {
private BuyService buyService;
// 数据库 test 表 t_order 在事务一致情况无法插入数据 , 能够插入说明多数据源事务无效
// 测试访问 http://localhost:8080/test
// 制造事务回滚 http://localhost:8080/test?error=true 也可通过修改表结构制造错误
// 注释 ShardingConfig 注入 dataSourceProvider 可测试事务无效情况
@GetMapping("/test")
public String test(Boolean error) {
return buyService.buy(null != error && error);
}
}
2.8 数据权限
mapper 层添加注解:
// 测试 test 类型数据权限范围 , 混合分页模式
@DataScope(type = "test", value = https://www.isolves.com/it/cxkf/kj/2022-06-17/{
// 关联表 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");
推荐阅读
- 化妆|杨幂又在引领潮流!松紧发带+乐福鞋,成为一周标配
- 学会了MybatisPlus,代码开发效率提高了10倍
- 江疏影|新时代律政俏佳人上线!刘敏涛江疏影携手搞事业《女士的法则》大爽文来袭
- SpringBoot整合MybatisPlus基本的增删改查,保姆级教程
- SpringBoot整合MybatisPlus数据自动填充
- MybatisPlus中实体类属性对应枚举类实现
- 用了MybatisPlus后,我很久没有手写sql了
- 上饶又一网红打卡地,首家搞事情的辰色酒馆
- iPhone|iPhone 14细节曝光 摄像头留遗憾:苹果供应商近10亿元搞事
- 梦到喜欢的人离婚了,然后和自己在一起了 梦到离婚的人又在一起
