關於Mybatis參數的命名規則


   1.如果是單個參數傳遞,那么sql語句中“#{}”括號里的名字可以隨便寫。

      2.如果是多個參數傳遞,Mybatis會做特殊處理

A)  多個參數會被封裝成一個Map,其中keyparam1...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 ${} ${升序還是降序}等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM