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>
  • 相关阅读:
    SpringBoot常用注解(二)
    SpringBoot常用注解(一)
    Spring Dl解释
    Spring 入门程序
    Spring 入门
    JUnit-4.13使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    测试中Android与IOS分别关注的点
    python包中__init__.py的作用
    python自动发送测试报告(五)
    搭建一个有条理的项目(四)
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/8722571.html
Copyright © 2011-2022 走看看