<foreach> 是在sql語句中進行多個id查詢 時用到的,因為mybatis代替jdbc和hibernate, 使用 在xml文件中編寫sql語句,這是一個標簽文件.然后在 dao層?,用sqlSession.來調用這個寫好的sql語句.
有時候我想會不會jdbc更簡單一些??
然后,在xml中寫sql語句,會碰到根據條件或者模糊查詢,這個時候需要接收來自dao層的 查詢條件參數.此時需要在xml文件中的sql語句中接收,並且應該沒有接收,只是確定有幾個占位符,等到預編譯之后,再在dao層中為占位符傳參數值??
不是的,dao層在調用xml中的sql語句的同時就已經傳過去條件參數,只不過只能傳遞一個參數,所以就要用到封裝,所以就會產生collection屬性 是一個單參數,或者一個集合.
內部是不是預編譯 ,不知道.但是反過來jdbc中為什么要預編譯再傳值呢,好處在哪里,然后再看這里是否內部也需要如此???
DBAccess dbAccess = new DBAccess(); SqlSession sqlSession = null; try { sqlSession = dbAccess.getSqlSession(); //通過 sqlSession執行sql語句 sqlSession.delete("Message.deleteBatch",ids); //為什么DAO層這樣就可以 sqlSession.commit();//jdbc是自動提交,但是mybatis中不是自動提交的
<delete id="deleteBatch" parameterType="java.util.List"> DELETE FROM message WHERE id in ( <foreach collection="list" item="item" separator=","> #{item} </foreach> ) </delete>
所以此時要用到mybatis中的OGNL語言,也就是 <foreach>語句,接收條件參數放在sql語句中(在xml中)
用在in后的括號里,其實括號都可以不寫,看到過相關的文檔,因為foreach中有開始和結束的屬性,當然有括號簡便.
<delete id="deleteOne" parameterType="int"> DELETE FROM message WHERE id = #{_parameter} </delete> <delete id="deleteBatch" parameterType="java.util.List"> DELETE FROM message WHERE id in ( <foreach collection="list" item="item" separator=","> #{item} </foreach> ) </delete>
但是對比只有一個參數的查詢sql語句,可以看到<foreach>的作用只是在xml中實現遍歷.
但是可以看到,傳參數的時候,xml中接收到的參數都是其類型,沒有參數,由於只有一個參數,所以不需要寫參數,就用默認的_parameter或者item 表示傳入的虛參數.完全沒有問題.
最大的原因就是只有一個參數,簡化所有....原來是一種簡化.
#{} 這個是OGNL表達式?,代表傳入的參數,那么為什么要用這個表達式呢,表明它是一個參數變量嗎,便於區分??