mybatis参数处理

单个参数:mybatis不做特殊处理,
#{参数名}:取出参数值
多个参数:mybatis会做特殊处理
多个参数会被封装成一个map,
key:Param1...ParamN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key值

异常:
Error querying database. 
Cause: org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [1, 0, param1, param2]
操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}

命名参数:明确指定封装参数时map的key;@Param("id")
多个参数会被封装成一个map,
key:使用@param注解指定的值
value:参数值
#{指定的key}取出对应的参数值


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

Map:
如果多个参数不是业务逻辑中的数据模型,不经常使用,为了方便,我们也可以传入map
#{key}:取出map中对应的值


TO:
如果多个参数不是业务逻辑中的数据模型,但是经常使用,推荐来编写一个TO(transfer object)数据传输对象
page{
int index;
int size;
}


=============================思考=============================
public Employee getEmp(@Param("id")Integer id,String lastName);
取值:id:#{id/param1} lastName:#{param2}

public Employee getEmp(Integer id,@Param("e")Employee emp);
取值:id:#{param1} lastName:#{param2.lastName/e.lastName}


###特别注意:如果是collection(List、Set)类型或者是数组,
也会特殊处理。也就是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用key(list)
数组(array)
public Employee getEmpById(List<Integer> ids);

取值:取出第一个id的值:#{list[0]}

==========================参数值的获取=============================
#{}:可以获取map中的值或者pojo对象属性的值;
${}:可以获取map中的值或者pojo对象属性的值;
区别:
#{}:是以预编译的方式,将参数设置到sql语句中:preparedStatement;防止sql
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们取参数值都应该去使用#{};
但是,原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序;按照年份分表拆分,在这种情况下若使用#{}取值在编译时会报错;
select * from ${year}_salary where xxx;
select * from tb_empolyee order by ${f_name} ${order}


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

jdbcType通常需要在某种特定的条件下被设置;
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。
比如oracle报错:jdbcType OTHER:无效的列类型;
因为mybatis对所有的null都映射为jdbc OTHER类型,而oracle无法识别OTHER类型,但MySQL可以。
此时可以在后面指定当属性为空时的默认属性:#{email,jdbcType=NULL},
从而当email值为null时,编译时oracle接收到的为NULL而不是mybatis默认的OTHER类型。
由于全局配置中jdbcTypeForNull=OTHER;oracle不支持
处理:
1.#{email,jdbcType=NULL}
2.jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值