Skip to content

feat: 取消拦截器方式, 无法实现全局设置updateBy、updateTime, 因为boundSql已经生成 #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 14, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 0 additions & 116 deletions docs/extend/2.common-field-setter.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,119 +70,3 @@ public class CommonFieldSetterSqlSourceCustomize implements SqlSourceCustomize {
```

2. 基于SPI机制,在classPath下创建`META-INF/services/io.mybatis.provider.SqlSourceCustomize`文件,文件内输入 `io.mybatis.provider.SqlSourceCustomize` 的实现类,如:`com.l1yp.mybatis.mapper.CommonFieldSetterSqlSourceCustomize`

### 1.2.2 基于mybatis原生拦截器

> 拦截ParameterHandler的setParameters方法即可

```java
package org.apache.ibatis.executor.parameter;

import java.sql.PreparedStatement;
import java.sql.SQLException;

public interface ParameterHandler {

Object getParameterObject();

void setParameters(PreparedStatement ps) throws SQLException;

}
```

> 实现方案
```JAVA
@Intercepts({
@Signature(
type = ParameterHandler.class,
method = "setParameters",
args = { PreparedStatement.class }
),
})
@Slf4j
@Component
public class ParameterizeInterceptor implements Interceptor {

private static final String CREATE_BY = "createBy";
private static final String UPDATE_BY = "updateBy";

private static final String CREATE_TIME = "createTime";
private static final String UPDATE_TIME = "updateTime";

@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取this对象,可能是Proxy
ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
if (Proxy.isProxyClass(parameterHandler.getClass())) {
InvocationHandler invocationHandler = Proxy.getInvocationHandler(parameterHandler);
/**
* 由于Interceptor接口的plugin默认方法对目标对象进行包装代理。
* 因此此处需要读取Plugin内的Target对象
* default Object plugin(Object target) {
* return Plugin.wrap(target, this);
* }
*/
if (invocationHandler instanceof Plugin) {
Field targetField = ReflectionUtils.findField(invocationHandler.getClass(), "target");
if (targetField != null) {
targetField.setAccessible(true);
parameterHandler = (ParameterHandler) targetField.get(invocationHandler);
}
}
}

// 获取MappedStatement对象,用于判断执行的SQL命令信息
MappedStatement mappedStatement = getMappedStatement(parameterHandler);
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
// 获取当前参数对象
Object parameterObject = parameterHandler.getParameterObject();
if (sqlCommandType == SqlCommandType.INSERT || sqlCommandType == SqlCommandType.UPDATE) {
MetaObject metaObject = mappedStatement.getConfiguration().newMetaObject(parameterObject);
// AbstractModel是我项目的数据库实体的父类,内部含有createBy、createTime字段
// TODO: 自行修改此处逻辑,如判断字段是否存在
if (parameterObject instanceof AbstractModel<?,?> && sqlCommandType == SqlCommandType.INSERT) {
setCommonField(metaObject, CREATE_BY, LoginUtils.getLoginUserId());
setCommonField(metaObject, CREATE_TIME, LocalDateTime.now());
}
if (sqlCommandType == SqlCommandType.UPDATE) {
if (parameterObject instanceof AbstractWithUpdateModel<?>) {
setCommonField(metaObject, UPDATE_BY, LoginUtils.getLoginUserId());
setCommonField(metaObject, UPDATE_TIME, LocalDateTime.now());
} else {
// 处理非AbstractWithUpdateModel子类也需要自动填充的字段
if (metaObject.hasSetter(UPDATE_BY)) {
setCommonField(metaObject, UPDATE_BY, LoginUtils.getLoginUserId());
}
if (metaObject.hasSetter(UPDATE_TIME)) {
setCommonField(metaObject, UPDATE_TIME, LoginUtils.getLoginUserId());
}
}



}

}

return invocation.proceed();
}


private void setCommonField(MetaObject metaObject, String field, Object value) {
Object createBy = metaObject.getValue(field);
if (createBy == null) {
metaObject.setValue(field, value);
}
}


private MappedStatement getMappedStatement(ParameterHandler parameterHandler) throws NoSuchFieldException, IllegalAccessException {
Field mappedStatementField = parameterHandler.getClass().getDeclaredField("mappedStatement");
mappedStatementField.setAccessible(true);
return (MappedStatement) mappedStatementField.get(parameterHandler);
}

}

```