我正在使用 MyBatis 并希望在“创建”、“修改”的每个表上实现 2 个字段。它们都是日期字段。有没有办法在插入或更新时自动更新这些字段?当然,我可以调整映射,但我想知道是否有更通用和 DRY 的方式来做到这一点?
问问题
12130 次
2 回答
9
不,如果您不编写 sql 映射来更新列,mybatis 没有自动执行此操作的机制。
一种替代方法是数据库触发器。不过,我不确定我是否会推荐,我们只是在 sql 映射中对其进行编码。
您可以像这样在 SQL 映射中对其进行编码,
<insert id="someInsert">
insert into dummy_table
(
SOME_COLUMN,
CREATED_DT
)
values
(
#{someValue},
sysdate
)
</insert>
或者,
<update id="someUpdate">
update some_table
set some_column = #{someValue}, modified=sysdate
where some_id = #{someId}
</update>
于 2011-08-23T15:50:25.850 回答
2
您可以使用 mybatis 拦截器
,这是我的示例(使用 springboot):
在 mycase 中,BaseEntity 是所有实体的超类,我需要在 mybatis 更新或插入数据库之前做一些事情。
第 1 步:在 BaseEntity 中创建用于更新或插入的 init 方法
public class BaseEntity{
private Date created;
private Date updated;
//getter,setter
public void initCreateEntity() {
this.created = new Date()
this.updated = new Date()
}
public void initUpdateEntity() {
this.created = new Date()
this.updated = new Date()
}
}
第二步:添加一个mybatis拦截器
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
/**
* add time interceptor for update
*/
@Intercepts(@Signature(type = Executor.class, method = "update", args={MappedStatement.class, Object.class}))
public class BaseEntityInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0];
// get sql
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
// get parameter , this is the target object that you want to handle
Object parameter = invocation.getArgs()[1];
// make sure super class is BaseEntity
if (parameter instanceof BaseEntity) {
//init
BaseEntity baseEntity = (BaseEntity) parameter;
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
baseEntity.initCreateEntity();
} else if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
baseEntity.initUpdateEntity();
}
}
return invocation.proceed();
}
@Override
public Object plugin(Object o) {
return Plugin.wrap(o, this);
}
@Override
public void setProperties(Properties properties) {
}
}
第 3 步:在 springboot 配置中添加到 bean Context
@Configuration
public class MyBatisConfig {
@Bean
public BaseEntityInterceptor baseEntityInterceptor() {
return new BaseEntityInterceptor();
}
}
第 4 步:Dao 和 Mapper.xml
//base update or insert sql incloude column created and updated
如:道
@Mapper
public interface BaseDao {
int update(BaseEntity baseEntity);
}
映射器.xml
<update id="update" parameterType="com.package.to.BaseEntity">
update baseentity_table set created = #{createTime, jdbcType=TIMESTAMP}
updated = #{createTime, jdbcType=TIMESTAMP}
</update>
第五步:测试
baseDao.update(new BaseEntity);
更多信息在这里:https ://mybatis.org/mybatis-3/configuration.html#plugins
于 2019-12-31T13:20:36.533 回答