首先,MyBatis中模糊查询使用CONCAT('%',#{str},'%')是比较常见的一种方式,但是在实际应用中,如果不注意一些细节,就容易出现错误。
问题现象:当使用如下代码时,查询结果为空:
<select id="findByNameLike" parameterType="java.lang.String"
resultType="com.example.User">
SELECT * FROM user WHERE username LIKE CONCAT('%',#{name},'%')
</select>
这种问题的原因是,MyBatis的占位符#{}将传入的参数当作一个字符串处理,如果传入的值为null,那么在进行模糊查询时,会报出语法错误,从而导致查询结果为空。
解决方案一:
为了解决该问题,可以将#{}占位符转化为${}占位符,如下所示:
<select id="findByNameLike" parameterType="java.lang.String"
resultType="com.example.User">
SELECT * FROM user WHERE username LIKE CONCAT('%', '${name}', '%')
</select>
使用${}占位符,解析器会将传入的参数当作文本来处理,如果传入的值为null,则最终生成的sql语句中就不会出现该值,从而避免了语法错误。这种方式的缺点是存在sql注入的风险,应用时需要谨慎操作。
示例一:
假设我们要查询所有用户名中包含“admin”关键词的用户信息,可以使用以下代码:
<select id="findAdminUsers" parameterType="java.lang.String" resultType="com.example.User">
SELECT * FROM user
WHERE username LIKE CONCAT('%', '${name}', '%')
</select>
然后在Java中执行:
List<User> adminUsers = sqlSession.selectList("findAdminUsers", "admin");
解决方案二:
另一种方式是使用IF标签来判断传入的值是否为null,如下所示:
<select id="findByNameLike" parameterType="java.lang.String"
resultType="com.example.User">
SELECT * FROM user
<if test="name != null">
WHERE username LIKE CONCAT('%', #{name}, '%')
</if>
</select>
如果传入的值为null,则不会执行if语句块中的代码,从而避免了语法错误,同时也不存在sql注入的风险。
示例二:
假设我们要查询用户名中包含关键词的用户信息,如果没有传入关键词,则返回所有用户信息,可以使用以下代码:
<select id="findUsers" parameterType="java.lang.String" resultType="com.example.User">
SELECT * FROM user
<if test="name != null">
WHERE username LIKE CONCAT('%', #{name}, '%')
</if>
</select>
然后在Java中执行:
List<User> users = sqlSession.selectList("findUsers", null);
List<User> adminUsers = sqlSession.selectList("findUsers", "admin");
以上就是MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解决攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)出错的解决 - Python技术站