MyBatis_ibatis和mybatis的區別【轉】

1. ibatis3.*版本以后正式改名為mybaits,它也從apache轉到了google code下;也就是說ibatis2.*,mybatis3.*。

2. 映射文件的不同


ibatis的配置文件如下

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapConfig      PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"><sqlMapConfig><!-- 公共配置 --><settings useStatementNamespaces="true" maxRequests="3000"maxSessions="1000" maxTransactions="3000" /><!-- 配置文件		begin -->	<sqlMap resource="com/test/biz/dao/sql/AA_SqlMap.xml" />
<pre name="code" class="html">	<sqlMap resource="com/test/biz/dao/sql/BB_SqlMap.xml" />
</sqlMapConfig>


mybatis的配置文件如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!-- changes from the defaults for testing --><setting name="cacheEnabled" value="false" /><setting name="useGeneratedKeys" value="true" /><setting name="defaultExecutorType" value="REUSE" /><!-- 延遲加載 --><setting name="lazyLoadingEnabled" value="true" /><setting name="aggressiveLazyLoading" value="false" /></settings><mappers><mapper resource="com/test/biz/dao/sql/AAMapper.xml"/></mappers>
</configuration>


從以上兩個配置文件,大致分析有哪些不同點:

2.1 dtd約束文件不同

2.2 ibatis中根元素是sqlMapConfig,mybatis中是configuration;

2.3 settings屬性的不同配置

ibatis中是

<settings 屬性1="屬性值1"?屬性2="屬性值2"??屬性x="屬性值x"/>

mybatis中是

<settings>

<setting name="屬性1" value="屬性值1"/>

<setting name="屬性2" value="屬性值2"/>


<setting name="屬性x" value="屬性值x"/>


</settings>
2.4 ibatis中是使用sqlMap元素,mybatis中是使用mappers元素;

2.5 數據庫表的映射區別

