天天看点

MyBatis映射文件中参数问题MyBatis映射文件中参数问题

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语句中