MyBatis+spring遇到的問題


 1.PropertyPlaceholderConfigurer無效

昨天白天就遇到了這個問題,applicationContext里的dataSource使用PropertyPlaceholder,如<property name="driverClassName" value="${jdbc.driver}" />,然后啟動spring一直報[${jdbc.driver}]無法加載,這里用到了spring  3.0的新特性profiles,起先還以為profiles設置問題,后來把profiles撤掉問題依舊。不用占位符,直接填實際值是可以的。而且就算<property name="ignoreResourceNotFound" value="false" />這樣設置也不會報錯,這是不應該的。以前一直用占位符方式也都沒出現過問題,然后就下班了。回家玩了會兒游戲,打得爽了,心情好就想再看看這個問題。我把MyBatis有關的配置全撤掉,一個一個加上去,當加到MapperScannerConfigurer的時候就出現問題, 沒加的時候properties文件不存在也會報錯,那問題肯定就在這里了。用google搜了一把,官網有人說MapperScannerConfigurer會在PropertyPlaceholderConfigurer之前進行掃描,所以它或它依賴的BEAN如果有用到Placeholder的都不會被替換掉。他沒有提到這也會導致ignoreResourceNotFound=false失效。。。沒辦法,只好將配置屬性直接寫在applicationContext里了,總比注入到系統變量里強吧。。。

今天又查了一下,發現這里有更好的解決方法http://www.oschina.net/question/188964_32305

2.com.ibatis.sqlmap.engine.type.BaseTypeHandler ClassNotFoundException

接下來就是這個異常了,我反復仔細查看mybatis包和mybatis-spring包,就是沒找到com.ibatis.sqlmap.*包,起初以為版本問題,換mybatis-3.1.0和mybatis-spring-1.1.0,問題依舊,工程只有一個Mapper.xml,這個Mapper.xml去掉就不報錯,加上就報錯,當時我就陷入了泥沼,犯迷糊了。搜也搜不到解答,糾結了很久,另外創一個小工程,只引入spring和mybatis包,還是一樣的問題,於是想給mybatis提個Issue, 在填寫Issue列依賴包的時候我突然看spring-orm這個包非常地礙眼,於是看了一下里面的類,在org.springframework.orm.ibatis.support包下找到若干TypeHandler,其中BlobByteArrayTypeHandler是我有用到的。因為我看到它對Oracle的Blob插入會先創建一個空的Blob,得到流再往流里寫實際的數據,這是ORACLE對較大BLOB的做法,而MyBatis的BlobTypeHandler沒有這么做,所以我就選了它。打開BlobByteArrayTypeHandler源碼,看到了真胸,在它的父類AbstractLobTypeHandler里有這個import com.ibatis.sqlmap.engine.type.BaseTypeHandler,怪我自己不仔細查看Mapper.xml了,早看到異常的BaseTypeHandler就應該想到那個BlobByteArrayTypeHandler了,不過在這里也要鄙視一下spring,都到3.1.1.RELEASE了居然還只對ibatis2支持,對hibernate倒是非常上心,hibernate4也已經支持了。果然基友只能有一個啊。。。不然菊花殘得快。

3.XML fragments parsed from previous mappers does not contain value for xxx

最后一個問題就是這個了,因為以前基本沒用過IBatis/MyBatis,只是寫過一個小DEMO,對其Mapper.xml的語法還不怎么了解,其中有個配置

<select id="findAll" resultMap="modelResult">
<![CDATA[
select * from t_model
]]>
</select>

<select id="findById" parameterType="String" resultMap="ModelResult">
<include refid="findAll"/>
<where>
id=#{id}
</where>
</select>

就報了這個錯,哈哈,沒錯,include的那個findAll不是一個Sql元素,所以就報錯了,這是我自己2了。直接把include換成<![CDATA[
select * from t_model
]]>就好了。

 

搞完這些看時間已經是2點了。。。趕緊睡覺。


免責聲明!

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



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