ibatis中某表的映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="PP_CLASS_PROPERTY"><resultMap id="BaseResultMap" class="com.test.biz.dto.PpClassProperty"><result column="ID" property="id" jdbcType="VARCHAR" /><result column="CLASS_ID" property="classId" jdbcType="VARCHAR" /><result column="PROPERTY_ID" property="propertyId" jdbcType="VARCHAR" /><result column="INPUT_TYPE" property="inputType" jdbcType="VARCHAR" /><result column="SORT_NUM" property="sortNum" jdbcType="DECIMAL" /><result column="DESCRIPTION" property="description" jdbcType="VARCHAR" /><result column="CREATED_DATE" property="createdDate" jdbcType="TIMESTAMP" /><result column="CREATED_BY" property="createdBy" jdbcType="VARCHAR" /><result column="UPDATED_DATE" property="updatedDate" jdbcType="TIMESTAMP" /><result column="UPDATED_BY" property="updatedBy" jdbcType="VARCHAR" /><result column="STATUS" property="status" jdbcType="DECIMAL" /><result column="IS_KEY" property="isKey" jdbcType="DECIMAL" /><result column="IS_SPU" property="isSpu" jdbcType="DECIMAL" /><result column="IS_SALE" property="isSale" jdbcType="DECIMAL" /><result column="IS_PRODUCT" property="isProduct" jdbcType="DECIMAL" /><result column="CHANNEL_ID" property="channelId" jdbcType="VARCHAR" /><result column="COMPANY_ID" property="companyId" jdbcType="VARCHAR" /></resultMap><resultMap id="ResultMapWithClassName" class="com.test.biz.dto.PpClassProperty"extends="PP_CLASS_PROPERTY.BaseResultMap"><result property="propertyName" jdbcType="VARCHAR" /><result property="className" jdbcType="VARCHAR" /></resultMap><resultMap id="ResultMapWithClassNameForPage" class="com.test.biz.dto.PpClassProperty"extends="PP_CLASS_PROPERTY.BaseResultMap"><result property="propertyName" jdbcType="VARCHAR" /><result property="className" jdbcType="VARCHAR" /><result column="rnum" property="rnum" jdbcType="VARCHAR" /></resultMap><sql id="Base_Column_List">ID, CLASS_ID, PROPERTY_ID, INPUT_TYPE, SORT_NUM,DESCRIPTION,CREATED_DATE, CREATED_BY,UPDATED_DATE, UPDATED_BY, STATUS,IS_KEY, IS_SPU, IS_SALE, IS_PRODUCT,CHANNEL_ID,COMPANY_ID</sql><sql id="p_Base_Column_List">P.ID, P.CLASS_ID, P.PROPERTY_ID, P.INPUT_TYPE, P.SORT_NUM,P.DESCRIPTION,P.CREATED_DATE,P.CREATED_BY, P.UPDATED_DATE,P.UPDATED_BY, P.STATUS, P.IS_KEY, P.IS_SPU,P.IS_SALE,P.IS_PRODUCT,P.CHANNEL_ID,P.COMPANY_ID</sql><!-- 0:未刪除 1:已刪除 --><select id="selectByPrimaryKey" resultMap="BaseResultMap"parameterClass="com.test.biz.dto.PpClassProperty">SELECT<include refid="PP_CLASS_PROPERTY.Base_Column_List" />FROM PP_CLASS_PROPERTYWHERE ID = #id:VARCHAR# AND<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" /></select><!-- 刪除執行的是修改狀態為1,表示已刪除 --><update id="deleteByPrimaryKey" parameterClass="com.test.biz.dto.PpClassProperty">UPDATEPP_CLASS_PROPERTYSET STATUS = 1where ID = #id:VARCHAR# AND<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" /></update><!-- 全字段 添加 --><insert id="insert" parameterClass="com.test.biz.dto.PpClassProperty">INSERT INTO PP_CLASS_PROPERTY(<include refid="PP_CLASS_PROPERTY.Base_Column_List" />)VALUES (#id:VARCHAR#, #classId:VARCHAR#,#propertyId:VARCHAR#,#inputType:VARCHAR#,#sortNum:DECIMAL#,#description:VARCHAR#,#createdDate:TIMESTAMP#,#createdBy:VARCHAR#,#updatedDate:TIMESTAMP#,#updatedBy:VARCHAR#, 0,#isKey:DECIMAL#,#isSpu:DECIMAL#,#isSale:DECIMAL#, #isProduct:DECIMAL#,#channelId:VARCHAR#,#companyId:VARCHAR#)</insert><!-- 動態修改 --><update id="updateByPrimaryKeySelective" parameterClass="com.test.biz.dto.PpClassProperty">UPDATE PP_CLASS_PROPERTY<dynamic prepend="set"><isNotNull prepend="," property="classId">CLASS_ID =#classId:VARCHAR#</isNotNull><isNotNull prepend="," property="propertyId">PROPERTY_ID =#propertyId:VARCHAR#</isNotNull><isNotNull prepend="," property="inputType">INPUT_TYPE =#inputType:VARCHAR#</isNotNull><isNotNull prepend="," property="sortNum">SORT_NUM =#sortNum:DECIMAL#</isNotNull><isNotNull prepend="," property="description">DESCRIPTION =#description:VARCHAR#</isNotNull><isNotNull prepend="," property="createdDate">CREATED_DATE =#createdDate:TIMESTAMP#</isNotNull><isNotNull prepend="," property="createdBy">CREATED_BY =#createdBy:VARCHAR#</isNotNull><isNotNull prepend="," property="updatedDate">UPDATED_DATE =#updatedDate:TIMESTAMP#</isNotNull><isNotNull prepend="," property="updatedBy">UPDATED_BY =#updatedBy:VARCHAR#</isNotNull><isNotNull prepend="," property="status">STATUS = #status:DECIMAL#</isNotNull><isNotNull prepend="," property="isKey">IS_KEY = #isKey:DECIMAL#</isNotNull><isNotNull prepend="," property="isSpu">IS_SPU = #isSpu:DECIMAL#</isNotNull><isNotNull prepend="," property="isSale">IS_SALE = #isSale:DECIMAL#</isNotNull><isNotNull prepend="," property="isProduct">IS_PRODUCT =#isProduct:DECIMAL#</isNotNull></dynamic>WHERE ID = #id:VARCHAR# AND<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" /></update><!--查詢類目已經關聯的屬性 0:未刪除 1:已刪除 --><select id="selectByClassId" resultMap="BaseResultMap"parameterClass="com.test.biz.dto.PpClassProperty">SELECT<include refid="PP_CLASS_PROPERTY.Base_Column_List" />FROM PP_CLASS_PROPERTYWHERE CLASS_ID = #classId:VARCHAR# AND<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" /></select><!-- 統計 查詢類目已經關聯的屬性的數量 0:未刪除 1:已刪除 --><select id="countByClassId" resultClass="integer"parameterClass="com.test.biz.dto.PpClassProperty">SELECTCOUNT(ID)FROM PP_CLASS_PROPERTYWHERE CLASS_ID =#classId:VARCHAR# AND<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" /></select><!--根據類目id查詢類目屬性(包含類目名稱和屬性名稱) 0:未刪除 1:已刪除 --><select id="selectWithClassNameByClassId" resultMap="ResultMapWithClassName"parameterClass="map">SELECT<include refid="p_Base_Column_List" />,PP.PROPERTY_NAME PROPERTYNAME,PC.CLASS_NAME CLASSNAMEFROMPP_CLASS_PROPERTY P,PP_PROPERTY PP,PP_CLASS PCWHERE P.CLASS_ID =#classId# AND P.CHANNEL_ID = #channelId# AND P.COMPANY_ID =#companyId#<isNotNull property="likeName">AND PP.PROPERTY_NAME LIKE '%'||#likeName#||'%'</isNotNull>AND P.CLASS_ID = PC.ID AND P.PROPERTY_ID = PP.IDAND P.CHANNEL_ID =PC.CHANNEL_ID AND P.CHANNEL_ID = PP.CHANNEL_IDAND P.COMPANY_ID =PC.COMPANY_ID AND P.COMPANY_ID = PP.COMPANY_IDAND P.STATUS=0 ANDPP.STATUS=0 AND PC.STATUS=0</select><!--根據類目id查詢類目屬性(包含類目名稱和屬性名稱) 查詢總數 --><select id="countPageFindPpClassPropertyByClassId" resultClass="integer"parameterClass="map">SELECTCOUNT(1)FROMPP_CLASS_PROPERTY P,PP_PROPERTY PP,PP_CLASS PCWHERE P.CLASS_ID =#classId# AND P.CHANNEL_ID = #channelId# AND P.COMPANY_ID =#companyId#<isNotNull property="likeName">AND PP.PROPERTY_NAME LIKE '%'||#likeName#||'%'</isNotNull>AND P.CLASS_ID = PC.ID AND P.PROPERTY_ID = PP.IDAND P.CHANNEL_ID =PC.CHANNEL_ID AND P.CHANNEL_ID = PP.CHANNEL_IDAND P.COMPANY_ID =PC.COMPANY_ID AND P.COMPANY_ID = PP.COMPANY_IDAND P.STATUS=0 ANDPP.STATUS=0 AND PC.STATUS=0</select><!-- 根據類目id查詢該條記錄時關鍵屬性并且時type類型是input的值的信息 --><select id="findInputClassProperty" resultClass="java.util.HashMap"parameterClass="com.test.biz.dto.PpClassProperty">SELECT INPUT_TYPE AS "inputType" FROM PP_CLASS_PROPERTYWHERECLASS_ID=#classId# AND IS_KEY=1 AND (INPUT_TYPE='input' OR INPUT_TYPE='textarea') AND<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" /></select></sqlMap>

