转载:http://www.tuicool.com/articles/auaAru

iBatis 框架的主要优势:

1、iBatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL 本身,而不需要花费精力去处理例如注册驱动,创建 Connection,以及确保关闭 Connection 这样繁杂的代码。

2、从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于 JDK 的泛型和注解特性进行了简化

常用的 Java EE 框架,应该都知道这些框架需要提供一个全局配置文件,用于指定程序正常运行所需的设置和参数信息。而针对常用的持久层框架而言(Hibernate、JPA、iBatis 等),则通常需要配置两类文件:

一类用于指定数据源、事务属性以及其他一些参数配置信息(通常是一个独立的文件,可以称之为全局配置文件);

另一类则用于指定数据库表和程序之间的映射信息(可能不止一个文件,我们称之为映射文件)。

MyBatis 也不例外,虽然其中的一部分可以通过注解的形式进行,但是这两部分内容本身仍是必不可少的

MyBatis 全局配置文件中可以配置的信息主要包括如下几个方面:

properties — 用于提供一系列的键值对组成的属性信息,该属性信息可以用于整个配置文件中。
    settings — 用于设置 MyBatis 的运行时方式,比如是否启用延迟加载等。
    typeAliases — 为 Java 类型指定别名,可以在 XML 文件中用别名取代 Java 类的全限定名。
    typeHandlers — 在 MyBatis 通过 PreparedStatement 为占位符设置值,或者从 ResultSet 取出值时,特定类型的类型处理器会被执行。
    objectFactory — MyBatis 通过 ObjectFactory 来创建结果对象。可以通过继承 DefaultObjectFactory 来实现自己的 ObjectFactory 类。
    plugins — 用于配置一系列拦截器,用于拦截映射 SQL 语句的执行。可以通过实现 Interceptor 接口来实现自己的拦截器。
    environments — 用于配置数据源信息,包括连接池、事务属性等。
    mappers — 程序中所有用到的 SQL 映射文件都在这里列出,这些映射 SQL 都被 MyBatis 管理。

上面提及的大多数元素都不是必需的,通常 MyBatis 会为没有显式设置的元素提供缺省值。

iBatis 2.x 和 MyBatis 3.0.x 的区别

1、 全局配置文件命名

iBatis 通常把为 sqlMapConfig.xml,文件名本身并没有要求,在 MyBatis 中经常会将该文件命名为 Configuration.xml

2、 全局配置文件

<?xml version=”1.0″ encoding=”UTF-8″ ?> iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 约束,在将应用由 iBatis 升级至 MyBatis 时需要注意(两者的映射文件 DTD 约束也不相同)

<!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd”>

<configuration>

<!– 配置数据源相关的信息 –>

<environments default=”demo”>

<environment id=”demo”>

<transactionManager type=”JDBC”/>

<dataSource type=”POOLED”>

<property name=”driver” value= … />

<property name=”url” value= … />

<property name=”username” value=”root”/>

<property name=”password” value=”root”/>

</dataSource>

</environment>

</environments>

<!– 列出映射文件 –>

<mappers>

<mapper resource=”footmark/mybatis/demo/UserInfoMapper.xml”/>

</mappers>

</configuration>

有了这些信息,MyBatis 便能够和数据库建立连接,并应用给定的连接池信息和事务属性。

MyBatis 封装了这些操作,最终暴露一个 SqlSessionFactory 实例供开发者使用,从名字可以看出来,

这是一个创建 SqlSession 的工厂类,通过 SqlSession 实例,开发者能够直接进行业务逻辑的操作,

而不需要重复编写 JDBC 相关的样板代码。根据全局配置文件生成 SqlSession 的代码如下:

