mybatis中#{}与${}取值的区别

1. 首先对于一个接口

    Employee getEmpByIdAndName(@Param("id") Integer id,@Param("empName") String empName);

2. 然后是他的sql语句

    <select id="getEmpByIdAndName" resultType="com.xj.bean.Employee">
        select \* from t_employee where id=#{id} and empname=#{empName}
    </select>

3. 我们可以观察到控制台的日志

DEBUG 09-08 19:49:57,254 ==> Preparing: select * from t_employee where id=? and empname=? (BaseJdbcLogger.java:159)
DEBUG 09-08 19:49:57,298 ==> Parameters: 1(Integer), zxj(String) (BaseJdbcLogger.java:159)
DEBUG 09-08 19:49:57,396 <== Total: 0 (BaseJdbcLogger.java:159)

4. 如果将sql语句中的#{id}修改为$

  • 注意此处的where id=$
    <select id="getEmpByIdAndName" resultType="com.xj.bean.Employee">
        select \* from t_employee where id=${id} and empname=#{empName}
    </select>

5. 我们再来观察日志

DEBUG 09-08 19:51:49,080 ==> Preparing: select * from t_employee where id=1 and empname=? (BaseJdbcLogger.java:159)
DEBUG 09-08 19:51:49,106 ==> Parameters: zxj(String) (BaseJdbcLogger.java:159)
DEBUG 09-08 19:51:49,123 <== Total: 0 (BaseJdbcLogger.java:159)

6. 我们可以看到where处,id由原来的=?,修改为=1。

结论:

  • #{}:参数预编译,参数的位置都是由?替代,之后再设置进去,防止sql注入
  • ${}:不是参数预编译,而是直接与sql语句拼串,不安全

tips:对于sql来说,只有参数位置支持预编译,而如果想查询不同的表,就需要使用到${}

比如:对于日志文件,会进行分表操作,log_2020,log_2019,如果想要查询不同表的信息,就需要用到${}
不行:select * from #{tableName}
行:select * from $

posted @ 2020-09-08 19:47  微花  阅读(266)  评论(0编辑  收藏  举报

Loading