mybatis的數據庫表映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.ilvyou.system.dao.SysUserMapper" ><resultMap id="BaseResultMap" type="com.ilvyou.system.entity.SysUserEntity" ><id property="id" column="ID" jdbcType="VARCHAR"/><result property="loginName" column="LOGIN_NAME" jdbcType="VARCHAR"/><result property="loginPass" column="LOGIN_PASS" jdbcType="VARCHAR"/><result property="userType" column="USER_TYPE" jdbcType="VARCHAR"/><result property="regDate" column="REG_DATE" jdbcType="CHAR"/><result property="email" column="EMAIL" jdbcType="VARCHAR"/><result property="mobile" column="MOBILE" jdbcType="VARCHAR"/><result property="qq" column="QQ" jdbcType="VARCHAR"/><result property="photo" column="PHOTO" jdbcType="VARCHAR"/><result property="cardType" column="CARD_TYPE" jdbcType="VARCHAR"/><result property="cardValue" column="CARD_VALUE" jdbcType="VARCHAR"/><result property="userName" column="USER_NAME" jdbcType="VARCHAR"/><result property="userSex" column="USER_SEX" jdbcType="VARCHAR"/><result property="userBir" column="USER_BIR" jdbcType="CHAR"/><result property="userAddr" column="USER_ADDR" jdbcType="VARCHAR"/><result property="jobName" column="JOB_NAME" jdbcType="VARCHAR"/><result property="jobAddr" column="JOB_ADDR" jdbcType="VARCHAR"/><result property="jobTel" column="JOB_TEL" jdbcType="VARCHAR"/><result property="bornAddr" column="BORN_ADDR" jdbcType="VARCHAR"/><result property="userStatus" column="USER_STATUS" jdbcType="INTEGER"/><result property="roleType" column="ROLE_TYPE" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">ID          ,LOGIN_NAME  ,LOGIN_PASS  ,USER_TYPE   ,REG_DATE    ,EMAIL       ,MOBILE      ,QQ          ,PHOTO       ,CARD_TYPE   ,CARD_VALUE  ,USER_NAME   ,USER_SEX    ,USER_BIR    ,USER_ADDR   ,JOB_NAME    ,JOB_ADDR    ,JOB_TEL     ,BORN_ADDR   ,USER_STATUS ,ROLE_TYPE</sql><sql id="select_by_page_outter_orderby_sql" ><if test="orderByClause != null">    order by ${orderByClause}   </if> </sql><!--select mothed--><select id="selectByPrimaryKey" parameterType="String" resultMap="SysUserEntityResultMap">select <include refid="Base_Column_List" />from SYS_USERwhere ID = #{id,jdbcType=VARCHAR}</select><!--insert mothed--><insert id="insert" parameterType="com.ilvyou.system.entity.SysUserEntity">insert into SYS_USER (<include refid="Base_Column_List" />)values (#{id,jdbcType=VARCHAR},#{loginName,jdbcType=VARCHAR},#{loginPass,jdbcType=VARCHAR},#{userType,jdbcType=VARCHAR},#{regDate,jdbcType=CHAR},#{email,jdbcType=VARCHAR},#{mobile,jdbcType=VARCHAR},#{qq,jdbcType=VARCHAR},#{photo,jdbcType=VARCHAR},#{cardType,jdbcType=VARCHAR},#{cardValue,jdbcType=VARCHAR},#{userName,jdbcType=VARCHAR},#{userSex,jdbcType=VARCHAR},#{userBir,jdbcType=CHAR},#{userAddr,jdbcType=VARCHAR},#{jobName,jdbcType=VARCHAR},#{jobAddr,jdbcType=VARCHAR},#{jobTel,jdbcType=VARCHAR},#{bornAddr,jdbcType=VARCHAR},#{userStatus,jdbcType=INTEGER},#{roleType,,jdbcType=VARCHAR})</insert><insert id="batchInsert" >    insert into SYS_USER (<include refid="Base_Column_List" />)  values     <foreach collection="list" item="item" index="index" separator=",">(#{item.id,jdbcType=VARCHAR},#{item.loginName,jdbcType=VARCHAR},#{item.loginPass,jdbcType=VARCHAR},#{item.userType,jdbcType=VARCHAR},#{item.regDate,jdbcType=CHAR},#{item.email,jdbcType=VARCHAR},#{item.mobile,jdbcType=VARCHAR},#{item.qq,jdbcType=VARCHAR},#{item.photo,jdbcType=VARCHAR},#{item.cardType,jdbcType=VARCHAR},#{item.cardValue,jdbcType=VARCHAR},#{item.userName,jdbcType=VARCHAR},#{item.userSex,jdbcType=VARCHAR},#{item.userBir,jdbcType=CHAR},#{item.userAddr,jdbcType=VARCHAR},#{item.jobName,jdbcType=VARCHAR},#{item.jobAddr,jdbcType=VARCHAR},#{item.jobTel,jdbcType=VARCHAR},#{item.bornAddr,jdbcType=VARCHAR},#{item.userStatus,jdbcType=INTEGER},#{item.roleType,jdbcType=VARCHAR})</foreach></insert><update id="updateByPrimaryKeySelective" parameterType="com.ilvyou.system.entity.SysUserEntity">update SYS_USER<set><if test="id != null">ID = #{id,jdbcType=VARCHAR},</if><if test="loginName != null">LOGIN_NAME = #{loginName,jdbcType=VARCHAR},</if><if test="loginPass != null">LOGIN_PASS = #{loginPass,jdbcType=VARCHAR},</if><if test="userType != null">USER_TYPE = #{userType,jdbcType=VARCHAR},</if><if test="regDate != null">REG_DATE = #{regDate,jdbcType=CHAR},</if><if test="email != null">EMAIL = #{email,jdbcType=VARCHAR},</if><if test="mobile != null">MOBILE = #{mobile,jdbcType=VARCHAR},</if><if test="qq != null">QQ = #{qq,jdbcType=VARCHAR},</if><if test="photo != null">PHOTO = #{photo,jdbcType=VARCHAR},</if><if test="cardType != null">CARD_TYPE = #{cardType,jdbcType=VARCHAR},</if><if test="cardValue != null">CARD_VALUE = #{cardValue,jdbcType=VARCHAR},</if><if test="userName != null">USER_NAME = #{userName,jdbcType=VARCHAR},</if><if test="userSex != null">USER_SEX = #{userSex,jdbcType=VARCHAR},</if><if test="userBir != null">USER_BIR = #{userBir,jdbcType=CHAR},</if><if test="userAddr != null">USER_ADDR = #{userAddr,jdbcType=VARCHAR},</if><if test="jobName != null">JOB_NAME = #{jobName,jdbcType=VARCHAR},</if><if test="jobAddr != null">JOB_ADDR = #{jobAddr,jdbcType=VARCHAR},</if><if test="jobTel != null">JOB_TEL = #{jobTel,jdbcType=VARCHAR},</if><if test="bornAddr != null">BORN_ADDR = #{bornAddr,jdbcType=VARCHAR},</if><if test="userStatus != null">USER_STATUS = #{userStatus,jdbcType=INTEGER},</if><if test="roleType != null">ROLE_TYPE = #{roleType,jdbcType=VARCHAR},</if></set>where ID = #{id,jdbcType=VARCHAR}</update><update id="batchUpdateByPrimaryKey" >    <foreach collection="list" item="item" index="index">        update SYS_USER set LOGIN_NAME = #{item.loginName,jdbcType=VARCHAR},LOGIN_PASS = #{item.loginPass,jdbcType=VARCHAR},USER_TYPE = #{item.userType,jdbcType=VARCHAR},REG_DATE = #{item.regDate,jdbcType=CHAR},EMAIL = #{item.email,jdbcType=VARCHAR},MOBILE = #{item.mobile,jdbcType=VARCHAR},QQ = #{item.qq,jdbcType=VARCHAR},PHOTO = #{item.photo,jdbcType=VARCHAR},CARD_TYPE = #{item.cardType,jdbcType=VARCHAR},CARD_VALUE = #{item.cardValue,jdbcType=VARCHAR},USER_NAME = #{item.userName,jdbcType=VARCHAR},USER_SEX = #{item.userSex,jdbcType=VARCHAR},USER_BIR = #{item.userBir,jdbcType=CHAR},USER_ADDR = #{item.userAddr,jdbcType=VARCHAR},JOB_NAME = #{item.jobName,jdbcType=VARCHAR},JOB_ADDR = #{item.jobAddr,jdbcType=VARCHAR},JOB_TEL = #{item.jobTel,jdbcType=VARCHAR},BORN_ADDR = #{item.bornAddr,jdbcType=VARCHAR},USER_STATUS = #{item.userStatus,jdbcType=INTEGER},ROLE_TYPE = #{item.roleType,jdbcType=VARCHAR}where ID = #{item.id,jdbcType=VARCHAR}</foreach></update><!--delete mothed--><delete id="deleteByPrimaryKey" parameterType="String">delete from SYS_USERwhere ID = #{id,jdbcType=VARCHAR}</delete><delete id="batchDelete">delete from SYS_USER where ID in (<foreach collection="list" item="item" index="index" separator=",">#{item.id,jdbcType=VARCHAR}</foreach>)</delete></mapper>

