#1.Mybatis中参数的传递方式
①单参数传递:
1.如果方法传递的是单个的字面量参数,那么在Mapper映射文件的SQL语句的#{}当中
变量名称可以随便写,不一定和接口的参数名保持一致,在#{}当中写什么都可以识别这个唯一的字面量参数。
2.${}和#{}传递参数的不同:
在Mapper.xml映射文件中,除了允许使用#{}接收传递参数之外,还允许使用${}接收传递的参数,二者区别如下:
1)#{}相当于使用对象PreparedStatement中,带有参数?占位符的传参方式;${}相当于原始的+字符串拼接传参方式;
2)#{}更为安全,不会引起SQL注入的问题:${}容易引起SQL注入;
3)${}能够给字段名、表名进行参数传递(字符串拼接),但是#{}是无法实现的。
注意:在SQL语句中使用${}进行字符串拼接的时候,必须对接口方法的参数进行命名: 使用@Param
②多参数传递:
1.原始的多参数传递操作:
Mybatis会自动将所有参数封装到一个Map当中传递给SQL语句进行使用。
但是在没有明确声明参数名称的情况下,Map中的键是arg0、arg1、param1、param2的 字符串。 注意:在使用原始的arg命名和param命名访问参数取值的时候,没有任何区别,唯一的 区别在于:
arg命名,参数下标从0开始;param命名,参数下标从1开始。
2.使用命名参数操作:
Mybatis中提供了一种注解标签,可以将自定义的参数名称携带导运行时阶段:@Param 使用方式:
接口方法名(@Param("参数名称1") 参数1, @Param("参数名称2") 参数2)
注意:真正能够携带导SQL语句中,#{}下的参数名,是@Param注解标签中的名称。
化多为一思想:当传递多个参数到接口方法中时,我们应该想办法尽量将这些参数使用 同一载体进行传递。
3.使用Map对象进行操作:
手动传递一个Map类型的参数给接口方法,绕过MyBatis自动封装参数Map的过程。
手动传递Map中的键,就是参数的自定义名称。
4.使用POJO作为参数的载体:
如果查询参数正好是POJO实体类对象的对象属性,那么可以直接传递一个实体类对象作 为方法的参数。
此时需要保证实体类中每一个对象属性都具备完整的get/set方法。
Mybatis会根据属性的名称,调用对应的get/set方法,从而完成访问参数的操作。
换句话说就是:实体类对象中属性的名字叫什么,#{}就写什么。
5.传递的参数不是实体类对象属性——使用TO作为参数载体传递:
TO:Transform Object:传输对象
定义:TO是一种特殊的POJO,专门用来承载在传递参数过程中,不再任何POJO属性当中的参数
换句话说,TO就是不与任何数据库表进行对应的POJO