#{}:会把参数的位置使用"?"当做占位符,当执行SQL语句的时候才会替换?的值,相当于JDBC中的PreparedStatement
自带引号
例如:和数据库进行交互,使用#{}
<insert id="insertEmployee" parameterType="employee" >
insert into employee (name,age,birthday,salary) values(#{name},#{age},#{birthday},#{salary})
</insert>
${}:直接把参数中的值当做SQL的一部分来执行,可能会有SQL注入的问题,相当于Statement
例如:字段名不可以加引号,只能使用${}
<select id="orderByColumn" resultMap="empResultMap">
select id,name,age,birthday,salary,password from employee order by ${columnName} desc
</select>
具体如何选用:
${}:当传入的参数作为SQL执行的一部分的时候必须使用${};
例如orderby id(这个id是字段名,只能使用${id}
#{}:当传入的参数时同数据库进行交互的时候,使用#{}.
PrepareStatement的执行流程:
将sql语句发送给数据库之后
1.首先数据库会检查sql语句中的关键字是否存在,是否正确(如select,where等关键字)
2.如果正确,数据库会检查sql语句中的表名列名是否存在,是否正确
3.如果正确,数据库会生成一个预编译函数
4.传入参数时,执行sql语句
对于批量处理同构sql语句的时候,会极大的提升效率,因为前三步只需执行一次!
${}这种参数相当于在第二步检查的表名,列名这种作为参数
#{}这种参数相当于在第四步动态传入的参数
简单的判断:传入的参数在SQL中是否能够加上单引号