给我写一个mybatis自定义拦截器,拦截新增和更新后的数据结果,获取到表名 数据主键id和数据结构
时间: 2024-11-30 14:18:14 浏览: 4
在MyBatis中,你可以创建一个自定义拦截器(Interceptor)来实现对数据操作特定步骤的拦截。这里是一个简单的例子,我们将创建一个拦截器来拦截`insert`和`update`操作,并获取插入或更新的数据信息:
首先,在项目中创建一个实现了`com.github.pagehelper.interceptor.Interceptor`接口的类,例如`CustomInterceptor.java`:
```java
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.session.RowBounds;
public class CustomInterceptor implements Interceptor {
private static final Log logger = LogFactory.getLog(CustomInterceptor.class);
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取SqlSession
SqlSession sqlSession = (SqlSession) invocation.getArgs()[0];
// 创建一个RowBounds实例来追踪当前操作
RowBounds rowBounds = new RowBounds();
// 调用原始的Mapper方法
try {
// 获取实际执行的SQL(如果使用了分页插件PageHelper,需要移除分页相关信息)
String originalSql = PageInterceptor.removePageInfo(invocation.getSignature().getActualMethodSignature(), sqlSession.getConfiguration().getLogPrefix());
Object parameter = invocation.getArgs()[1]; // 参数,通常这是你要操作的对象
// 执行业务逻辑,比如判断是否是insert或update操作
if (isInsertOrUpdate(originalSql)) {
// 拦截点:获取数据信息
String tableName = getTableName(originalSql);
Long id = extractId(parameter); // 提取主键ID(假设你的对象有getId()方法)
Object dataStructure = getDataStructure(parameter); // 提取数据结构,假设从对象中提取
logger.info("Intercepted operation: Insert/Update on table {} with ID {} and structure {}", tableName, id, dataStructure);
// 执行原操作并保存结果
Object result = sqlSession.execute(originalSql, parameter, rowBounds);
// 返回处理后的结果
return result;
} else {
// 非insert/update操作直接返回
return sqlSession.invoke(invocation.getMethod(), invocation.getArgs());
}
} finally {
sqlSession.close(); // 关闭SqlSession
}
}
// ...在这里添加辅助方法,如isInsertOrUpdate、getTableName、extractId和getDataStructure的具体实现
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 如果需要配置,可以在此设置属性
}
}
```
在这个例子中,你需要实现`isInsertOrUpdate`、`getTableName`、`extractId`和`getDataStructure`等方法来完成具体的逻辑,这取决于你的数据库查询结构和对象模型。
阅读全文