mybatis第二篇—引數繫結
不管我們在做資料庫作業或者任務還是當時的僅靠jdbc來寫一個管理系統的時候,sql語句需要一些引數,從而來實現模糊查詢,精確查詢,插入資料,更新資料和刪除資料。這些引數,在mybatis裡面,又該如何使用呢?我總結了一下五點:
- 單個引數的繫結:
這個和上一篇的用法是一樣的,我們直接在mapper檔案裡面用#{}代替引數,就可以完成單個引數繫結,例如程式碼:
mapper.xml檔案:
<select id="findById" resultType="Teacher"> select * from teacher where tid=#{tid} </select>
在dao層的接口裡面,只需要寫上對應的方法:
public Teacher findById(int tid);
這樣,直接用sqlsession去讀取這個dao的介面,然後呼叫這個方法,就可以實現單個引數的傳遞了。
- 多個引數繫結:
如果一個sql語句的查詢條件有多個的話,就需要多個引數的綁定了。
- 多個引數繫結:索引傳遞
在mapper檔案中:
<select id="findByNameAndCourseWithIndex" resultType="Teacher"> select * from teacher where tname=#{0} and tcourse=#{1} </select>
在dao層的接口裡面:
public Teacher findByNameAndCourseWithIndex(String tname,String tcourse);
這樣就實現了根據索引值來傳遞引數的問題。
- 多個引數繫結:註解繫結
除了索引,我們mybatis還提供了註解的方式來傳遞引數
mapper檔案中:
<select id='findByNameAndCourseWithBind' resultType="Teacher"> select * from teacher where tname=#{tname} and tcourse=#{tcourse} </select>
dao層的介面:
public Teacher findByNameAndCourseWithBind(@Param("tname")String tname,@Param("tcourse")String tcourse);
可以看到,mapper檔案中的#{}裡面的引數,用@Param()繫結給了dao層的方法,而#{}和@Param()需要一致。這樣就實現了引數通過註解的方式繫結。
- 多個引數繫結:map繫結
利用map,來傳遞引數,我們知道map是一個鍵值對形式儲存資訊的集合,所以利用map也可以實現引數的繫結
mapper檔案程式碼:
<select id="findByNameAndCourseWithMap" resultType="Teacher">
select * from teacher where tname=#{tname} and tcourse=#{tcourse}
</select>
dao層介面檔案程式碼:
public Teacher findByNameAndCourseWithMap(Map paramMap);
在呼叫介面去使用這個方法的時候,我們需要用到put()方法,來將引數傳遞過去,例如這裡就是paramMap.put("tname","張三")這樣一來,就好理解了,鍵值對的存在,也就形成了一個實參和形參的繫結。
- 多個引數繫結:直接傳遞
和單個引數傳遞一樣,我們可以使用直接傳遞的方法去傳遞多個引數
mapper檔案:
<select id="findByNameAndCourseWithObject" resultType="Teacher" >
select * from teacher where tname=#{tname} and tcourse=#{tcourse}
</select>
dao層介面:
這樣一來,我們就也能實現一種引數的傳遞。
不過要注意的是,mybatis中的SQL接受的引數有基本的資料型別,物件,List,陣列和Map,無論傳遞那種引數給mybatis,都會將引數放在一個Map中,如果傳入基本型別:變數名作為key,變數值作為value 此時生成的map只有一個元素。如果傳入物件: 物件的屬性名作為key,屬性值作為value,如果傳入List: "list"作為key,這個List是value (這類引數可以迭代,利用標籤實現迴圈)如果傳入陣列: "array"作為key,陣列作為value(同上)如果傳入Map: 鍵值不變。