MetaObjectHandler给公共字段赋值成功 但是insert语句中还是没有公共字段的赋值
时间: 2023-08-04 19:28:51 浏览: 104
在CRUD操作中与业务无关的SQL字段赋值的方法
如果您使用了 MyBatis 的 MetaObjectHandler 接口来实现自动填充公共字段,但是在执行 insert 操作时,insert 语句中仍然没有公共字段的赋值,可能是由于 MyBatis 的插件配置不正确导致的。
具体来说,如果您使用了 MyBatis 的插件来实现 MetaObjectHandler 的自动注入,需要在插件的 `interceptor()` 方法中进行相应的设置,例如:
```java
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取当前的 MappedStatement 对象
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 获取当前操作的 SQL 语句
String sql = mappedStatement.getBoundSql().getSql();
// 如果是 insert 操作,则调用 MetaObjectHandler 进行公共字段填充
if (sql.startsWith("insert")) {
// 获取当前的参数对象
Object parameterObject = invocation.getArgs()[1];
if (parameterObject != null) {
// 创建 MetaObject 对象
MetaObject metaObject = SystemMetaObject.forObject(parameterObject);
// 获取 createTime 和 updateTime 字段的值,并进行赋值操作
if (metaObject.hasSetter("createTime")) {
metaObject.setValue("createTime", new Date());
}
if (metaObject.hasSetter("updateTime")) {
metaObject.setValue("updateTime", new Date());
}
}
}
// 继续执行原方法
return invocation.proceed();
}
}
```
在上述示例中,我们定义了一个 MyBatis 插件,并在 `intercept()` 方法中对 insert 操作进行了特殊处理。具体来说,我们通过获取当前操作的 SQL 语句,判断是否为 insert 操作。如果是 insert 操作,则获取参数对象并通过 MetaObjectHandler 接口来进行公共字段填充。最后,我们继续执行原方法并返回相应的结果。
需要注意的是,如果您使用了插件来实现 MetaObjectHandler 的自动注入,需要将插件添加到 MyBatis 的插件列表中,并在 MyBatis 的配置文件中进行相应的配置。同时,如果您在实体类中定义了 createTime 和 updateTime 字段,需要为其添加 `@TableField(fill = FieldFill.INSERT)` 注解,以便 MyBatis 在执行 insert 操作时能够自动填充相应的值。
阅读全文