springboot's mybatis 模糊查询
在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。 数据库表名为test_student,初始化了几条记录,如图: 起初我在MyBatis的mapper文件中是这样写的:<select id="searchStudents" resultType="com.exam...
在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。
数据库表名为test_student,初始化了几条记录,如图:

起初我在MyBatis的mapper文件中是这样写的:
-
<select id="searchStudents" resultType="com.example.entity.StudentEntity" -
parameterType="com.example.entity.StudentEntity"> -
SELECT * FROM test_student -
<where> -
<if test="age != null and age != '' and compare != null and compare != ''"> -
age -
${compare} -
#{age} -
</if> -
<if test="name != null and name != ''"> -
AND name LIKE '%#{name}%' -
</if> -
<if test="address != null and address != ''"> -
AND address LIKE '%#{address}%' -
</if> -
</where> -
ORDER BY id -
</select>
写完后自我感觉良好,很开心的就去跑程序了,结果当然是报错了: 
经百度得知,这么写经MyBatis转换后(‘%#{name}%’)会变为(‘%?%’),而(‘%?%’)会被看作是一个字符串,所以Java代码在执行找不到用于匹配参数的 ‘?’ ,然后就报错了。
解决方法
1.用${…}代替#{…}
-
<select id="searchStudents" resultType="com.example.entity.StudentEntity" -
parameterType="com.example.entity.StudentEntity"> -
SELECT * FROM test_student -
<where> -
<if test="age != null and age != '' and compare != null and compare != ''"> -
age -
${compare} -
#{age} -
</if> -
<if test="name != null and name != ''"> -
AND name LIKE '%${name}%' -
</if> -
<if test="address != null and address != ''"> -
AND address LIKE '%${address}%' -
</if> -
</where> -
ORDER BY id -
</select>
查询结果如下图: 
注:使用${…}不能有效防止SQL注入,所以这种方式虽然简单但是不推荐使用!!!
2.把’%#{name}%’改为”%”#{name}”%”
-
<select id="searchStudents" resultType="com.example.entity.StudentEntity" -
parameterType="com.example.entity.StudentEntity"> -
SELECT * FROM test_student -
<where> -
<if test="age != null and age != '' and compare != null and compare != ''"> -
age -
${compare} -
#{age} -
</if> -
<if test="name != null and name != ''"> -
AND name LIKE "%"#{name}"%" -
</if> -
<if test="address != null and address != ''"> -
AND address LIKE "%"#{address}"%" -
</if> -
</where> -
ORDER BY id -
</select>
查询结果: 
3.使用sql中的字符串拼接函数
-
<select id="searchStudents" resultType="com.example.entity.StudentEntity" -
parameterType="com.example.entity.StudentEntity"> -
SELECT * FROM test_student -
<where> -
<if test="age != null and age != '' and compare != null and compare != ''"> -
age -
${compare} -
#{age} -
</if> -
<if test="name != null and name != ''"> -
AND name LIKE CONCAT(CONCAT('%',#{name},'%')) -
</if> -
<if test="address != null and address != ''"> -
AND address LIKE CONCAT(CONCAT('%',#{address},'%')) -
</if> -
</where> -
ORDER BY id -
</select>
查询结果: 
4.使用标签
-
<select id="searchStudents" resultType="com.example.entity.StudentEntity" -
parameterType="com.example.entity.StudentEntity"> -
<bind name="pattern1" value="'%' + _parameter.name + '%'" /> -
<bind name="pattern2" value="'%' + _parameter.address + '%'" /> -
SELECT * FROM test_student -
<where> -
<if test="age != null and age != '' and compare != null and compare != ''"> -
age -
${compare} -
#{age} -
</if> -
<if test="name != null and name != ''"> -
AND name LIKE #{pattern1} -
</if> -
<if test="address != null and address != ''"> -
AND address LIKE #{pattern2} -
</if> -
</where> -
ORDER BY id -
</select>
查询结果: 
5.在Java代码中拼接字符串
这个方法没试过,就不贴代码和结果了。
转载于:https://www.cnblogs.com/MaxElephant/p/8418276.html
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)