这样子获取到的sql是没有解析过占位符的sql,是带?的,有没有办法获取到解析后的sql
时间: 2024-04-09 09:33:31 浏览: 20
要获取解析后的SQL语句,可以使用MyBatis提供的`org.apache.ibatis.mapping.BoundSql`类的`getSql`方法。这个方法返回的是已经解析过占位符的SQL语句。
在拦截器中,可以通过`MappedStatement`对象获取到`BoundSql`对象,然后使用`getSql`方法获取解析后的SQL语句。以下是修改后的代码示例:
```java
public class MyInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取原始的MappedStatement对象
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 获取SQL语句类型
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
// 判断是否为delete语句
if (sqlCommandType == SqlCommandType.DELETE) {
// 获取BoundSql对象
BoundSql boundSql = mappedStatement.getBoundSql(invocation.getArgs()[1]);
// 获取解析后的SQL语句
String sql = boundSql.getSql();
// 在执行delete方法之前的操作
System.out.println("Before executing delete method");
System.out.println("Delete SQL: " + sql);
}
// 执行原始的delete方法
Object result = invocation.proceed();
// 在执行delete方法之后的操作
System.out.println("After executing delete method");
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置拦截器的属性
}
}
```
通过这种方式,你可以获取到已经解析过占位符的SQL语句。记得将拦截器配置到MyBatis的配置文件中,并替换示例中的`com.example.MyInterceptor`为你实际的拦截器类的全限定名。