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 configuration
    PUBLIC "-//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_PROPERTY
		WHERE ID = #id:VARCHAR# AND
		<include refid="COMMON_JUDGEMENT_RULE.Judge_Status_ChannelId_CompanyId" />
	</select>

	<!-- 删除执行的是修改状态为1,表示已删除 -->
	<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>

	<!--查询类目已经关联的属性 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_PROPERTY
		WHERE 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">
		SELECT
		COUNT(ID)
		FROM PP_CLASS_PROPERTY
		WHERE 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 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>

	<!--根据类目id查询类目属性(包含类目名称和属性名称) 查询总数 -->
	<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>

	<!-- 根据类目id查询该条记录时关键属性并且时type类型是input的值的信息 -->
	<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" ?>
<!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_USER
    where 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_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中写法,如代码片段:

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)

时间: 2024-10-12 19:44:01

MyBatis_ibatis和mybatis的区别【转】的相关文章

对比JPA 和Hibernate 和 Mybatis的区别

1.JPA.Hibernate.Mybatis简单了解 1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现. 2.Hibernate:目前最流行的ORM框架,设计灵巧,文档丰富(完全自动操作),只是性能不好控制(自己去控制性能,不是很好控制). Hibernate是一个完整的ORM框架,常规CRUD我们不需要写一句SQL; 3.MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps和Dao,允许开发人员直接编写SQL(更好灵活).

一起了解Hibernate与Mybatis的区别优缺点对比

hibernate与mybatis的区别优缺点对比 前言: 我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好Hi

JPA、SpringData JPA 、Hibernate和Mybatis 的区别和联系

转自<JPA.SpringData JPA .Hibernate和Mybatis 的区别和联系> 一.JPA 概述 1. Java Persistence API(Java 持久层 API):用于对象持久化的 API 2. 作用:使得应用程序以统一的方式访问持久层 3. 前言中提到了 Hibernate,那么JPA 与 Hibernate究竟是什么关系呢: 1)JPA 是 Hibernate 的一个抽象,就像 JDBC 和 JDBC 驱动的关系 2)JPA 是一种 ORM 规范,是 Hiber

hibernate与mybatis的区别和应用场景

mybatis 与 hibernate 的区别和应用场景(转) 1    Hibernate : 标准的ORM(对象关系映射) 框架: 不要用写sql, sql 自动语句生成: 使用Hibernate 对sql 进行优化,修改比较困难 应用场景: 试用需求,变化固定中小型项目:ERP,ORM,OA 2   mybatis: 程序员自己编写sql, sql 修改,优化比较自由. mybatis 是一个不完全的ORM 框架(部分), mybatis 存在 映射关系(输入,输出映射): 应用场景: 除

mybatis#和$区别

mybatis中的#和$的区别 #相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.如:order by $user_id$,如果传入的值是111,那么解析成sql时的

SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别

SSH 和 SSM 的定义 本人经历过两种技术架构,分别是常说的 SSH 和 SSM ,SSH 在本科的时候老师就教过.SSM 则是去公司后用的比较多.现在我想将这两大阵营的技术做一下对比.由于本人能力有限,涉及技术较多,我只从具体的应用方面做一些对比. SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,MyBatis 负责持久化层. 共同之处是都使

ibatis和mybatis的区别

区别1:全局配置文件(sqlMapConfig.xml)的差异 主要是元素标签命名的差异,比如mybatis的根元素标签为<configuration>,ibatis的 根元素标签为<sqlMapConfig>. 区别2:sql映射文件的差异 比如存储过程调用的差异,ibatis用<procedure>,mybatis没有 <procedure>标签,貌似用<select>.<update>.<insert>标签都可以.

面试问hibernate和mybatis的区别和对mybatis的认识

一.对mybatis的认识 从背景上说:是一个支持普通SQL查询,存储过程和高级映射的持久层框架:是对jdbc的半封装,和hibernate一样是一个持久层框架 从特点上说:简单易学:没有依赖.灵活操做数据库:减少耦合提供dao层.提供映射 动态SQL 最强大的特性之一:可以让开发者掌控SQL功能:还可以集成 单独使用有许多的限制: (无法跨多个session事务)和一些框架一起使用 例如(ssm)把mybatis 配置成事务 aop 通过反射 从框架的架构上说:1:加载配置(配置文件和Java

Hibernate与Mybatis的区别

相同点Hibernate和Mybatis都是当前非常流行的ORM框架,实现Java对象和SQL的映射转换. Hibernate优势DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射.数据库移植性好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL.支持更好的二级缓存机制,可以使用第三方缓存.MyBatis本身提供的缓存机制不佳. Mybatis优势可以进行更为细致的SQL优化,减少查询字段.容易掌握,而Hibernate门槛较高.