SpringBoot整合MybatisSQL过滤@Intercepts的实现
场景:
系统模块查询数据库需要根据用户的id去筛选数据。那么如果在每个sql加user_id的过滤显然不明确。所以要在查询前将sql拼接上条件,做统一管理。
开发环境:
springboot+mybatis
只需一个拦截类即可搞定(在看代码前需要了解注解@Intercepts()):
@Component
@Intercepts({@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})
publicclassSqlInterceptorimplementsInterceptor{
privateLoggerlogger=LoggerFactory.getLogger(SqlInterceptor.class);
@Override
publicObjectintercept(Invocationinvocation)throwsThrowable{
logger.info("Interceptor......");
//获取sql
MappedStatementmappedStatement=(MappedStatement)invocation.getArgs()[0];
Objectparameter=invocation.getArgs()[1];
BoundSqlboundSql=mappedStatement.getBoundSql(parameter);
Stringoldsql=boundSql.getSql();
logger.info("old:"+oldsql);
//判断sql是否有where条件。改变sql。
booleanstatus=oldsql.toLowerCase().contains("where");
if(status){
BoundSqlnewBoundSql=newBoundSql(mappedStatement.getConfiguration(),oldsql+"and1=1",
boundSql.getParameterMappings(),boundSql.getParameterObject());
MappedStatementnewMs=copyFromMappedStatement(mappedStatement,newBoundSqlSqlSource(newBoundSql));
invocation.getArgs()[0]=newMs;
}
//继续执行
Objectresult=invocation.proceed();
returnresult;
}
@Override
publicObjectplugin(Objecttarget){
returnPlugin.wrap(target,this);
}
@Override
publicvoidsetProperties(Propertiesproperties){
}
//复制原始MappedStatement
privateMappedStatementcopyFromMappedStatement(MappedStatementms,SqlSourcenewSqlSource){
MappedStatement.Builderbuilder=newMappedStatement.Builder(ms.getConfiguration(),ms.getId(),newSqlSource,
ms.getSqlCommandType());
builder.resource(ms.getResource());
builder.fetchSize(ms.getFetchSize());
builder.statementType(ms.getStatementType());
builder.keyGenerator(ms.getKeyGenerator());
if(ms.getKeyProperties()!=null){
for(StringkeyProperty:ms.getKeyProperties()){
builder.keyProperty(keyProperty);
}
}
builder.timeout(ms.getTimeout());
builder.parameterMap(ms.getParameterMap());
builder.resultMaps(ms.getResultMaps());
builder.cache(ms.getCache());
builder.useCache(ms.isUseCache());
returnbuilder.build();
}
publicstaticclassBoundSqlSqlSourceimplementsSqlSource{
BoundSqlboundSql;
publicBoundSqlSqlSource(BoundSqlboundSql){
this.boundSql=boundSql;
}
publicBoundSqlgetBoundSql(ObjectparameterObject){
returnboundSql;
}
}
}
这样重启访问即可发现每次查询都会走这边!
到此这篇关于SpringBoot整合MybatisSQL过滤@Intercepts的实现的文章就介绍到这了,更多相关SpringBootMybatisSQL过滤@Intercepts内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。