Reader reader = Resources.getResourceAsReader("Configuration.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();

上面的三行代码看做是 MyBatis 创建 SqlSession 的样板代码。

其中第一行代码在类路径上加载配置文件,Resources 是 MyBatis 提供的一个工具类,它用于简化资源文件的加载,它可以访问各种路径的文件,不过最常用的还是示例中这种基于类路径的表示方式

在完成全局配置文件,并通过 MyBatis 获得 SqlSession 对象之后,便可以执行数据访问操作了

— 设置属性的区别

iBatis :<settings props1=”value1″ props2=”value2″… />

MyBatis :<settings> <setting name=”props1″ value=”value1″/> <setting name=”props2″ value=”value2″/> …… </settings>

—配置事务管理器和数据源的区别

iBatis :

<transactionManager type=”JDBC” >

<dataSource type=”SIMPLE”>

<property name=”JDBC.Driver” value=”${driver}”/>

</dataSource>

</transactionManager>

MyBatis :

<environments default=”demo”>

<environment id=”demo”>

<transactionManager type=”JDBC”/>

<dataSource type=”POOLED”>

<property name=”JDBC.Driver” value=”${driver}”/>

</dataSource>

</environment>

</environments>

通过 <environments> 来进行数据源管理,主要是为了简化在多套数据源配置之间的切换,比如开发和发布使用不同的配置。

3、 在映射文件中配置 SQL 语句

<?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=”mybatis.demo.UserInfoMapper”>

<select id=”selectUser” parameterType=”int” resultType=”mybatis.demo.UserInfo”>

select * from UserInfo where userid =#{userid}

</select>

</mapper>

在 iBatis 中,namespace 不是必需的,且它的存在没有实际的意义。在 MyBatis 中,namespace 终于派上用场了,它使得映射文件与接口绑定变得非常自然

—指定映射文件的方式的区别

iBatis:<sqlMap resource=… /> <sqlMap resource=… /> <sqlMap resource=… />

MyBatis :<mappers> <mapper resource=… /> <mapper resource=… /> </mappers>

4、 使用 SqlSession 执行映射文件中配置的 SQL 语句

try {

UserInfo userinfo = (UserInfo) sqlSession.selectOne (“mybatis.demo.UserInfoMapper.getUser”, 2);

System.out.println(userinfo);

} finally {

sqlSession.close();

}

需要注意的是,SqlSession 的使用必需遵守上面的格式,即在 finally 块中将其关闭。以保证资源得到释放,防止出现内存泄露!

5、 在 MyBatis 中使用代码进行配置

DataSource ds = …… // 获取一个 DataSource

TransactionFactory txFactory = new JdbcTransactionFactory();

Environment env = new Environment(“demo”, txFactory, ds);

Configuration cfg = new Configuration(env);

cfg.addMapper(UserInfoMapper.class);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfg);

结合前面的配置文件,很容易理解这段代码的意思,故不再赘述。不过,需要注意的是 Configuration 的 addMapper() 方法,该方法的参数通常是一个接口,可以在接口里面定义若干方法,在方法上使用注解来指定映射的 SQL 语句。一个典型的接口定义以及对应的数据访问方法如下:

6、 将映射的 SQL 语句与接口中的方法绑定

// 映射 SQL 绑定接口

public interface UserInfoMapper {

@Select(“select * from userinfo where userid = #{userid}”)

public UserInfo getUserInfo(int userid);

}

// 接口绑定对应的数据访问方法

try {

//UserInfo userinfo = (UserInfo) sqlSession.selectOne (“mybatis.demo.UserInfoMapper.selectUser”, 2);

UserInfoMapper userinfoMapper = sqlSession.getMapper(UserInfoMapper.class);

UserInfo userinfo = userinfoMapper.getUserInfo(1);

System.out.println(userinfo);

} finally {

sqlSession.close();

}

7、 MyBatis 映射文件的改变 (仅仅是名称的改变,用法和含义并没有发生变化)

和全局配置文件一样,由于 DTD 约束发生变化,根元素也由原来的 <sqlMap> 调整为 <mapper>。
    <select> 等元素的 parameterClass 属性改为了 parameterType 属性。
    <select> 等元素的 resultClasss 属性改为了 resultType 属性。
    <parameterMap> 等元素的 class 属性改为了 type 属性。
    <result> 元素的 columnIndex 属性被移除了。
    嵌套参数由 #value# 改为了 #{value}。
    <parameter> 等元素的 jdbcType 属性取值中,原来的 “ORACLECURSOR” 取值改为了现在的 “CURSOR”,”NUMBER” 取值改为了 “NUMERIC”。

iBatis/MyBatis 对存储过程的支持一直是值得称道的。之前通过使用 <procedure> 元素进行存储过程的定义,示例如下:

— 存储过程的区别

iBatis:

<procedure id=”getValues” parameterMap=”getValuesPM”>

{ ? = call pkgExample.getValues(p_id => ?) }

</procedure>

MyBatis :

<select id=”getValues” parameterMap=”getValuesPM” statementType=”CALLABLE”>

{ ? = call pkgExample.getValues(p_id => ?)}

</select>

通过 statementType 属性将该语句标识为存储过程而非普通 SQL 语句

8、代码层面的改变

MyBatis 在编码中的最大的改变就是将一个最常用的 API 由 SqlMapClient 改为了 SqlSessionFactory。

另外,类型处理器接口也由原来的 TypeHandlerCallback 改为了 TypeHandler。

最后 DataSourceFactory 也进行了调整,移动到 org.apache.ibatis.datasource 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本

Mybatis笔记三:iBatis与MyBatis区别的更多相关文章