兩者的區別有:

2.5.1 ibatis中根元素是sqlMap,mybatis中是mapper;

2.5.2?在 iBatis 中,namespace 不是必需的,且它的存在沒有實際的意義。在 MyBatis 中,namespace 終于派上用場了,它使得映射文件與接口綁定變得非常自然。

2.5.3 ibatis中有resultMap和resultClass兩種返回類型,resultMap是我們在ibatis的配置文件中定義的,也就是在配置文件中使用resultMap元素定義的;resultClass是指java語言中內置的類型,如:integer、java.util.HashMap等等;

mybatis中將兩者統一為resultType,這樣挺好的,開發者不用再記兩個屬性了。

2.5.4 ibatis中有parameterClass,mybatis中有parameterType,兩者區別不大。

2.5.5 參數的寫法比較

ibatis中寫法,如代碼片段:

WHERE ID = #id:VARCHAR#

mybatis中寫法,如代碼片段:

where ID = #{id,jdbcType=VARCHAR}
2.5.6?iBatis/MyBatis 調用存儲過程的寫法


iBatis 調用存儲過程的方法,通過使用 <procedure> 元素進行存儲過程的調用:

<parameterMap id="swapParameters" class="map" >     <parameter property="contactId" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>     <parameter property="firstName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>       <parameter property="lastName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>     </parameterMap>     <procedure id="swapContactName" parameterMap="swapParameters" >     {call swap_contact_name (?, ?,?)}      </procedure>   


