1:概念

Mybatis中sql语句共有三种执行方式

选项 说明
STATEMENT 直接操作sql,不进行预编译,获取数据:$–Statement
PREPARED 预处理,参数,进行预编译,获取数据:#–PreparedStatement
CALLABLE 执行存储过程—CallableStatement

MyBatis默认使用PREPARED方式,即#{}

  1. 传入的参数在SQL中显示不同
    使用${}方式传入的参数,mybatis不会对它进行特殊处理,而使用#{}传进来的参数,mybatis默认会将其当成字符串。可能在赋值给如id=#{id}id=${id}看不出多大区别,但是作为表名或字段参数时可以明显看出,
    例:

    1
    2
    3
    4
    selec * from #{table};
    - 解析后为:select * from "test";
    select * from ${table};
    - 解析后为:select * from test;

    前者转换为字符串,会查询失败。所以对于传入分组(order)字段或者排序字段(order),应使用${},避免出现order by "id"等情况。

  2. #和$在预编译处理中是不一样的。
    #类似jdbc中的PreparedStatement,对于传入的参数,在预处理阶段会使用?代替,比如:

    1
    select * from student where id = ?;

    真正查询时才会带入参数,而而${}则是简单的替换

    1
    select * from student where id = 2;

2:总结

  1. 传入的参数在SQL中显示不同
  2. #{}可以防止sql注入,能使用#{}的地方应该使用#{}
  3. ${}方式一般用于传递数据库对象,例:表名,字段名,甚至sql语句

3:参考

MyBatis分页