针对模糊查询的三种方式
业务层传递数据,在映射文件取值时where语句理论上应写为where user_name like #{user_name}%,但实际上控制台会报错。
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' at line 1
提示的是数据库Sql语句的错误,如果使用了log4j日志,控制台显示:
DEBUG [main] - ==> Preparing: select * from web_user where user_name like ?%
DEBUG [main] - ==> Parameters: 悟(String)
后面会解释为什么会出错。所以直接取值是不行的,可以使用下面的几种方式。 一 在业务层进行处理
在业务层接收到数据时,首先对数据进行一次简单的处理操作。
<select id="where01" resultType="self.exercise.bean.User" parameterType="string">
select * from web_user where user_name like #{user_name}
</select>
此时日志在控制台输出
DEBUG [main] - ==> Preparing: select * from web_user where user_name like ?
DEBUG [main] - ==> Parameters: 悟%(String) 二 在映射文件取值时进行处理
在业务层不进行数据处理,在映射文件中不用#{}取值,改为${}方式取值。
<select id="where01" resultType="self.exercise.bean.User" parameterType="string">
select * from web_user where user_name like '${_parameter}%'
</select>
控制台的信息:
DEBUG [main] - ==> Preparing: select * from web_user where user_name like '悟%'
DEBUG [main] - ==> Parameters:
由此可以看出#和$的区别
#会将字符串进行预处理,用一对引号加在字符串外边,再替代?如#{user_name}% -->'悟'%,所以直接用#{}接值控制台报错的原因就在于此。
$将取到的数据直接替换掉,并不会进行预处理。如'${_parameter}%' -->'悟%' 三 在映射文件用方法进行拼接
在业务层不进行数据处理,在映射文件调用MySql的concat(param1,param2,...)进行拼接
<select id="where03" resultType="self.exercise.bean.User" parameterType="string">
select * from web_user where user_name like concat(#{user_name},"%")
</select>
日志:
DEBUG [main] - ==> Preparing: select * from web_user where user_name like concat(?,"%")
DEBUG [main] - ==> Parameters: 悟(String) 针对多条件的where语句
当有多个查询条件时,用if标签进行条件筛选 如