在 MyBatis 中,<proccedure> 元素已經被移除,通過 <select>、<insert> 和 <update> 進行定義:

  <select id="swapContactName" parameterMap="swapParameters" statementType="CALLABLE">  { ? = call swap_contact_name (?,?,?)}   </select>

如上所示,通過 statementType 屬性將該語句標識為存儲過程而非普通 SQL 語句。

2.6 ibatis和mybatis與spring的集成配置

ibatis的配置

	<!--===================================================================== --><!-- iBATIS 配置文件定義 --><!--===================================================================== --><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:sqlMap-config.xml" /><property name="dataSource" ref="dataSource" /></bean>

mybatis的配置

	<!-- define the MyBatis SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:com/ilvyou/core/config/mybatis-config.xml" /><property name="mapperLocations" value="classpath*:com/ilvyou/**/*Mapper.xml" /></bean>


通過前面的示例可以看出,MyBatis 在編碼中的最大的改變就是將一個最常用的 API 由 SqlMapClient 改為了 SqlSessionFactory。另外,類型處理器接口也由原來的 TypeHandlerCallback 改為了 TypeHandler。最后 DataSourceFactory 也進行了調整,移動到 org.apache.ibatis.datasource 包下,其中的方法也作了微調。總之,代碼層面公開的部分改動較少,不會給開發者造成較大的移植成本。



