mybatis中的${}与#{}的理解

  mybatis作为目前java较为常使用的orm框架,其中动态sql的参数的注入有${}与#{两种形式,下面来介绍一下他们之间的区别,

  #{}作为参数注入的方式时,从表象上来看,是在参数上添加了一个“”号,从实际执行情况来看,他其实是对原sql语句进行了预编译,留下的参数位置作为一个“”坑“,使用预编译有以下几个好处,

1、效率性,数据库在处理SQL语句时都有一个预编译的过程,而预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即数据库缓冲池,当我们再次执行相同的SQL语句时就不需要预编译的过程了,只需DBMS运行SQL语句。所以当你需要执行该sql多次的时候,将会大大降低运行时间,特别是的大型的数据库中,它可以有效的也加快了访问数据库的速度。 

2、防止sql注入,防止了 userName = "1' OR '1'='1";这种万能密码,或者"SELECT * FROM users WHERE name = 'any_value' and pw = ''; DROP TABLE users"这种破坏性的参数注入手段

  ${}作为参数注入方式时,从表象上来看,将参数拼接进sql中,未加“”号,这种方式其实质上就是作了一个字符串的拼接,所以第一个问题是他需要每次都编译一个新的sql,而在数据库的处理中,编译sql是一个比较耗费资源的事,这就影响了效率,不方便复用。

  比较两种方式,#{}是先编译再注入参数,而${}是先拼接字符串,然后在编译,所以我们推荐的能用#{}就用#{},当然,如果#{}能解决一切问题也没有${}存在的价值了,${}也存在其必要的使用场景,如变量的位置处于表名,字段名时,使用#{}无法完成拼接功能的,然后还有一种情景,在条件为in 多个参数拼接的字符作为条件时(如 in   "2,3,4"),需要使用${}强行凭借,因为若使用了#{},实际判断的是该字段是否在(2,3,4)这一个字符串中,这其实也是为了防止sql注入。

猜你喜欢

转载自www.cnblogs.com/Lliuyao/p/9906764.html