mybatis 参数绑定错误示范(1) - 详解

采用xml形式的mybatis

错误示例:

server伪代码为:

Map<
String, Object> findMapNew = MapUtil.<
String, Object>builder()
.put("applyUnit", appUnit)
.put("planYear", year != null ? year : -1)
.put("code", code)
.build();
List<
YearPlan> planList= planDao.checkByMap(findMapNew);

xml

select
t.*
from plan_year t
<where>
  t.del_flag = 0
  and t.status = #{status}
    <if test="applyUnit != null and applyUnit != '' ">
    and t.apply_unit = #{applyUnit}
  </if>
    <if test="planYear != null ">
    and t.plan_Year = #{planYear}
  </if>
    <if test="code != null and code != '' ">
    and t.code = #{code}
  </if>
</where>

此时,映射的最终sql如下:

select
t.*
from plan_year t
where
t.del_flag = 0
and t.status = '111111222222' ## 单位id
and t.apply_unit = 2025 ## 年份
and t.plan_Year = 'AABBCCDD' ## CODE

最终报错类型错误

解决方案:
修改xml:
xml

select
t.*
from plan_year t
<where>
  t.del_flag = 0
    <if test="status != null ">
    and t.status = #{status}
  </if>
    <if test="applyUnit != null and applyUnit != '' ">
    and t.apply_unit = #{applyUnit}
  </if>
    <if test="planYear != null ">
    and t.plan_Year = #{planYear}
  </if>
    <if test="code != null and code != '' ">
    and t.code = #{code}
  </if>
</where>

最终执行正确的sql如下:

select
t.*
from plan_year t
where
t.del_flag = 0
and t.apply_unit = '111111222222' ## 单位id
and t.plan_Year = 2025 ## 年份
and t.CODE = 'AABBCCDD' ## CODE

原因分析

由于第一次没有对status参数进行判空,导致mybatis在替换参数时用了顺序执行的原则,导致错误产生。
后面修修改了这个错误,进行所有参数进行了判空,正确替换了在server层定义的参数。最终sql按照预期执行。

posted @ 2025-07-22 10:08  wzzkaifa  阅读(20)  评论(0)    收藏  举报