# 和 $ 区别
1、#:占位符(#{}是预编译处理),告诉 mybatis 使用实际的参数值代替。并使用PrepareStatement 对象执行 sql 语句, #{…} 代替 sql 语句的 “?”。这样做更安全,更迅速,通常也是首选做法
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋
值;
Mybatis在处理{}时,就是把{}替换成变量的值
使用#{}可以有效的防止SQL注入,提高系统安全性
select user_id,user_name, email,age from user where user_id=#{userId}
# 的结果:select user_id,user_name, email,age from user where user_id=?
#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
2、$:字符串替换(${}是字符串替换),告诉 mybatis 使用$包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和${}的内容连接起来。主要用在替换表名,列名,不同列排序等操作。
select user_id,user_name, email,age from user where user_id=${userId}
$ 的结果:select user_id,user_name, email,age from user where user_id=1001
类似如下语句
String sql="select user_id,user_name, email,age from user where user_id=" + "1001";
使用的Statement对象执行sql, 效率比PreparedStatement低
${} :取出的值直接拼装在sql语句中;会有安全问题
大多情况下,我们去参数的值都应该去使用#{ }
原生jdbc不支持占位符的地方我们就可以使用${ }进行取值;比如分表、排序;按照年份分表拆
select
* from ${year}_ salary where xxx;
select * from tb1_ employee order by ${f_ name} ${order}
3、# 和 $区别
(1)#{}是预编译处理,${}是字符串替换
(2)#使用 ?在sql语句中做占位的, 使用PreparedStatement执行sql,效率高;
$不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
(3)#能够避免sql注入,更安全;$有sql注入的风险,缺乏安全性
(4)$:可以替换表名或者列名
(5)#{}:更丰富的用法
规定参数的一些规则:
javaType、jdbcType、mode (存储过程)、numericScale、resultMap、typeHandler、 jdbcTypeName、 expression (未来准备支持的功能)
参数处理
参数也可以指定一个特殊的数据类型
#{property ,javaTypt=int,jdbcType-NUMERIC}
#{height, javaType=double , jdbcType=NUMERIC , numericScale=2}
--javaType通常可以从参数对象中来去确定
--如果null被当作值来传递,对于所有可能为空的列
jdbcType需要被设置
--对于数值类型,还可以设置小数点后保留的位数
--mode属性允许指定IN,OUT或INOUT参数。如果参数为OUT或INOUT,参数对象属性的真实值将会被改变就像在获取输出参数时所期望的那样