#{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同。
预编译可以类比java类的编译,java类被编译成class文件,载入虚拟机,载入虚拟机的字节码文件可以先被编译成机器码,那么在执行某行代码的时候就可以直接执行编译后的机器码,而不用从字节码开始编译再执行,那么执行效率就高了。这也是为啥热机状态比冷机状态可以抗更多负载的原因。
Sql的预编译也是一样的道理,在执行前就编译好,等执行时直接取编译结果去执行。省去编译时间。Sql预编译后会在参数位置用占位符表示。所以预编译就是:数据库驱动在发送Sql和参数到DBMS之前,先对Sql语句进行编译处理,之后DBMS则可以直接对Sql进行处理,不需要再次编译,提高了性能。这一点mybatis 默认情况下,将对所有的Sql 进行预编译处理。
1、能用 #{} 的地方就用 #{},尽量少用 ${}
2、表名作参数,或者order by 排序时用 ${}
3、传参时参数使用@Param("")注解
tips:
@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值(相当于又加了一层密)如:
Role selectById(@Param("roleId") String id);