映射文件的参数处理
这里的参数处理指定是对入参的处理, Mybatis中就是对入参的处理和对结果集的处理
单个参数:
对于单个参数 : mybatis不会做特殊处理
做法: 使用#{参数名} 方式取出参数值
- 注意: 此时是参数名, 而不是属性名(如果参数是一个对象的时候我们#{}中才是属性名), 此时由于只有一个参数, 所以我们的#{参数名}中的参数名其实是可以随便取的, 因为此时我们只有一个参数, 所以我们的mybatis中肯定会将这一个参数填充到我们的#{}占位符的位置来
注意: 这里指的单个参数指的是参数不是自定义的javaBean类型, 而是此时的参数是String, int等
多个参数:
对于多个参数: mybatis会做特殊处理, 多个参数会被封装成一个map, 如以下形式:
key : param1 … paramN
value : 传入的参数值
注意: 我们通过参数的索引可以获取到对应的value, 索引0就可以替代param1, 索引1可以替代param2, 一次类推
- map属于java中的类型, 而java中的索引从0开始, 所以对于多个参数我们要使用#{paramN}或者#{N}的方式来获取多个参数中对应参数的值
- N代表的就是第几个参数
针对多个参数的情况, 我们如果不想使用#{N} 或 #{paramN}的方式来获取多个参数的值, 那么我们可以有如下四种方式来解决:
-
命名参数: 顾名思义就是给参数命名, 明确指定封装多个参数时的map中的key
- 操作: 在Mapper接口中的方法的形参位置使用@Param(“key1”)注解为对应形参封装的时候自定义key的值
- 注意: 使用了命名参数之后, 我们的key的值就是我们@Param中定的"key1"的值
- 操作: 在Mapper接口中的方法的形参位置使用@Param(“key1”)注解为对应形参封装的时候自定义key的值
-
POJO : 如果多个参数正好是我们业务逻辑的数据模型, 我们就可以直接将多个参数封装到一个对应的数据模型(JavaBean)中, 然后我们将这个JavaBean传入到形参列表中即可
- 操作 : 传入了一个JavaBean之后我们就可以使用#{属性名}的方式来取出传入的POJO的属性值
-
Map : 如果多个参数不是业务模型中的数据, 没有对应的POJO, 那么为了方便, 我们也可以是将要传入的多个参数自己封装为一个Map, 那么我们自己封装的时候我们就可以指定键值
- 操作: 我们传入一个map对象之后, 那么我们取值的时候就要通过#{key}的方式获取
-
To : 如果多个参数不是业务模型中的数据, 但是经常使用, 推荐编写一个TO(Transfer Object : 数据传输对象)
- 也就是专门编写一个对象用来传输这多个参数, 我们将这样的对象称之为 : TO
- 比如分页操作中我们常常要传入两个参数, int index(每页的起始位置)和 int size(每页的大小), 那么我们就可以专门编写一个对象, Page {int index; int size} 用来作为TO
- 也就是专门编写一个对象用来传输这多个参数, 我们将这样的对象称之为 : TO
参数处理特殊情况之理解加深:
public Employee getEmp(@Param("id") Integer id, String lastName);
- 取值 : id => #{id} / #{param1} , lastName => #{param2}
- 注意: 当我们使用@Param注解指定了一个属性的key值之后, 那么就不可以使用索引来获取属性值了, 也就是不能使用#{N}的方式来获取数据值了
public Employee getEmp(Integer id, @Param("e") Employee emp);
- 取值: id => #{param1} , lastName => {param2.lastName} / #{e.lastName}
public Employee getEmpById(List<Integer> ids);