首页 > 其他分享 >iBatis与MyBatis区别

iBatis与MyBatis区别

时间:2023-05-05 23:32:01浏览次数:39  
标签:--- 配置文件 映射 区别 iBatis SQL MyBatis


 

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 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本

 

 

 

 

 

 

 

 

 

 

标签:---,配置文件,映射,区别,iBatis,SQL,MyBatis
From: https://blog.51cto.com/iwtxokhtd/6248082

相关文章

  • Android开发--事件绑定及startActivity、startActivityForResult区别
      一、绑定事件的方法:1、方法一:UI组件事件属性调用main.xml:<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="forWard"an......
  • jar包和war包的区别
    一、概念 jar包:JAR包是类的归档文件,JAR文件格式以流行的ZIP文件格式为基础。与ZIP文件不同的是,JAR文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和JVM这样的工具直接使用。war包:war包是JavaWeb程序打的包,war包里面包括写的代码编译成......
  • 全局事务与本地事务的区别应用
    全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。 本地事务:在单个EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。 在Hibernate配置文件中有这么两......
  • 自定义mybatis插件之全局数据过滤
    目录一、介绍二、实现三、效果四、源码一、介绍通过开发mybatis的插件来实现对全局的sql查询语句进行拦截,并新增全局的过滤条件做到无感知的数据过滤,比如全局过滤某个租户的数据。二、实现实现思路1、通过mybatis的拦截器拦截所有查询的sql2、使用Druid里面的工具类解析sq......
  • MyBatis 配置详解
    目录mybatis-config.xml核心配置文件1.environments元素1.1子元素environment1.2transactionManager事务管理器(共两种)2.mappers元素(定义映射SQL语句文件)3.properties4.typeAliases(定义别名)其他配置【设置】mybatis-config.xml核心配置文件mybatis-config.xml包含的......
  • 缓存----Ibatis /Hibernate
    iBatis缓存的使用方法及解释:以iBatis2.3为例,做以下配置即可实现对某些查询进行缓存1、<settingslazyLoadingEnabled="false" cacheModelsEnabled="true" enhancementEnabled="true"/>   注释:       lazyLoadingEnabled延迟加载数据;cacheModelsEna......
  • count(列名)、count(1)和 count(*)有什么区别?
    在MySQL中,这几个都是统计操作,很多人在使用的时候,都使用的是count(1),这有没有问题?使用正确?达到了统计效果?我们从效果和效率两方面来分析下执行效果count(*)包括了所有的列,在统计时不会忽略列值为null的数据count(1)用1表示代码行,在统计时不会忽略列值为null的数据co......
  • Spring整合Mybatis
    1、Spring整合Mybatis思路分析1.1、环境准备在准备环境的过程中,我们也来回顾下Mybatis开发的相关内容:步骤1:准备数据库表Mybatis是来操作数据库表,所以先创建一个数据库及表createdatabasespring_dbcharactersetutf8;usespring_db;createtabletbl_account(id......
  • img标签的title和alt区别?png、jpg、gif这些图片格式区别?
    img标签的title和alt区别title是鼠标移入图片的时候显示的内容;alt是图片无法加载时显示的内容在SEO层面上,蜘蛛抓取不到图片的内容,所以在写img标签时为了增加SEO效果就要设置alt属性,来描述这张图是什么内容或者关键词png、jpg、gif图片格式区别png:无损压缩,尺寸体积要比......
  • title与h1区别?b与strong的区别?i 与em区别?
    title与h1的区别定义:title:概括了网站信息,可以告诉搜索引擎或者用户关于这个网站的内容主题是什么h1:文章主题内容,告诉蜘蛛我们的网站内容最主要的是什么区别:1.title是显示在网页标题上,而h1是显示在网页内容上2.站在SEO角度上看,title是页面权重最高的,其......