MyBatis映射文件中参数问题
单个参数:mybatis 不做特殊处理
#{参数名}:取出参数值
多个参数:mybatis会做特殊处理
多个参数会被封装成一个map
key:param1,param2…paramN,或者参数的索引(1,2…N)
value:传入的参数
#{}就是从map中获取指定的key值
eg.
<!-public List<Customer> findOne(int id,int name);-->
<select id="findOne" resultType="com.domain.Customer">
select * from customer
id=#{pama1} and name=#{param2}
</select>
编写代码时为了方便,一般不使用上面这种方式
<!-public List<Customer> findOne(@Param(“id”)int id,@Param("name")int name);-->
key:使用@Param注解指定特定的值
value:参数值
#{指定的值}:取出参数值
若按照上面第一种单个参数的方法取值,则会报异常:显示
Parameter xxx not found Available parameters are[1,0, param1,parame2]
pojo方式
当传入的参数是某个实体类(比如自己创建的Customer类,该类要和数据库中的表要一一对应),则可以直接取属性值:
#{属性名}:取出传入pojo的属性值
map方式
如果多个参数不是业务模型中的数据,没有对应的pojo,传入的参数不经常使用,为了方便,也可以传入map
#{key}:取出map中对应的值
eg:将所有数据封装在map里面
Map<String,Object> map=new HashMap<>();
map.put("id",1);
map.put("lastName","Tom");
Customer c=mapper.getCustomer(map);
dao: public Customer getCustomer(Map<String,Object> map);
mapper映射文件:
<select id="getCustomer" resultType="com.domain.Customer">
select * from customer where id=#{id} and lastname=#{lastName}
</select>
To
没有对应的pojo,但是参数经常使用
推荐来编写一个To(Transfer Object)数据传输对象
Page{
int index;
int size;
}
====常见场景
public Customer get(@Param("id") Integer id,String name);
取值:id------ #{id/param1}
name------ #{param2}
public Customer get(Integer id,@Param("e")Customer c);
取值:id------- #{param1}
name----- #{param2.name/e.name}
特别注意:如果是Collection(List,set)类型或者是数组,也会特殊处理,
也是把传入的参数(list或者数组)封装在map中。
取值:key: Collection(collection),如果是List还可以使用这个key (list),数组(array)
eg.public Customer get(List<Integer> ids);
取值:取出第一个id的值:#{list[0]}
#{}:可以获取map中的值或者POJO对象属性的值
${}:可以获取map中的值或者POJO对象属性的值
区别:
#{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatements放在sql注入
${}:取出的值是直接拼装在sql语句中