在sqlMap里面,iBatis的传入参数是parameterClass,而MyBatis是可以不写的,也可以用parameterType,iBatis的传出参数是resultClass。
iBatis:
<select id="selectDeviceByWhere" parameterClass="Map" resultClass="BaseResultMap">
</select>MyBatis:
<select id="selectDeviceByWhere" parameterType="Map" resultMap="BaseResultMap">
</select>
条件判断语句对于MyBatis很简单,标签里面写判断条件即可。但是IBatis就麻烦了许多,它将每个方法都进行了封装。
例如:
isNull:判断property字段是否是null
<isNull prepend="and" property="id"></isNull>isEqual相当于equals,判断状态值。
<isEqual property="state" compareValue="0"></isEqual>或
<isEqual property="state" compareProperty="nextState"> </isEqual>isEmpty判断参数是否为Null或者空,满足其中一个条件则其true。
isNotEmpty相反,当参数既不为Null也不为空时其为true。 Ibatis:
<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR"> username=#userNameList[]#
</iterate>Mybaits:
<foreach item="item" collection="list" separator="," open="(" close=")" index="">#{item.id}
</foreach>
#{}和${}
select * from user where name = #{name};
select * from user where name = ${name};//解析后结果为:
select * from user where name = 'zhangsan';//#{}和${}在预编译中的处理是不一样的,#{}在预处理时会把参数部分用一个占位符?代替,变成:
select * from user where name = ?;
//${}则只是简单的字符串替换,在动态解析阶段sql语句会被解析成:
select * from user where name = 'zhangsan';//#{}的参数替换是发生在DBMS中,而${}发生在动态解析过程中,${}会导致sql注入的问题。
MyBatis和Hibernate
灵活性
MyBatis操作灵活,使用起来比较方便。hibernate是全自动,而mybatis是半自动。hibernate可以通过对象关系模型实现对数据库的操作,通过实体对象与数据库的表进行映射来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理
可移植性
Hibernate数据库移植性远大于Mybatis。hibernate通过它强大的映射结构和hql语言,大大降低了对象与不同数据库(oracle、MySQL等)的耦合性,而mybatis由于需要手写sql,因此sql中很容易包含一些不同的数据库不兼容的函数或者语法,移植性也会随之降低很多,成本很高.
优化上
在sql优化上,mybatis要比hibernate方便一些,由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,像报表等需求时,hql满足不了需求;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。
二级缓存
hibernate拥有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存。