从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于 JDK 的泛型和注解特性进行了简化。iBatis 确实该退休了,因为一个更为出色的继任者经过 10 个 Beta 版本的蜕变已然出现在我们的面前。
随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis
1、Mybatis实现了接口绑定,使用更加方便。
在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件,而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。这可以说是Mybatis最重要的改进。注意:虽然Mybatis支持在接口中直接使用annotation的配置方式来简化配置,不过强烈建议仍然使用xml配置的方式。毕竟annotation的配置方式功能有限且代码入侵性太强。使用xml配置方式才能体现出Mybatis的优势所在
2、对象关系映射的改进,效率更高 Mybatis与Ibatis的区别
在使用ibatis2.x时并没有通过ibatis的xml映射文件来实现对象间的关系映射。其实也确实没有必要那么做,因为ibatis2.x采用的是“嵌套查询”的方式将对象之间的关系通过查询语句的直接拼装来实现,其效果和在DAO或Service中自行封装是一样的。而在Mybatis中,除了兼容ibatis2.x中的“嵌套查询”方式外,还提供了直接“嵌套结果”的方式,其效果相当于直接通过一句sql将查询出的dto对象自动封装成所需的对象。这一方式在使用分页的时候并不起作用,或者说嵌套对象的结果集是不允许进行分页的。
3、iBatis / MyBatis 3提供了一个新的功能:注解。MyBatis采用功能强大的基于OGNL的表达式来消除其他元素
1、 全局配置文件命名
iBatis 通常把为 sqlMapConfig.xml,文件名本身并没有要求,在 MyBatis 中经常会将该文件命名为 Configuration.xml
2、全局配置文件:
1)两者的映射文件 DTD 约束不相同
2)设置属性的区别 settings
3)配置事务管理器和数据源的区别:Mybatis增加属性:environments,通过 <environments> 来进行数据源管理,主要是为了简化在多套数据源配置之间的切换,比如开发和发布使用不同的配置。
3、在映射文件中配置 SQL 语句:
1)在 iBatis 中,namespace 不是必需的,且它的存在没有实际的意义。在 MyBatis 中,namespace 终于派上用场了,它使得映射文件与接口绑定变得非常自然 ---<mapper namespace=”mybatis.demo.UserInfoMapper”>
2)指定映射文件的方式的区别
1、iBatis:<sqlMap resource=… /> <sqlMap resource=… /> <sqlMap resource=… />
MyBatis :<mappers> <mapper resource=… /> <mapper resource=… /> </mappers>
2、iBatis: <select id="selectDeviceByWhere" parameterClass="Map" resultClass="BaseResultMap"> </select>
MyBatis:<select id="selectDeviceByWhere" parameterType="Map" resultType="BaseResultMap"> </select>
3、 IBatis是使用# #和$ $来接受参数的。使用方法等同于MyBatis;# #=#{ },$ $=${ }. mybatis/ibatis ${}与#{}的区别
4、判断语句
MyBatis很简单,只要在where 或者if 的标签里面添加test=""就可以了,里面写判断条件了
IBatis的就麻烦了许多了,它将每个都方法都进行了封装:
isNull:判断property字段是否是null
<isNull prepend="and" property="id"> </isNull> -----prepend就是代表着添加在动态语句前面。 property就是被比较的属性。
isEqual相当于equals,判断状态值。
<isEqual property="state" compareValue="0"> </isEqual> 或 <isEqual property="state" compareProperty="nextState"> </isEqual>
isEmpty判断参数是否为Null或者空,满足其中一个条件则其true。 isNotEmpty相反,当参数既不为Null也不为空是其为true。
5、循环
Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容。
Iterate 的属性:
prepend ----可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property ----类型为 java.util.List 的用于遍历的元素(必选)
open----整个遍历内容体开始的字符串,用于定义括号(可选)
close----整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction ----每次遍历内容之间的字符串,用于定义 AND 或 OR(可选)
<iterate> 遍历类型为 java.util.List的元素。
例子:
<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR">
username=#userNameList[]#
<iterate>
MyBatis使用的是ForEach方法。他可以遍历List,[](array),Map三种元素。
foreach属性:
item ----循环体中的具体对象(必选)
collection---- 要做foreach的对象(必选)
open ---整个遍历内容体开始的字符串,用于定义括号(可选)
close ----整个遍历内容体结束的字符串,用于定义括号(可选)
separator----元素之间的分隔符(可选)
index----在list和数组中,index是元素的序号,在map中,index是元素的key(可选)
例子:
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id}
</foreach>
6、dynamic:去除它的代码块中的第一个prepend里面的字符。然后他也有自己的prepend标签,作用也是在语句前面添加修饰符,比如where。而在MyBatis里是<where></where>.