转载: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. vue 与原生app的对接交互(混合开发)

    小伙伴们在用vue开发h5项目特别是移动端的项目,很多都是打包后挂载在原生APP上的,那就少不了与原生交互了,我最近就是在坐这个,踩了一些坑,拿出来给大家分享下. 0.通过url传输数据:(一般是在入 ...

  2. STM8在IAR中Printf的整形长度问题

    //ld是32位的 printf("up_intval:%ld\r\n",device_set.upload_tem); //d是16位的 printf("up_intv ...

  3. flume 安装过程记录

    1.安装jdk 2.下载安装包 : apache-flume-1.7.0-bin.tar.gz 安装包是在win下载的,需要拖动到ubuntu下的/home/hadoop (拖动不了需要先安装  lr ...

  4. Maven学习(十四)-----Maven 构建配置文件

    Maven 构建配置文件 什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文 ...

  5. Python小白学习之函数装饰器

    装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...

  6. CentOS安装输入法及kDE桌面

    参考教程:https://jingyan.baidu.com/article/154b46317fdfce28ca8f419e.html

  7. 高可用Kubernetes集群-8. 部署kube-scheduler

    十.部署kube-scheduler kube-scheduler是Kube-Master相关的3个服务之一,是有状态的服务,会修改集群的状态信息. 如果多个master节点上的相关服务同时生效,则会 ...

  8. JAVA学习笔记--数组初始化

    JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...

  9. 从零开始的Python学习Episode 8——深浅拷贝

    深浅拷贝 一.浅拷贝 列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存.当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数 ...

  10. php中注释有关内容

    //单行注释 /*多行注释*/ /** 文档注释 (注意 文档注释与前面的那个多行注释不同)文档注释可以和特定的程序元素相关联 例如 类 函数 常量 变量方法 问了将文档注释与元素相关联 只需要在元素 ...