• Mybatis 中 sql 语句的占位符 #{} 和 ${}


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

           ${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, ${} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${} 括号中只能是 value。

    下面举个例子来说明这两个的区别:

    代码上来先:

    <!-- 通过ID查询一个用户 -->
        <select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User">
            select * from user where id = #{v}
        </select>
        
        <!-- //根据用户名称模糊查询用户列表
        #{}    select * from user where id = ?    占位符  ? ==  '五'
        ${}    select * from user where username like '%五%'  字符串拼接  
        
         -->
        <select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User">
            select * from user where username like '%${value}%'
        </select>
        <select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User">
            select * from user where username like "%"#{v}"%"
        </select>

      上面是 user 类对应的 user.xml 文件,用于编写 sql 语句,避免了硬编码。

      id 为 findUserByUsername1 的采用的是 ${} 占位符,id 为findUserByUsername2 采用的是 #{} 占位符,

      前者生成的 sql 为 select * from user where username like ‘%XXX%’;

      后者生成的 sql 语句是 select * from user where username like "%"'XXX'"%",(这样的格式我还没在 sql 中写过,但是的确能 run)

    (XXX 是调用该查询是传入的参数)注意这两者的不同,前者不能防止 sql 注入,后者能防止。

  • 相关阅读:
    无法在 Web 服务器上启动调试。调试失败,因为没有启用集成 Windows 身份验证。请
    .NET连接各种数据库的字符串
    修改远程桌面端口
    c#获取计算机信息
    ASP.NET 对路径的访问被拒绝
    关于.net 2.0数据库连接出错的一些经验
    Rose启动提示"java.lang.ClassNotFoundException"的解决
    Ext中的get、getDom、getCmp、getBody、getDoc的区别
    action中生成验证码图片
    extjs表格控件
  • 原文地址:https://www.cnblogs.com/daimajun/p/7076790.html
Copyright © 2020-2023  润新知