1. ibatis3.*版本以后正式改名为mybaits,它也从apache转到了google code下;也就是说ibatis2.*,mybatis3.*。
2. 映射文件的不同
ibatis的配置文件如下
xml version = "1.0" encoding = "UTF-8" ?>
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" />
< 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" />
mybatis的配置文件如下
xml version = "1.0" encoding = "UTF-8" ?>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
< configuration >
< settings >
< 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中是
mybatis中是
2.4 ibatis中是使用sqlMap元素,mybatis中是使用mappers元素;
2.5 数据库表的映射区别
ibatis中某表的映射文件
xml version = "1.0" encoding = "UTF-8" ?>
>
< 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 >
< select id = "selectByPrimaryKey" resultMap = "BaseResultMap"
parameterClass = "com.test.biz.dto.PpClassProperty" >
SELECT
< include refid = "PP_CLASS_PROPERTY.Base_Column_List" />
FROM PP_CLASS_PROPERTY
WHERE ID = #id:VARCHAR# AND
< include refid = "COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" />
select >
< update id = "deleteByPrimaryKey" parameterClass = "com.test.biz.dto.PpClassProperty" >
UPDATE
PP_CLASS_PROPERTY
SET STATUS = 1
where 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 >
< select id = "selectByClassId" resultMap = "BaseResultMap"
parameterClass = "com.test.biz.dto.PpClassProperty" >
SELECT
< include refid = "PP_CLASS_PROPERTY.Base_Column_List" />
FROM PP_CLASS_PROPERTY
WHERE CLASS_ID = #classId:VARCHAR# AND
< include refid = "COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" />
select >
< select id = "countByClassId" resultClass = "integer"
parameterClass = "com.test.biz.dto.PpClassProperty" >
SELECT
COUNT(ID)
FROM PP_CLASS_PROPERTY
WHERE CLASS_ID =
#classId:VARCHAR# AND
< include refid = "COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" />
select >
< select id = "selectWithClassNameByClassId" resultMap = "ResultMapWithClassName"
parameterClass = "map" >
SELECT
< include refid = "p_Base_Column_List" />
,PP.PROPERTY_NAME PROPERTYNAME,PC.CLASS_NAME CLASSNAME
FROM
PP_CLASS_PROPERTY P,PP_PROPERTY PP,PP_CLASS PC
WHERE 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 .ID
AND P.CHANNEL_ID =
PC .CHANNEL_ID AND P.CHANNEL_ID = PP .CHANNEL_ID
AND P.COMPANY_ID =
PC .COMPANY_ID AND P.COMPANY_ID = PP .COMPANY_ID
AND P.STATUS = 0 AND
PP.STATUS = 0 AND PC.STATUS = 0
select >
< select id = "countPageFindPpClassPropertyByClassId" resultClass = "integer"
parameterClass = "map" >
SELECT
COUNT(1)
FROM
PP_CLASS_PROPERTY P,PP_PROPERTY PP,PP_CLASS PC
WHERE 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 .ID
AND P.CHANNEL_ID =
PC .CHANNEL_ID AND P.CHANNEL_ID = PP .CHANNEL_ID
AND P.COMPANY_ID =
PC .COMPANY_ID AND P.COMPANY_ID = PP .COMPANY_ID
AND P.STATUS = 0 AND
PP.STATUS = 0 AND PC.STATUS = 0
select >
< select id = "findInputClassProperty" resultClass = "java.util.HashMap"
parameterClass = "com.test.biz.dto.PpClassProperty" >
SELECT INPUT_TYPE AS "inputType" FROM PP_CLASS_PROPERTY
WHERE
CLASS_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" ?>
>
< 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 id = "selectByPrimaryKey" parameterType = "String" resultMap = "SysUserEntityResultMap" >
select
< include refid = "Base_Column_List" />
from SYS_USER
where ID = #{id, jdbcType = VARCHAR }
select >
< 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 id = "deleteByPrimaryKey" parameterType = "String" >
delete from SYS_USER
where 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中写法,如代码片段:
mybatis中写法,如代码片段:
where ID = #{id, jdbcType = VARCHAR }
2.5.6 iBatis/MyBatis 调用存储过程的写法
iBatis 调用存储过程的方法,通过使用 元素进行存储过程的调用:
< 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 中, 元素已经被移除,通过 、 和 进行定义:
< select id = "swapContactName" parameterMap = "swapParameters" statementType = "CALLABLE" >
{ ? = call swap_contact_name (?,?,?)}
select >
如上所示,通过 statementType 属性将该语句标识为存储过程而非普通 SQL 语句。
2.6 ibatis和mybatis与spring的集成配置
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的配置
< 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 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本。