Ibatis 是 Mybatis 的前身,两者都是优秀的持久层框架。
区别:
1、mybatis 实现接口绑定,不需要具体接口实现类。但是需要在xml文件中 的 namespace 绑定具体的接口。
这个实现原理是JDK的动态代理,原理会在下一篇博客更新。
@Component public interface XXXDAO extends BaseDAO<XXXDO, Long> { }
<mapper namespace="com.xxx.dao.XXXDAO" > </mapper>
ibatis 需要定义具体接口的实现,并且在接口实现中获取SqlMapClient以及绑定xml文件。
<sqlMap namespace="namespace名称" > </sqlMap>
public class XXXDAOImpl extends SqlMapClientDaoSupport implements XXXDAO { @Override public Long insert(XXX xxx) throws DataAccessException { Object id = getSqlMapClientTemplate().insert("namespace名称.语句id", xxx); return (Long) id; }
2、XML文件不同
1)mybatis用的是<mappers> 标签,ibatis 是用 <sqlMap> 标签
2)mybatis 支持 ognl 表达式,ibatis不支持
3)mybatis 接收参数的方式 #{id} ${id}$ ,ibatis 是 #id# $id$
ps: #与$ 的区别是# 是作为参数传递,预编译使用
$ 是作为sql 一部分拼接,会有sql注入的风险
4)mybatis 参数类型是 parameterType,ibatis 参数类型是parameterClass
5)动态语句写法不同
mybatis
<update id="updateByPrimaryKeySelective" parameterType="xxxDO" > update xxx <set > <if test="activityWarmupSwitch != null" > activity_warmup_switch = #{activityWarmupSwitch,jdbcType=CHAR}, </if> </set> where id = #{id,jdbcType=BIGINT} </update>
ibatis
<update id="updateCommentById" parameterClass="xxxDO" > UPDATE xxx <dynamic prepend="SET" > <isNotNull property="fuId" prepend="," > <![CDATA[ fu_id = #fuId# ]]> </isNotNull> </dynamic> WHERE id = #id# </update>
6)mybatis 迭代用的是 foreach ,ibatis用的是iterator