mybatis新手入門常見問題集(持續更新)

1、參數爲集合

 Q:parameterType指的的類型是集合類型仍是對象?java

 A:均可以,甚至不用在xml中指定也能夠。第一,mybatis會對傳入的參數進行判斷是否是list或者array,第二,mybatis是根據ONGL表達式,即 【參數.屬性】 這樣的格式,經過反射去獲取和注入屬性值,傳入的參數爲集合的時候,無論指定parameterType的那一個,上面說的兩點都能發揮功能。sql

 

 Q:Parameter '__frch_item_0' not found. Available parameters are [list]數據庫

 A:首先說明的是frch_item_0這個參數名的來歷,在個人xml文件中,<foreach>是這樣定義的,apache

<foreach collection="list" item="item" separator="," open="(" close=")">
            #{item.a}
</foreach>

   ‘frch'表明的是在循環內部參數的前綴,’item‘則 標籤中指定的item的名字,後面的數字則表明循環中的第幾個參數緩存

  接口中的方法的定義以下:mybatis

List<User> listById( List<User> id);

  這裏的item.a等同user.a,可是User類里根本沒有a這個屬性,因此出現這個問題應該第一時間去查看 訪問的屬性名是否正確app

 Q:Parameter 'list' not found. Available parameters are [0, 1, param1, param2]maven

 A: 首先解釋Available parameters are [0, 1, param1, param2],mybatish會將傳入的參數按照順序設定默認名字,即這裏看到的0,1,param1,param2,經過@Param註解能夠修改參數名,當傳入的參數有且僅有一個的時候,能夠不使用@Param註解,在定義的sql語句中,#{}裏寫的參數是隨意的!由於傳入的參數只有一個,不管在#{}命名爲何,mybatis都是將這個惟一參數傳入,可是在使用@Param註解的狀況,就必須使用註解指定的名字或者paramX(X指代順序數字),回到本題,在使用List做爲惟一參數的時候,在foreach標籤使用的狀況下是不會出現上述問題。學習

List<User> listById( List<String> id);
<select id="listById" parameterType="scau.zzf.entity.User"  resultType="scau.zzf.entity.User">
        SELECT * FROM users WHERE id IN
        <foreach collection="list" item="item" separator="," open="(" close=")">
            #{item}
        </foreach>
 </select>

  可是在傳入的參數爲多個的時候 ui

 
List<User> listById( List<String> id,String username); //不使用@Param <select id="listById" parameterType="scau.zzf.entity.User" resultType="scau.zzf.entity.User"> SELECT * FROM users WHERE username=#{username} AND id IN <foreach collection="list" item="item" separator="," open="(" close=")"> #{item.id} </foreach> </select>

  此刻錯誤日誌顯示爲 Parameter 'list' not found. Available parameters are [0, 1, param1, param2],這個時候咱們天然就想到,在多個參數的時候必須用@Param 指定參數名,纔可以使用咱們的參數規範,不然就必須依據mybatis的參數規範。

  可是對於新手來講,可能還差了一步,foreach標籤中collection的選擇比較多的是list或者array,在傳入的參數只有一個的時候,這是絕對正確的,但在多個的時候,這裏的collection要依照@Param指定的名稱。

  能夠閱讀這篇博客深刻了解mybatis參數 http://blog.csdn.net/isea533/article/details/44002219,涉及的大多數是源碼,新手極可能看不懂,我這裏權當拋磚引玉。

2、模糊查詢怎麼作

  新手涉及到使用mybatis作模糊查詢的使用,會首先在xml文件裏定義sql的時候儘可能拼接上%,而後碰壁,怎麼嘗試都不對,最後想到了,在傳入參數以前添加上%,結果問題迎刃而解,可是這個方式還不夠優雅,能夠經過bind標籤實現該功能

   <select id="findByUsername" resultType="scau.zzf.entity.User">
    <bind name="pattern" value="username+'%'"></bind>
        SELECT * FROM users WHERE username LIKE #{pattern}
    </select>

 

3、關聯查詢引用的數據混亂

  Q:一對多關聯查詢,多方只返回一條數據,但SQL書寫是正確的

  A:這種狀況常常是查詢返回的主鍵名字是相同的,從而致使返回結果出錯。兩張表的數據庫字段相同,是難以免的,須要結合使用 SQL語句別名和resultMap一塊兒使用便可解決。

4、如何獲取插入對象後該對象的主鍵值

  insert成功以後,mybatis會將插入的值自動綁定到插入的對象的Id屬性中,如下代碼是能正確打印出ID值的。

 <insert id="addUser" >
        INSERT INTO users  (id,username,password,salt) VALUES (#{id},#{username},#{password},#{salt})
    </insert>
  iUserService.addUser(user);//插入成功
  System.out.println(user.getId());//打印ID

  若是使用的主鍵名不是ID,能夠經過修改insert標籤中的keyProperty或者keyColumn。

5、沒法觸發緩存刷新

  簡單的來講,這種狀況發生在關聯查詢的時候,可是更新的卻只是一張表,查卻查的是兩張表,全部當更新一張表的數據的時候,沒法觸發刷新查詢兩張表的緩存數據,具體原理可查看 http://blog.csdn.net/isea533/article/details/44566257

  

6、org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 

  找不到接口聲明,通常狀況下從新檢查下DAO和xml文件對應的id是否一致就能夠解決了。這裏要提出的是另外一種狀況,在IntellJ IDEA中,maven項目工程默認是隻掃描resourses文件下的資源,也就是說若是你在IntellJ IDEA中的maven項目中,要想在src下放xml文件,必須在pom.xml中加入如下代碼

  

<build>
        <finalName>${project.artifactId}</finalName>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
</bulid>

 

 

總結了一下本身學習和使用過程遇到過問題,後續將在更多的實戰經驗中補充出更多,若有不足地方,歡迎在評論區指出,有更多的其餘常見的錯誤狀況,也請你們紛紛提出來,這裏強烈建議閱讀http://blog.csdn.net/isea533/article/category/2092001,該博主深刻的講解mybatis的原理知識,更有通用Mapper和分頁插件造福人類,我這裏也僅是拋磚引玉。

  文章如需轉載請說明原處。

相關文章
相關標籤/搜索