mybatis和ibatis的比较

本文介绍了从ibatis到MyBatis的迁移过程,包括参数类型的变化、动态SQL标签更新、数据类型声明的不同、SqlMapClient到SqlSession的转换及新增的映射器功能等关键变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前些时候一直在用ibatis做项目觉得用起来还是很舒服的至少来说用起来灵活不想hibernate那么死还经常出一些搞得人恶心的问题而且开发包还很多,hibernate我觉得还垃圾一点不好用。心血来潮在网上看了一下其实自己早就out了,人家ibatis都到3点几了而且还改了名字叫做mybatis。这个版本和之前的ibatis已经出现了很多的差别。下面是我自己学习的时候总结的。

1.以前用的parameterClass在mybatis中已经永不了了,mybatis里应该使用parameterType。另外resultMap里面也不能继续使用了改成了type

2.dynamic标签不能使用了,下面的配置在mybatis里是错的

<sql id="sqlwhere">	
	<dynamic>
		<isGreaterThan prepend="and" property="FPARENTID" compareValue="-1">
			A.FPARENTID = #FPARENTID#
		</isGreaterThan>
		<isNotEmpty prepend="and" property="LOGINTOPIMAGE">
			A.LOGINTOPIMAGE like #LOGINTOPIMAGE#
		</isNotEmpty>
		<isGreaterThan prepend="and" property="FID" compareValue="-1">
			A.FID = #FID#
		</isGreaterThan>
		<isNotEmpty prepend="and" property="FNAME">
			A.FNAME like #FNAME#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGINMIDDLEIMAGE">
			A.LOGINMIDDLEIMAGE like #LOGINMIDDLEIMAGE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="VERSIONNUMBER">
			A.VERSIONNUMBER like #VERSIONNUMBER#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="MAJORTITLE">
			A.MAJORTITLE like #MAJORTITLE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGINTITLE">
			A.LOGINTITLE like #LOGINTITLE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="MAJORMIDDLEIMAGE">
			A.MAJORMIDDLEIMAGE like #MAJORMIDDLEIMAGE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGINBOTTOMIMAGE">
			A.LOGINBOTTOMIMAGE like #LOGINBOTTOMIMAGE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="MAJORTOPIMAGE">
			A.MAJORTOPIMAGE like #MAJORTOPIMAGE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGO">
			A.LOGO like #LOGO#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGO">
			A.ADDRESS like #ADDRESS#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGO">
			A.FAX like #FAX#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGO">
			A.PHONE like #PHONE#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGO">
			A.ZIP like #ZIP#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="LOGO">
			A.EMAIL like #EMAIL#
		</isNotEmpty>
		<isNotEmpty prepend="and" property="containIds">
			A.FID NOT IN ($containIds$)
		</isNotEmpty>
	</dynamic>
</sql>