來自為知筆記(Wiz)


轉載于:https://www.cnblogs.com/gossip/p/6064414.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android gallery自動播放,可循環顯示圖像的Android Gallery組件

類型&#xff1a;源碼相關大小&#xff1a;23.6M語言&#xff1a;中文 評分&#xff1a;9.1標簽&#xff1a;立即下載第 4 頁 實現循環顯示圖像的Gallery組件實現循環顯示圖像的Gallery組件在本節將組出與循環顯示圖像相關的ImageAdapter類的完整代碼。讀者可以從中看到上一節介…

docker內程序如何讀取dockerfile和compose.yml中設置的環境變量

docker內程序如何讀取dockerfile和compose.yml中設置的環境變量 背景 compose文件中配置了服務A和服務B&#xff0c;其中B服務調用了A服務的接口&#xff0c;那么B的實現代碼中該如何調用A的服務呢&#xff1f; 解決 compose文件中&#xff0c;服務B的配置加入A的接口&#xff…

2015年10月13日

關于掙錢&#xff0c;我覺得&#xff0c;只要興趣所在&#xff0c;能把事做好&#xff0c;錢自己就會來。收入上不去&#xff0c;往往是做的事情就不在高收入的那個區間&#xff0c;寫程序很難出富翁。說實話&#xff0c;外圍一天的消費可能就是你工資的好幾倍&#xff0c;不用…

