MyBatis从0开始学习目录
MyBatis-1-简介
MyBatis-2-HelloWorld
MyBatis-3-全局配置
MyBatis-4-映射文件
MyBatis-5-源码分析
MyBatis-6-#{}和$区别
MyBatis-X-面试题
参数值的获取
#{ } 预编译处理,可以获取map中的值或者POJO对象属性的值
${ } 字符串替换,也可以获取map中的值或者POJO对象属性的值
Select * from tb1_employee where id=${id} and last_name=#{lastName}
Preparing:select * from tb1_employee where id=2 and last_name?
区别:
#{},是以预编译的形式,将参数设置到sql语句中;preparedStatement,防止sql 注入,只能处理参数
${},取出的值直接封装在sql语句中,会有安全问题
大多情况下,我们去取参数的值都应该去使用#{};
原生jdbc不支持占位符的地方我们就可以使用$ { }进行取值
比如分表、排序等:按照年份分表拆分
Select * from 2017_salary
Select * from 2016_salary
解决:Select * from #{year}_salary where xxx;
Select * from tb1_employee order by${f_name} ${order}
Select * from ${tableName} where id=#{id} and last_name=#{lastName}
#{ }:更丰富的用法
规定参数的一些规则:
-javaType | (Java类型) |
jdbcType | (jdbc类型) |
mode | (存储过程) |
numericScale | (如果是数字可以规定保留几位小数) |
ResultMap | (封装结果类型) |
typeHandler | (处理数据类型处理器) |
jdbcTypeName | 等同于jdbcType |
expression | (未来准备支持功能(mybatis不支持)) |
JavaType通常需要在某种特定的条件下被设置,
在我们数据为Null的时候,有些数据可能不能识别mybatis对null的默认处理。比如Oracle(报错)-----JDBCType OTHER,无效类型;因为mybatis对所有的null都映射的是原生JDBC OTHER类型,oracle不能正确处理;
解决
由于全局配置中,jdbcTpyeForNull=OTHER,oracle不支持
1.#{email,jdbcType=NULL}
2.改全局配置JDBCTYPEFORNULL==NULL
<setting name="jdbcTypeForNull" value="NULL"/>
参数处理
参数也可以指定一个特殊的数据类型:
#{property,javaType=int,jdbcType=NUMERIC}
#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}
-JavaType通常可以从参数对象中来去确定
-如果null被当作值来传递,对于所有可能为空的列,jdbcType需要被设置
-对于数据类型,还可以设置小数点后保留数位
-mode属性允许指定IN,OUT或INOUT参数。如果参数为OUT或INOUT,参数对象属性的真实值将会被改变,就像在获取输出参数时所期望的
实际上通常被设置的是:
可能为空的列名指定jdbcType
#{key}:获取参数的值,预编译到SQL中,安全
k
e
y
:
获
取
参
数
的
值
,
拼
接
到
S
Q
L
中
。
有
S
Q
L
注
入
问
题
。
O
R
D
E
R
B
Y
{key}:获取参数的值,拼接到SQL中。有SQL注入问题。ORDER BY
key:获取参数的值,拼接到SQL中。有SQL注入问题。ORDERBY{NAME}