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


一、參數為集合

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

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

 

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

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

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

   ‘frch'代表的是在循環內部參數的前綴,’item‘則 標簽中指定的item的名字,后面的數字則代表循環中的第幾個參數

  接口中的方法的定義如下:

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

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

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

 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>

  但是在傳入的參數為多個的時候 

 
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,涉及的大多數是源碼,新手很可能看不懂,我這里權當拋磚引玉。

二、模糊查詢怎么做

  新手涉及到使用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>

 

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

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

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

四、如何獲取插入對象后該對象的主鍵值

  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。

五、無法觸發緩存刷新

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

  

六、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和分頁插件造福人類,我這里也僅是拋磚引玉。

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

  


免責聲明!

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



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