MyBatis参数处理

一、单个参数:mybatis不会做特殊处理 —— 参数名可以定义任意名称
#{参数名}:取出参数

二、多个参数:mybatis会做特殊处理
当我们设置成:
(1)方法:public Employee getEmpByIdAndLastName(Integer id, String lastName);
(2)sql语句:where id=#{id} and last_name=#{lastName}
会报错异常:

org.apache.ibatis.binding.BindingException: Parameter 'id' not found.
Available parameters are [0, 1, param1, param2]

解决办法一:
多个参数会被封装成一个map:
(1)key:param1,…,paramN,或者参数的索引(从0开始)
(2)value:传入的参数值
#{param1}就是从mao中获取指定key的值
sql语句:where id=#{param1} and last_name=#{param2}

解决办法二:推荐!!!
命名参数:明确指定封装参数时map的key名称 —— @Param("id")
方法:getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);
sql语句:where id=#{id} and last_name=#{lastName}
多个参数会被封装成一个map:
(1)key:使用@Param注解指定的值
(2)value:传入的参数值
#{指定的key}就是从mao中获取指定key的值

POJO:
三、如果多个参数正好是业务逻辑的数据模型,我们就可以直接传入pojo
#{属性名}:取出传入的pojo的属性值

Map:
四、如果多个参数不是业务逻辑的数据模型,没有对应的pojo
不经常使用时,我们可以一传入map
#{key}:取出map中对应的值

TO:
五、如果多个参数不是业务逻辑的数据模型,没有对应的pojo
经常要使用,推荐编写一个TO(Transfer Object)数据传输对象

Page{
    int index;
    int size;
}

六、#{ }${ }:都可以获取map中的值或者pojo对象属性的值

1.区别:
(1)#{ }:以预编译的形式,将参数设置到sql语句中 PreparedStatement ==> 可以防止sql注入

select * from tbl_employee where id=#{id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=? and last_name=?

(2)${ }:取出的值直接拼接在sql语句中 ⇒ 有sql注入安全问题

select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?

大多是情况下,取参数的值都使用 #{ }

原生JDBC不支持占位符的地方我们就可以使用 ${} 进行取值
例如:
(1)表名不支持占位符,而现在可以使用 ${} 进行拼接
分表(按照年份分表拆分):select * from ${year}_salary where ...; => 2017_salary, 2016_salary...
(2)order by后面的表达式不支持占位符,而现在可以使用 ${} 进行拼接
排序:select * from tnl_employee order by ${f_name} ${order}; ==> 表达式 + desc/aesc

2.#{ }更丰富的用法 —— 规定参数的一些规则
javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);

jdbcType通常需要在某种特定的条件下被设置:
在数据为null时,有些数据库不能识别mybatis对null的默认处理(Oracle),此时会报错

JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
	1、#{email,jdbcType=OTHER};
	2、jdbcTypeForNull=NULL
		<setting name="jdbcTypeForNull" value="NULL"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值