mybatis 拦截器如何通过Invocation获取执行sql并将?替换成参数内容
时间: 2024-05-28 08:09:43 浏览: 249
Mybatis 拦截器可以通过 Invocation 对象获取执行的 SQL 语句,然后将其中的 ? 替换为参数内容。
具体实现步骤如下:
1. 获取原始的 SQL 语句
在 Invocation 对象中,我们可以通过调用其 getArgs() 方法获取执行方法的参数数组,其中包含了原始的 SQL 语句。
2. 获取参数列表
通过 getArgs() 方法获取的参数数组中,除了原始的 SQL 语句,还包含了方法的参数。我们可以通过遍历数组获取参数列表。
3. 替换参数
使用参数列表中的参数值,替换 SQL 语句中的 ? 占位符。
4. 返回处理后的 SQL 语句
最终,拦截器需要将处理后的 SQL 语句返回给 Mybatis 执行引擎。
通过这种方式,我们可以在 Mybatis 执行 SQL 语句之前或之后,对 SQL 语句进行处理,并且可以将一些通用的功能,比如 SQL 记录、SQL 注入检查等,封装到拦截器中,提高代码的复用性和可维护性。
相关问题
mybatis 拦截器如何通过Invocation获取执行的没有占位符的sql
MyBatis拦截器可以通过Invocation对象的proceed()方法获取执行的没有占位符的SQL,具体实现方法如下:
1.编写自己的拦截器类,实现Interceptor接口并实现intercept()方法。
2.在拦截器中,通过Invocation对象的proceed()方法获取执行方法的返回值,并将其转换成MappedStatement类型。
3.通过MappedStatement对象的getBoundSql()方法获取SQL语句的信息,包括SQL语句本身和参数值等。
4.通过获取到的SQL语句信息,就可以对SQL进行处理或者记录日志等操作。
mybatis 拦截器如何通过Invocation获取完整sql
语句并进行修改?
Mybatis拦截器可以通过Invocation对象获取完整的SQL语句并进行修改。在拦截器的intercept方法中,可以获取到方法调用的相关信息,包括Mapper接口、方法名、方法参数等。通过这些信息,可以获取到BoundSql对象,它包含了原始的SQL语句和参数信息。可以通过BoundSql对象获取完整的SQL语句并进行修改,然后再将修改后的SQL语句设置回BoundSql对象即可。
具体实现可以参考以下代码:
```
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
Object parameterObject = args[1];
BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
String sql = boundSql.getSql();
// 在这里对SQL语句进行修改
String newSql = modifySql(sql);
// 将修改后的SQL语句重新设置回BoundSql对象中
BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), newSql, boundSql.getParameterMappings(), parameterObject);
MappedStatement newMappedStatement = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql));
args[0] = newMappedStatement;
return invocation.proceed();
}
private String modifySql(String sql) {
// 在这里可以对SQL语句进行修改,例如添加分页的limit条件
return "select * from (" + sql + ") limit 0, 10";
}
private MappedStatement copyFromMappedStatement(MappedStatement mappedStatement, SqlSource newSqlSource) {
MappedStatement.Builder builder = new MappedStatement.Builder(mappedStatement.getConfiguration(), mappedStatement.getId(), newSqlSource, mappedStatement.getSqlCommandType());
builder.resource(mappedStatement.getResource());
builder.fetchSize(mappedStatement.getFetchSize());
builder.statementType(mappedStatement.getStatementType());
builder.keyGenerator(mappedStatement.getKeyGenerator());
builder.keyProperty(mappedStatement.getKeyProperty());
builder.timeout(mappedStatement.getTimeout());
builder.parameterMap(mappedStatement.getParameterMap());
builder.resultMaps(mappedStatement.getResultMaps());
builder.cache(mappedStatement.getCache());
builder.useCache(mappedStatement.isUseCache());
return builder.build();
}
```
阅读全文