zoukankan      html  css  js  c++  java
  • mybatis 框架动态传入参数${}和#{}之间的区别

    动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉下mybatis里#{}与${}的用法:

      在动态sql解析过程,#{}与${}的效果是不一样的:

    #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。

    如以下sql语句

    select * from user where name = #{name};

    会被解析为:

    select * from user where name = ?;

    可以看到#{}被解析为一个参数占位符?。

    ${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

    如以下sql语句:

    select * from user where name = ${name};

    当我们传递参数“sprite”时,sql会解析为:

    select * from user where name = "sprite";

    可以看到预编译之前的sql语句已经不包含变量name了。

    综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。

    #{}与${}的区别可以简单总结如下:

    • #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
    • ${}将传入的参数直接显示生成在sql中,不会添加引号
    • #{}能够很大程度上防止sql注入,${}无法防止sql注入
    • ${}一般用于传输数据库的表名、字段名等

    要实现动态调用表名和字段名,就不能使用预编译了,需添加statementType="STATEMENT"。如下

    <select id="getUser" resultType="java.util.Map" parameterType="java.lang.String" statementType="STATEMENT">
        select 
            ${columns}
        from ${tableName}
            where COMPANY_REMARK = ${company}
      </select>
  • 相关阅读:
    设置函数环境——setfenv(转)
    全局变量声明的规范化(转)
    利用__index和__newindex实现默认值表、监控表、只读表(转)
    php中的$_GET怎样获取带有井号“#”的參数
    Servlet配置load-on-startup
    LinQ—扩展方法
    CRT
    [C++] 获取IE代理server的账号password
    一步一步写算法(之hash表)
    android之PackageManager简单介绍
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/8722571.html
Copyright © 2011-2022 走看看