4.2 模糊查询

4.2.1 占位符

  • 配置文件

    1
    2
    3
    4
    <!-- 根据名称模糊查询 --> 
    <select id="findByName" resultType="com.itheima.domain.User" parameterType="String">
    select * from user where username like #{username}
    </select>

    在控制台输出的执行SQL语句如下:

    在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%

    配置文件中的#{username}也只是一个占位符,所以SQL语句显示为“?”。

4.2.2 %查询

  • 配置文件

    1
    2
    3
    <select id="findByName" parameterType="string" resultType="com.itheima.domain.User">
    select * from user where username like '%${value}%'
    </select>

    在控制台输出的执行SQL语句如下:

    可以发现,我们在程序代码中就不需要加入模糊查询的匹配符%了,这两种方式的实现效果是一样的,但执行的语句是不一样的。

4.2.3 #{}与${}的区别

  #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
  ${}表示拼接sql串 通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

4.2.4 模糊查询的${value}源码分析

  • TextSqlNode类的源码:

    mark

    这就说明了源码中指定了读取的key的名字就是”value”,所以我们在绑定参数时就只能叫value的名字了。