  1. Mybatis笔记三:MyBatis的API文档

    mybatis文档:http://www.mybatis.org/mybatis-3/zh/getting-started.html mybatis-spring文档:http://www.mybat ...

  2. Mybatis笔记三:全局配置文件

    目录 配置文件 dtd提示 properties标签(不怎么用) typeAliases 自动把下划线换成驼峰命名 配置文件 看着这个配置文件,我们将对这个配置文件进行细致的讲解 <?xml v ...

  3. ibatis 到 MyBatis区别(zz)

    简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区别,以及从 iBatis 向 MyBatis 移植时需要注意的地方.通过对本文的学习,读者基本能够了解 MyBatis ...

  4. ibatis 到 MyBatis区别

    http://blog.csdn.net/techbirds_bao/article/details/9235309 简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区 ...

  5. IBatis 2.x 和 MyBatis 3.0.x 的区别(从 iBatis 到 MyBatis)

    从 iBatis 到 MyBatis,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 / 关系 ...

  6. iBatis 和MyBatis区别

    从  iBatis  到  MyBatis ,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 ...

  7. MyBatis学习笔记(三) 关联关系

    首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...

  8. 【SSM 3】Mybatis应用,和Hibernate的区别

    PS:每次写概念性的总结,都是各种复制,各种粘,然后各种理解各种猜.但是这一步的总结,决定了我能够再这条路上走的远近和是否开心.是否创造!so,开启Ctrl A+Ctrl C的模式吧. 接触到这个概念 ...

  9. Mybatis sql映射文件浅析 Mybatis简介(三)

    简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...

随机推荐

  1. STM32L431驱动带UC1698芯片调试记录

    1, 数据线连接方式,这次使用的是8080格式的接口,如下 2. 主要是信号和数据引脚 DATA0-DATA7  并口的数据 RST 复位信号 WR 写信号 RD 读信号 C/D 数据还是命令 CS片 ...

  2. 洛谷 P1941 飞扬的小鸟

    洛谷 P1941 飞扬的小鸟 原题链接 首先吐槽几句 noip都快到了,我还不刷起联赛大水题! 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节 ...

  3. js创建对象 object.create()用法

    Object.create()方法是ECMAScript 5中新增的方法,这个方法用于创建一个新对象.被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性. 语法: Object.crea ...

  4. 欢迎使用 Flask¶

    欢迎使用 Flask¶ 欢迎阅读 Flask 文档. 本文档分为几个部分.我推荐您先从 安装 开始,之后再浏览 快速入门 章节. 教程 比快速入门更详细地介绍了如何用 Flask 创建一个完整的 应用 ...

  5. The filename 未命名.ipa in the package contains an invalid character(s). The valid characters are: A-Z, a-z, 0-9, dash, period, underscore, but the name cannot start with a dash, period, or underscore

    The filename 未命名.ipa in the package contains an invalid character(s).  The valid characters are: A-Z ...

  6. 英特尔® 实感™ 摄像头 (F200) 应用如何实现最佳用户体验

    英特尔开发人员专区原文 由于视频不能直接嵌入, 请点击视频标题观看.谢谢. 英特尔® 实感™ 技术支持我们重新定义如何与计算设备交互,包括允许用户通过手势自然交互. 为了帮助大家了解使用英特尔® 实感 ...

  7. 在进行分布式框架搭建的过程中,出现问题advised by org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)?

    今天在进行宜立方商城,进行文件配置的时间,遇到如下的问题,问题是:advised by org.springframework.transaction.interceptor.TransactionI ...

  8. Linux内核学习笔记(1)-- 进程管理概述

    一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...

  9. PytorchZerotoAll学习笔记(四)--线性回归

    线性回归 # 导入 torch.torch.autograd的Variable模块import torch from torch.autograd import Variable # 生成需要回归需要 ...

  10. FPGA选型

    工欲善其事必先利其器,开发FPGA的第一步,当然是选择一片符合你设计需求的芯片. 但是芯片种类那么多,老板又要你越省越好,硬件工程师也天天问你到底该用哪块芯片,怎么办? 今天正好可以跟大家聊聊这些问题 ...