问题背景
在前后端联调过程中,前端传递的参数在后端断点调试时能够正确接收,但在 MyBatis 的mapper.xml文件中,条件拼接却失效。原本使用常见的<if>标签检查参数是否为空,但始终无法生效。
原因分析
常见的<if test="dto.acb21a!=null and dto.acb21a!=''">写法在某些情况下可能无法正确判断字符串是否为空或空白。尤其是在参数为字符串类型时,空字符串或空白字符的判断可能不够严谨,导致条件逻辑未按预期执行。
解决方案
改用org.apache.commons.lang3.StringUtils工具类的isNotBlank方法,可以更严格地判断字符串是否非空且非空白。以下是优化后的代码示例:
<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(dto.acb21a)"> <choose> <when test='dto.acb21a == "2"'> AND (BCC21B BETWEEN 1700 AND 1999 OR BCC21A BETWEEN 1700 AND 1999) </when> <when test='dto.acb21a == "3"'> AND (BCC21B BETWEEN 2000 AND 2999 OR BCC21A BETWEEN 2000 AND 2999) </when> <when test='dto.acb21a == "4"'> AND (BCC21B BETWEEN 3000 AND 4499 OR BCC21A BETWEEN 3000 AND 4499) </when> <when test='dto.acb21a == "5"'> AND (BCC21B BETWEEN 4500 AND 5999 OR BCC21A BETWEEN 4500 AND 5999) </when> <when test='dto.acb21a == "6"'> AND (BCC21B BETWEEN 6000 AND 7999 OR BCC21A BETWEEN 6000 AND 7999) </when> <when test='dto.acb21a == "7"'> AND (BCC21B BETWEEN 8000 AND 9999 OR BCC21A BETWEEN 8000 AND 9999) </when> <when test='dto.acb21a == "8"'> AND (BCC21B BETWEEN 10000 AND 14999 OR BCC21A BETWEEN 10000 AND 14999) </when> <when test='dto.acb21a == "9"'> AND (BCC21B >= 15000 OR BCC21A >= 15000) </when> </choose> </if>关键点说明
字符串判断优化
StringUtils.isNotBlank方法会检查字符串是否为null、空字符串或仅包含空白字符,比手动判断更可靠。动态 SQL 逻辑清晰
使用<choose>和<when>标签实现多条件分支,逻辑清晰且易于维护。依赖引入
确保项目中已引入org.apache.commons.lang3依赖,例如 Maven 配置:<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
适用场景
此方案适用于以下情况:
- 需要严格判断字符串参数是否有效。
- 动态 SQL 中需根据参数值实现多分支条件逻辑。
- 避免因参数为空或空白导致 SQL 拼接异常。
通过这种方法,可以显著提升 MyBatis 动态 SQL 的健壮性和可读性。