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>
  • 相关阅读:
    JAVA面试题
    Io流
    初识线程池
    理解事务的4种隔离级别
    简单认识Git与GitHub
    JAVA自动装箱和拆箱
    代码块以及他们的执行顺序
    反射机制
    java Excel表格
    访问修饰符的含义分析
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/8722571.html
Copyright © 2011-2022 走看看