Spring Boot Servlet

上一篇我們對如何創建Controller 來響應JSON 以及如何顯示數據到頁面中&#xff0c;已經有了初步的了解。 Web開發使用 Controller 基本上可以完成大部分需求&#xff0c;但是我們還可能會用到 Servlet、Filter、Listener、Interceptor 等等。 當使用spring-Boot時&#xff0c;…

基于相關性分析系統性能瓶頸

測試的過程中&#xff0c;難免需要會遇到一些性能瓶頸&#xff0c;那么就要求我們能夠分析出性能瓶頸&#xff0c;并給出解決方案。性能瓶頸很抽象&#xff0c;我們可以通過數據使其具象。以我工作內容為例&#xff0c;服務器處理數據的能力是有限的&#xff0c;那么其處理的邊…

curl網站開發指南

curl網站開發指南 作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月 4日 我一向以為&#xff0c;curl只是一個編程用的函數庫。 最近才發現&#xff0c;這個命令本身&#xff0c;就是一個無比有用的網站開發工具&#xff0c;請看我整理的它的用法。 curl網站開發指南 阮一…

android格式化時間中文版,Android 仿微信聊天時間格式化顯示功能

本文給大家分享android仿微信聊天時間格式化顯示功能。在同一年的顯示規則&#xff1a;如果是當天顯示格式為 HH:mm 例&#xff1a;14:45如果是昨天,顯示格式為 昨天 HH:mm 例&#xff1a;昨天 13:12如果是在同一周 顯示格式為 周一 HH:mm 例&#xff1a;周一14:05如果不是同一…

java分享第十七天-01(封裝操作xml類)

做自動化測試的人&#xff0c;都應該對XPATH很熟悉了&#xff0c;但是在用JAVA解析XML時&#xff0c;我們通常是一層層的遍歷進去&#xff0c;這樣的代碼的局限性很大&#xff0c;也不方便&#xff0c;于是我們結合一下XPATH&#xff0c;來解決這個問題。所需要的JAR包&#xf…

Ubuntu12.04 內核樹建立

先查看自己使用的內核版本 linlin-virtual-machine:~$ uname -r 3.2.0-23-generic 如果安裝系統時&#xff0c;自動安裝了源碼。在 /usr/src 目錄下有對應的使用的版本目錄。 linlin-virtual-machine:~$ cd /usr/src linlin-virtual-machine:/usr/src$ ls linux-headers-3.2.0…

【mysql】Innodb三大特性之double write

