將ibatis遷移到mybatis3時需要注意哪些事項?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
新的DTDs
新的sqlMapConfig.xml DTD:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
新的sqlMap (*.map.xml) DTD:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
Configuration配置
配置根節點從 <sqlMapConfig> 變成 <configuration>
Settings配置
在配置的根節點:
<settings x="y" foo="bar"/>
現在是:
<settings> <setting name="x" value="y"/> <setting name="foo" value="bar"/> </settings>
然后
<settings useStatementNamespaces="true"/>
這個配置可以刪除掉,因為使用命名空間已經是一個強制的特性。
<typeAlias>別名 <typeAlias> 必須從 <sqlMap> 元素移動到 <configuration><typeAliases>這里</typeAliases></configuration> <configuration> <settings> ... </settings> <typeAliases> <typeAlias ... /> </typeAliases> </configuration> <transactionManager> 和<dataSource> <transactionManager type="JDBC" commitRequired="false"> <dataSource type="your.package.CustomDataSourceFactory" /> </transactionManager>
變成:
<environments default="env"> <environment id="env"> <transactionManager type="JDBC"> <property name="commitRequired" value="false"/> </transactionManager> <dataSource type="your.package.CustomDataSourceFactory" /> </environment> </environments> <sqlMap> <sqlMap resource=... /> <sqlMap resource=... /> <sqlMap resource=... />
變成:
<mappers> <mapper resource=... /> </mappers>
Mapping
根元素從 <sqlMap> 變成 <mapper>
parameterClass屬性必須改成parameterType
resultClass屬性必須改成resultType
class屬性必須改成type
columnIndex不在<result> 標簽中使用
groupBy屬性已經被廢棄。下面是一個 2.x sqlMap的groupBy 例子:
<resultMap id="productRM" class="product" groupBy="id"> <result property="id" column="product_id"/> <result property="name" column="product_name"/> <result property="category" column="product_category"/> <result property="subProducts" resultMap="Products.subProductsRM"/> </resultMap>
新的:
<resultMap id="productRM" type="product" > <id property="id" column="product "/> <result property="name " column="product_name "/> <result property="category " column="product_category "/> <collection property="subProducts" resultMap="Products.subProductsRM"/> </resultMap>
Nested resultMaps嵌套的resultMaps
現在需要使用<association> 標簽指定.
<resultMap ...> <result property="client" resultMap="Client.clientRM"/> ... </resultMap>
需要改成:
<resultMap ...> <association property="client" resultMap="Client.clientRM"/> ... </resultMap>
<parameterMap>
雖然這個標簽被廢棄了,但是他仍然可以在iBatis 2中使用。但是對3.0.3以上版本當使用type="map"時有一個bug,并不指定 javaType 參數。這將導致:
There is no getter for property named '...' in 'interface java.util.Map'
這將會在MyBatis 3.0.4中解決,對3.0.3版本或更早的版本解決的方法是顯示的指定javaType
Inline parameters內聯參數 #value#
需要改成:
#{value} jdbcType changes jdbcType變化 jdbcType="ORACLECURSOR"
需要改成:
jdbcType="CURSOR"
還有
jdbcType="NUMBER"
需要改成:
jdbcType="NUMERIC" Stored procedures存儲過程 <procedure> 存儲過程的標簽已經不存在了,需要使用 <select>, <insert> 或 <update>標簽。 <procedure id="getValues" parameterMap="getValuesPM"> { ? = call pkgExample.getValues(p_id => ?) } </procedure>
需要改成:
<select id="getValues" parameterMap="getValuesPM" statementType="CALLABLE"> { ? = call pkgExample.getValues(p_id => ?)} </select>
如果你調用一個insert的帶返回值的存儲過程,你可以使用<select>標簽代替<insert>,但是你需要設置specifyuseCache="false" 和flushCache="true",你還必須做一個強制提交(事務)。
對返回數據集的存儲過程,當使用嵌套的resultMap時,這兒有一個bug (例如:出參resultMap包含一個<association> 標簽). 只要問題沒有解決,你必須自己將resultMap定義好,或者嵌套的內容不會被填充。
Caching緩存
<cacheModel id="myCache" type="LRU"> <flushInterval hours="24"/> <property name="size" value="100" /> </cacheModel>
需要改為:
<cache flushInterval="86400000" eviction="LRU"/>
注意:你可以忽略eviction="LRU",因為他是默認值。.
<flushOnExecute> 標簽被flushCache屬性所替代。緩存默認會被所有的查詢語句使用。
Dynamic SQL動態SQL
在我的項目中最常用的的動態SQL是isNotNull. 下面是替換正則表達式的示例:
正則表達式:
<isNotNull.*?property=\"(.*?)\"> </isNotNull>
需要改為:
<if test="$1 != null"> </if>
isEqual最常用,你可以使用類似的<if> 標簽替代.
SqlMapClient
這個類已經不存在了,使用SqlSessionFactory替代 (詳細內容看Mybatis文檔).
Custom type handler
用 TypeHandler 替換接口 TypeHandlerCallback。它具有稍有不同,但方法類似。
Custom data source factory
舊的接口:
com.ibatis.sqlmap.engine.datasource.DataSourceFactory
新的接口:
org.apache.ibatis.datasource.DataSourceFactory
替換下面的方法
public void initialize(Map properties)
為:
public void setProperties(Properties props)
看完上述內容,你們掌握將ibatis遷移到mybatis3時需要注意哪些事項的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。