1、接口中传递参数不同数量时的情况处理:
a、单个参数的情况:
mybatis不会做特殊处理,可以使用 #{参数名/任意名}:取出参数值。(可以看到上面的输出结果没有任何问题。)
b、多个参数的情况:
如果按照上面的方式指定,即如下图所示,会出异常。(这样截图太多,不写地太过详细)
注:可以看到,异常报错提示中,只能够以索引值或者 param1,param2,... 的方式来指定。
c、命名参数的形式指定:在指定的方法中添加 @Param("指定参数名") 注解即可。(可以看到下面的输出结果正常。)
2、定义的接口可以传递 POJO、Map 以及 TO(Transfer Ojbect,数据传输对象):
a、如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入 pojo:
即 #(属性名):取出传入的 pojo 的属性值(之前博文中已经介绍)
b、如果多个不是业务逻辑中的数据,没有对应的 pojo,不是经常使用,为了方便,我们也可以传入 map 对象:
也是 #(key):取出 map 中对应的值
注:可以看到,用 Map 类型的对象传输后,输出结果没有出错。
c、如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个 TO。如:
Page{
int index;
int size;
}
3、参数值的获取 #{} 和 ${} 的区别:
#{}:可以获得 map 中的值或者是 pojo 对象属性的值
${}:可以获得 map 中的值或者是 pojo 对象属性的值
区别:
#{}:是以预编译的形式,将参数设置到 sql 语句中。(可以防止 sql 注入)
${}:取出的值直接拼接在 sql 语句中,会有安全问题。
在大多数情况下,我们取参数的值都应该使用 #{} 方式。但是,原生 jdbc 不支持占位符的地方我们可以使用 ${} 进行取值。比如分表、排序......(按照年份分表拆分等)
注:如上图所示,sql 语句中的表名不是参数设置的位置,在运行时会直接报错。
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘tbl_employees‘ where id = 2 and last_name = ‘littleJM‘‘ at line 1
注:如上图所示,sql 语句中把 #{tableName} 修改为 ${tableName},测试代码输出的结果就没有问题了。
附:(参数取值需要注意的地方)
举例:
- public Employee getEmp(Integer id,@Param("e")Employee emp);
取值: id ==> {param1} lastName ==> #{param2.lastName/e.lastName}
- public Employee getEmpById(List<Integer> ids);
取值:取出第一个 id 的值: #{list[0]}
如果是 Connection(List、Set) 类型或者是数组,也会特殊处理,也是把传入的 list 或者是数组封装在 map 中。key:如果为 Connection,则取值为 collection。如果为 List,还可以使用这个 key(list)。(数组为 array)