1.如果是單個參數傳遞,那么sql語句中“#{}”括號里的名字可以隨便寫。
2.如果是多個參數傳遞,Mybatis會做特殊處理
A) 多個參數會被封裝成一個Map,其中key:param1...paramN(或者是0,1,2.....),value就是傳入的參數值,#{}其實就是從Map中獲得指定的key的值。
B) 如果隨便傳入參數名Mybatis會報BingdingExcption錯誤,提示參數名找不到。
C) 我們可以通過命名參數的方式來傳入我們所指定的參數名:
例如在一個Mapper接口中有:
public Employee getEmpByIdAndName(Integer id,String name);
這樣一個方法,就可以通過@Param注解來給我們的參數指定別名,就像這樣:
public Employee getEmpByIdAndName(@Param(“id”)Integer id,@Param(“name”)String name);
D) 如果參數正好是我們業務中的數據模型,我們可以直接傳入pojo(普通的JavaBean):
#{屬性名}:取出傳入的pojo的屬性值。
E) 如果多個參數不是業務中的數據模型,沒有對應的pojo,為了方便,我們也可以傳入自定義的Map,把我們想要傳遞的參數名封裝在這個Map中,還是上面的例子:
public Employee getEmpByIdAndName(Map<String,Object> map);
這樣在調用Mapper時就可以通過以下方法來指定Map的封裝:
EmployeeMapper mapper=opensession.getMapper(EmployeeMapper.Class) Map<String,Object> map=new HashMap<>(); map.put(“id”,2); map.put(“name”,”tom”); Employee emp=mapper.getEmpByIdAndName(map);
這樣就相當於給sql傳入了自定義的#{id}和#{name}的值了。
F) 如果多個參數不是業務模型的數據模型,但方便起見,要經常使用,來編寫一個To(Transfer Object)數據傳輸對象,將我們的數據模型放在Page{}里面。
3.#{}和${}的區別:
#{}:是以預編譯格式,將參數設置到sql語句中,相當於PreparedStatement,可以防止sql注入;
${}:會將取出的值拼接在sql語句中,相當於Statement,會有安全問題;
大多數情況下,我們都是用#{}來進行取值,jdbc不支持占位符的地方使用${}進行取值,比如分表,或者oder by ${} ${升序還是降序}等。