博为峰JavaEE技术文章 ——MyBatis Mapper $与#的区别

    xiaoxiao2021-03-26  19

    Mybatis 在配置Mapper.xml文件时,一定会使用到动态SQL查询,也就是要传递动态参数。在Mybatis中有两种表示动态参数的方式,一种是“$”,另一种是“#”,那么这两者有什么不同之处呢?今天小博老师就给大家介绍一下两者的区别。

    比如,如下一个SQL语句:

    Select * from company where name = boweifeng

    写成动态参数的方式可以写成:

    1. Select * from company where name = #{name}

    也可以写成:

    2. Select * from company where name = ${name}

     

    两者的区别在于,如果传递的参数是“boweifeng”,第一种写法,会被动态解析为预编译语句:

    Select * from company where name = ?

    一个 #{ } 被解析为一个参数占位符 ? 。参数将会在DBMS中进行写入。从效率上讲,第一种写法执行效率较高,因为相同的预编译语句可以被数据库进行缓存,重复利用。同时预编译语句还可以防止SQL注入。

     

     

    如果是第二种写法,上述的SQL语句则会被解析为如下:

    Select * from company where name = “boweifeng”

    我们发现预编译之前的 SQL 语句已经不再包含变量了,完全是常量数据。综上所述, ${} 变量在动态 SQL 解析阶段进行替换,而 #{ }变量的替换是在 DBMS 执行时进行。

     

    注意:

    表名作为变量时,必须使用 ${ }。

    因为,表名是字符串,使用 sql 占位符替换字符串时会带上单引号 '',导致 sql 语法错误,例如:

    select * from #{tableName}

    预编译之后的sql 变为:

    select * from ?

    如果传入的参数是company,则在占位符进行变量替换后,语句变成如下:

    select * from company

    以上语句将会执行错误,因为表名不能加引号。

    转载请注明原文地址: https://ju.6miu.com/read-658741.html

    最新回复(0)