Mybatis当传入参数为0时,动态sql语句条件不生效解决办法

 总结:如果实体类中字段类型为Integer,如果前端传参为0,mysql会默认当成空字符串,如果此时动态sql条件为 <if test = "xxx !=null and xxx != ' ' ">,就会报错

解决办法,动态sql条件去调判断空字符串,只判断非null:

<if test="isDeleted != null">
    AND a.IS_DELETED = #{isDeleted,jdbcType=INTEGER}
</if>
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 中,可以通过拦截器(Interceptor)来对 SQL 执行过程进行干预和增强。如果你想在拦截器中添加额外的参数,可以按照以下步骤进行操作: 1. 创建一个实现了 `Interceptor` 接口的拦截器类,并实现其中的方法。最常用的方法是 `intercept`,该方法用于拦截 SQL 执行过程。 2. 在 `intercept` 方法中,你可以通过 `Invocation` 对象获取到当前执行的 SQL 相关信息,例如参数、Statement 对象等。 3. 在拦截器中添加额外的参数,可以通过以下方式实现: - 创建一个新的参数对象,将需要递的额外参数设置到该对象中。 - 调用 `Invocation` 对象的 `getArgs` 方法获取到方法的参数数组。 - 将新的参数对象添加到参数数组中,可以使用 `Arrays.copyOf` 方法来创建一个新的数组,并将新参数对象添加到数组末尾。 - 调用 `Invocation` 对象的 `proceed` 方法,传入修改后的参数数组,继续执行 SQL 语句。 4. 在 MyBatis 配置文件中配置拦截器。将自定义的拦截器添加到 `<plugins>` 标签中,并指定拦截的目标方法或语句。 下面是一个简单的示例代码,演示了如何在拦截器中添加额外参数: ```java @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) }) public class MyInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 获取参数 Object[] args = invocation.getArgs(); Connection connection = (Connection) args[0]; Integer transactionTimeout = (Integer) args[1]; // 添加额外参数 MyExtraParam extraParam = new MyExtraParam(); // 设置额外参数值 extraParam.setProperty("key", "value"); // 将新的参数对象添加到参数数组中 Object[] newArgs = Arrays.copyOf(args, args.length + 1); newArgs[args.length] = extraParam; // 修改参数并继续执行 SQL 语句 args[0] = connection; args[1] = transactionTimeout; invocation.proceed(); return null; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // 设置拦截器的属性 } } ``` 注意,以上示例代码仅为演示目的,并未完整实现拦截器的功能。你可以根据自己的需求进行修改和扩展。同,需要在 MyBatis 配置文件中配置该拦截器,使其生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值