1、doublewrite buffer&#xff08;mysql官方的介紹&#xff09; InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous area called the doublewrite buffer. Only after the wr…

android crop 大圖,com.android.camera.action.CROP 實現圖片剪裁

APP 中選取圖片之后&#xff0c;有時候需要進行剪裁&#xff0c;比如頭像。以下是啟動代碼。在我的項目中&#xff0c;傳的是 filePath&#xff0c;所以我轉了一下&#xff0c;但實際上從相冊選擇圖片后&#xff0c;用 data.getData() 就可獲得 uri。Uri uri Uri.fromFile(new…

Who Gets the Most Candies? POJ - 2886 (線段樹)

按順時針給出n個小孩&#xff0c;n個小孩每個人都有一個紙&#xff0c;然后每個人都有一個val&#xff0c;這個val等于自己的因子數&#xff0c;如果這個val是正的&#xff0c;那就順時針的第val個孩子出去&#xff0c;如果是負的話&#xff0c;就逆時針的第val個孩子出去&…

javax.validation.ValidationException: Unable to find a default provider

2019獨角獸企業重金招聘Python工程師標準>>> [ERROR] [2016-11-16 13:58:21 602] [main] (FrameworkServlet.java:457) Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframewo…

第十章練習題----2

package com.Hanqi2;public class xitizhuhanshu {public static void main(String[] args) {// TODO Auto-generated method stubxiti tm new xiti("黑色","15寸");xitizhs tm3 new xitizhs("藍色","15寸");tm.Call("654"…

關于微信“被返回頁”在被返回時自動刷新

網上有很多這些文章&#xff0c;但我覺得沒一篇真正解決這個問題&#xff0c;倒是能給人一個解決方案的思路&#xff0c;對&#xff0c;就是posState事件。 要解決這個問題也不難&#xff0c;使用history的replaceState屬性替換當前網頁鏈接&#xff08;其實作用是在不增加hist…

android視頻播放器api,03.視頻播放器Api說明

03.視頻播放器Api說明目錄介紹01.最簡單的播放02.如何切換視頻內核03.切換視頻模式04.切換視頻清晰度05.視頻播放監聽06.列表中播放處理07.懸浮窗口播放08.其他重要功能Api09.播放多個視頻10.VideoPlayer相關Api11.Controller相關Api12.邊播放邊緩存api13.類似抖音視頻預加載14…

使用Python重命名MP3標簽

從Window復制MP3文件的到Ubuntu下&#xff0c;MP3標簽很多是亂碼。于是想自己寫個Python程序處理一下。 從酷狗復制過來的音樂文件名都是“作者 - 標題”&#xff0c;所以可以通過解析文件名直接獲取作者和標題信息。 需要下載eyeD3模塊 $ sudo apt-get install python-eyed3 代…

Taurus.MVC 2.0 開源發布:WebAPI開發教程

背景&#xff1a; 有用戶反映&#xff0c;Tausus.MVC 能寫WebAPI么&#xff1f; 能&#xff01; 教程呢&#xff1f; 嗯&#xff0c;木有&#xff01; 好吧&#xff0c;剛好2.0出來&#xff0c;就帶上WEBAPI教程了&#xff01; 開源地址&#xff1a; https://github.com/cyq116…

android 鎖屏 home,android 鎖屏界面禁用長按home 和menu(recent apps)

android 5.1 系統中public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {//檢查當前是否鎖屏&#xff0c; 可以添加getTopApp()判斷當前activity 來屏蔽2398 final boolean keyguardOn keyguardOn();添加新的方法&#xff1a;//獲…

Chrome瀏覽器調試踩坑

Chrome瀏覽器若在響應式狀態下&#xff0c;頁面縮放比例不是100%&#xff0c;元素會“竄位”&#xff0c;點擊元素會點擊到元素周圍的元素 Chrome頁面縮放比例不為100%時&#xff0c;table的單元格就算沒有邊框&#xff08;CSS去掉了&#xff09;也會顯示出邊框&#xff08;縫隙…