1. 字符串比较的陷阱与MyBatis解决方案
在数据库操作中,字符串比较是最基础却最容易踩坑的操作之一。很多开发者在MyBatis中直接使用==进行字符串比较,结果发现明明看起来相同的字符串却返回false。这背后涉及Java字符串内存机制和MyBatis参数处理的深层原理。
上周我就遇到一个典型案例:用户状态过滤查询中,status == 'active'的判断始终不生效。通过断点调试发现,MyBatis生成的参数对象中,字符串字段被包装成了新的String实例。这就引出了我们今天要讨论的核心问题——在MyBatis框架中如何正确进行字符串等值判断。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MyBatis字符串处理机制解析
2.1 MyBatis参数包装原理
当MyBatis处理Mapper接口方法调用时,所有参数都会被包装成ParamMap对象。即使你直接传入String参数:
java复制@Select("SELECT * FROM users WHERE status = #{status}")
List<User> findByStatus(String status);
MyBatis在底层会通过MetaObject将参数值重新包装。对于字符串类型,相当于执行了new String(original)的操作。这就导致:
java复制String param1 = "active";
String param2 = new String("active");
System.out.println(param1 == param2); // false
2.2 OGNL表达式中的比较
在MyBatis动态SQL中,<if>标签的条件判断使用OGNL表达式引擎。其==操作符的行为与Java保持一致,比较的是对象引用而非内容。这就是为什么以下写法不可靠:
xml复制<if test="status == 'active'">
AND is_active = 1
</if>
3. 四种正确比较方案及适用场景
3.1 使用equals()方法
最直接的解决方案是调用String的equals方法:
xml复制<if test="'active'.equal
