使用MyBatis批量插入数据,MyBatis拦截器失效?

使用MyBatis批量插入数据,MyBatis拦截器失效?
问题描述:我在项目中写了一个MyBatis的拦截器(插件),作用是在插入或更新数据时自动填充id、create_by、create_time等基础字段的值,代码如下:

@Component

@Intercepts({

@Signature(type = Executor.class,method = "update",args = {MappedStatement.class, Object.class})

})

public class MyBatisAutoFillPlugin implements Interceptor {

@Override

public Object intercept(Invocation invocation) throws Throwable {

// 被代理的对象

Object target = invocation.getTarget();

// 被代理的方法

Method method = invocation.getMethod();

// 被代理的方法执行参数

Object[] args = invocation.getArgs();

if (!(args.length > 1)){

return invocation.proceed();

}

MappedStatement mappedStatement = (MappedStatement) args[0];

Object paramObj = args[1];

if (paramObj instanceof BaseEntity){

// 获取登录用户

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

SysLoginUser sysLoginUser = (SysLoginUser) authentication.getPrincipal();

BaseEntity entity = (BaseEntity) paramObj;

Date now = new Date();

// 判断sql语句

if (Objects.equals(SqlCommandType.INSERT,sqlCommandType)){

entity.setId(IdGenerator.getId());

entity.setStatus(CommonStatusEnum.NORMAL.getCode());

entity.setCreateBy(sysLoginUser.getId());

entity.setCreateTime(now);

}else if (Objects.equals(SqlCommandType.UPDATE,sqlCommandType)){

entity.setUpdateBy(sysLoginUser.getId());

entity.setUpdateTime(now);

}

}

// 调用实际业务方法

Object result = invocation.proceed();

return result;

}

}

当我在Mapper中写了一个批量插入的方法,执行后拦截器却失效了,导致我的基础字段无法赋值,这是什么原因?

<!-- 批量插入 -->

<insert id="insertBatch">

insert into sys_user_role

( id,user_id,role_id

,status,create_time,create_by

,update_time,update_by) values

<foreach collection="list" separator="," item="item">

(#{item.id},#{item.userId},

#{item.roleId},

#{item.status}, #{item.createTime},#{item.createBy},

#{item.updateTime},#{item.updateBy})

</foreach>

</insert>

我尝试使用单个插入的方法,这是可以的。

<!-- 单个记录插入 -->

<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.ss.sys.modular.role.entity.UserRole" useGeneratedKeys="true">

insert into sys_user_role

( id,user_id,role_id

,status,create_time,create_by

,update_time,update_by)

values (#{id,jdbcType=BIGINT},#{userId,jdbcType=BIGINT},#{roleId,jdbcType=BIGINT}

,#{status,jdbcType=TINYINT},#{createTime,jdbcType=TIMESTAMP},#{createBy,jdbcType=BIGINT}

,#{updateTime,jdbcType=TIMESTAMP},#{updateBy,jdbcType=BIGINT})

</insert>


回答:

找到原因了,在@Intercepts注解添加要拦截的StatementHandler方法即可

@Intercepts({

@Signature(type = Executor.class,method = "update",args = {MappedStatement.class, Object.class}),

@Signature(type = StatementHandler.class,method = "update",args = {Statement.class})

})

public class MyBatisAutoFillPlugin implements Interceptor {

// some code...

}


回答:

if (paramObj instanceof BaseEntity)

这里问题吧,入参是个集合

以上是 使用MyBatis批量插入数据,MyBatis拦截器失效? 的全部内容, 来源链接: utcz.com/p/945500.html

回到顶部