在切面中通过参数ProceedingJoinPoint 如何取出sql
时间: 2023-11-09 18:25:06 浏览: 166
自定义注解实现拦截sql.rar
在切面中,可以通过参数ProceedingJoinPoint来获取被拦截的方法的相关信息,包括方法名、参数等信息。但是,如果要获取方法执行时的SQL语句,需要根据具体的情况来进行处理。
一种常见的方式是在切面中获取Spring框架提供的JdbcTemplate实例,然后通过JdbcTemplate的query、update等方法执行SQL语句,这样就可以在切面中直接获取执行的SQL语句。代码示例如下:
```java
@Aspect
@Component
public class SqlAspect {
private static final Logger logger = LoggerFactory.getLogger(SqlAspect.class);
@Autowired
private JdbcTemplate jdbcTemplate;
@Around("execution(* com.example.service.*.*(..))")
public Object logSql(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
try {
// 获取执行的SQL语句
String sql = getSql(joinPoint);
logger.info("SQL: {}", sql);
// 执行原来的方法
result = joinPoint.proceed();
} catch (Throwable e) {
logger.error("error", e);
throw e;
}
return result;
}
/**
* 获取执行的SQL语句
*/
private String getSql(ProceedingJoinPoint joinPoint) {
// 获取方法参数
Object[] args = joinPoint.getArgs();
// 判断方法参数
if (args != null && args.length > 0) {
Object arg = args[0];
if (arg instanceof String) {
// 直接返回SQL语句
return (String) arg;
} else if (arg instanceof SqlParameterSource) {
// 使用JdbcTemplate获取SQL语句
SqlParameterSource parameterSource = (SqlParameterSource) arg;
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
return namedParameterJdbcTemplate.getJdbcOperations().getDataSource().getConnection().nativeSQL(namedParameterJdbcTemplate.getNamedParameterJdbcOperations().getSql());
}
}
return null;
}
}
```
在上述代码中,使用了JdbcTemplate和NamedParameterJdbcTemplate来执行SQL语句,并且通过NamedParameterJdbcTemplate.getNamedParameterJdbcOperations().getSql()方法获取SQL语句。需要注意的是,获取SQL语句的方式可能因数据库查询方式的不同而有所不同,需要根据具体情况进行调整。
阅读全文