3.数据类型的声明和ibatis有了很大的差别,ibatis可以像下面这样写

 insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK) 
 values (#FCODE:VARCHAR2#,#FCHARGE:VARCHAR2#,#FTYPECONTENT:VARCHAR2#,#FID#,#FMARK:VARCHAR2#)


在mybatis的话一般是这样弄的

insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK) 
     values (#{FCODE,jdbcType=VARCHAR},#{FCHARGE,jdbcType=VARCHAR},#{FTYPECONTENT,jdbcType=VARCHAR},#{FID},#{FMARK,jdbcType=VARCHAR})  


4.mybatis现在已经没有SqlMapClient了,使用的则是SqlSession.在原来的基础上加了像selectMap,selectList,selectOne这样的方法,使用更方便了

5.加了一个叫映射器的新东西,只需要写出接口而不需要实现类就能够操作数据如

import java.util.List;

import org.lxh.vo.HealthspecialytypeInfo;

public interface HealthMapper {
  public List<HealthspecialytypeInfo> getRecordByList(HealthspecialytypeInfo info);
}


在映射文件里要记得namespace写成接口的类全名,sql语句的id写成接口里的方法名就可以了

<select id="getRecordByList" parameterType="org.lxh.vo.HealthspecialytypeInfo" resultMap="resultMap"> 
		select * from M_HEALTHSPECIALYTYPE where FCODE in
		<foreach item="item" index="index" collection="list"
	      open="(" separator="," close=")">
	      #{item}
	    </foreach>
	</select>


调用的时候就像下面

HealthMapper m=ses.getMapper(HealthMapper.class);
List<HealthspecialytypeInfo> record=m.getRecordByList(h);


就这样就可以直接进行数据的操作了,的确智能了很多

5.需要注意的是spring3.0一下的版本并不支持mybatis,下面是官方文档的描述

从spring3之后mybatis已经可以和spring整合了,最值得高兴的是mybatis网站也提供了整合的用户指导,写的很具体直接就可以拿来用。还有一些特色的功能如直接批量插入数据,hibernate还是那死样子,在这里力挺mybatis。更多的东西大家去看开发文档,我就不多说了。吐舌头

 

我自己也写了个整合的小例子,大家去我的资源里下载就好了。

<think>嗯,用户这次问的是MyBatisiBatis的关系,看来ta对这两个框架的渊源很感兴趣。之前讨论MyBatisJDBC时用户就表现出对技术演进的关注,这次可能需要更清晰的历史脉络梳理。 用户提供的引用材料很有价值,特别是[^3]提到接口绑定这个关键改进,以及[^4]关于命名变化的深层含义。不过要注意避免直接复制引用内容,需要用更通俗的方式重组信息。 从技术沿革看,应该分三个层次回答:第一层是继承关系(直接改名),第二层是核心改进(接口绑定/注解支持等),第三层是生态变化(包名/文档等)。用户似乎特别关注"为什么改名后还保留相似性"这个问题,[^4]里关于降低学习成本的解释很到位。 需要强调几个易混淆点:1) 不是完全重写而是深度优化 2) MyBatis3保留大部分iBatis配置方式 3) 核心的SQL映射思想没变。用户可能担心迁移成本,可以暗示兼容性良好。 最后考虑设计对比表格,突出改进点而非简单罗列区别。那些"自动生成DAO实现"、"泛型支持"之类的特性应该用用户能感知的示例说明(比如不用再写DaoImpl类了)。 相关问题要延续用户的技术演进视角,比如"如何迁移旧项目"这种实用问题可能比纯技术对比更符合ta需求。</think>MyBatisiBatis 本质上是**同一框架的迭代关系**,MyBatisiBatis 的全面升级版本。以下是核心关系解析: --- ### 一、核心继承关系 1. **同源框架** MyBatisiBatis 3.x 版本**正式更名而来**(2010年),由原 iBatis 团队开发,保留了 iBatis 的核心设计思想[^1][^2]。 2. **包名与命名空间变更** | 内容 | iBatis | MyBatis | |--------------|------------------------|------------------------| | **包名** | `org.apache.ibatis.*` | `org.apache.ibatis.*` | | **核心接口** | `SqlMapClient` | `SqlSession` | | **配置文件** | `<sqlMapConfig>` | `<configuration>` | --- ### 二、MyBatis 的关键升级 1. **接口绑定(核心改进)[^3]** - **iBatis 2.x**:需手动实现DAO接口XML的关联 ```java // iBatis 需显式指定映射文件 public class UserDaoImpl implements UserDao { public User getUser(SqlMapClient sqlMap, int id) { return (User) sqlMap.queryForObject("User.getById", id); } } ``` - **MyBatis**:通过**动态代理**自动关联接口与XML ```java // MyBatis 接口直接绑定XML public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User getById(int id); } ``` 2. **注解支持** 支持`@Select`, `@Insert`等注解替代XML配置[^3],简化简单SQL场景: ```java @Update("UPDATE user SET name=#{name} WHERE id=#{id}") void updateUserName(User user); ``` 3. **动态SQL增强** 新增`<choose>`, `<bind>`等标签,支持更复杂的逻辑: ```xml <select id="search"> SELECT * FROM user <where> <if test="name != null"> AND name LIKE #{name} </if> <choose> <when test="role == 'admin'"> AND level > 5 </when> <otherwise> AND level > 1 </otherwise> </choose> </where> </select> ``` 4. **类型处理器优化** 通过`TypeHandler`接口增强泛型支持,简化类型转换[^4]: ```java public class StringListHandler implements TypeHandler<List<String>> { // 自动处理List<String>与数据库字段的映射 } ``` --- ### 三、保留的核心特性 1. **SQL与代码分离** 仍以XML映射文件为核心(如`UserMapper.xml`)[^4]。 2. **结果集映射机制** ```xml <resultMap id="userMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> </resultMap> ``` 3. **JDBC底层封装** 延续对JDBC的封装,优化连接管理、事务控制等。 --- ### 四、总结:演进关系 | 维度 | iBatis | MyBatis | |--------------|---------------------------------|----------------------------------------| | **定位** | SQL映射框架 | 增强的持久层框架 | | **核心改进** | 基础ORM功能 | 接口绑定/注解/动态SQL增强 | | **易用性** | 需手动实现DAO | 零实现类+自动代理[^3] | | **生态** | 已停止维护 (最后版本 2.3.5) | 持续更新 (2023年发布3.5.13) | > **结论**:MyBatisiBatis 的**现代化继承者**,在保留核心设计的同时,通过接口绑定、注解支持等特性显著提升开发效率,目前已成为主流Java持久层框架[^1][^3]。 --- ### 常见问题解答 **Q:iBatis项目能否直接升级到MyBatis?** A:可平滑迁移,但需注意: 1. 包名替换:`com.ibatis.*` → `org.apache.ibatis.*` 2. 配置文件:`<sqlMapConfig>` → `<configuration>` 3. API更新:`SqlMapClient` → `SqlSessionFactory`[^2] **Q:为何要重命名?** A:摆脱与"SQL映射"的强绑定,体现向**完整ORM框架**的演进[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值