(经典)从Ibatis过渡到Mybatis-比较Mybaits较与Ibatis有哪些方面的改进

(经典)从Ibatis过度到Mybatis---比较Mybaits较与Ibatis有哪些方面的改进

随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis。那么mybatis较于ibatis做了哪些方面的突破呢?这里我总结些:(不一定完整,是本人整理总结的)

1.全局文件的配置:

MyBatis 全局配置文件的各主要元素基本和 iBatis 相同,只是在用法和个别名称上做了调整。元素的意义就不再描述,下面主要讲述针对 iBatis 和 MyBatis 配置文件的主要区别之处。

1.1,两个版本的 DTD 约束不同,MyBatis 的 DTD 文件已经包含在发布包下的 mybatis-3.0.x.jar 包中。这直接影响到的是,iBatis 配置文件的根元素是 <sqlMapConfig>,而 MyBatis 使用的是 <configuration>。

   <?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现在已经没有SqlMapClient了,使用的则是SqlSession.在原来的基础上加了像selectMap,selectList,selectOne这样的方法,使用更方便了。)

1.2,之前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>

1.3,在 iBatis 中指定映射文件的方式如下:

   <sqlMap resource=... /><sqlMap resource=... /><sqlMap resource=... />

在  MyBatis  中指定映射文件的方式:

    <mappers><mapper resource=... /><mapper resource=... /></mappers>

附:到目前为止,我们主要讨论了 XML 形式的全局配置,其实这也不是唯一选择,MyBatis 还提供了通过代码来进行配置的方式:

   DataSource ds = …… // 获取一个 DataSourceTransactionFactory 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 语句。

     // 映射 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();}

2.映射文件中配置  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用的parameterClass在mybatis中已经永不了了,mybatis里应该使用parameterType。另外resultMap里面也不能继续使用了改成了type。

同时数据类型的声明和ibatis有了很大的差别,ibatis可以像下面这样写

   insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK) values (#FCODE:VARCHAR2#,#FCHARGE:VARCHAR2#,#FTYPECONTENT:VARCHAR2#,#FID#,#FMARK:VARCHAR2#)

而在mybatis的话一般是这样弄的:

  insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK) values (#{FCODE,jdbcType=VARCHAR},#{FCHARGE,jdbcType=VARCHAR},#{FTYPECONTENT,jdbcType=VARCHAR},#{FID},#{FMARK,jdbcType=VARCHAR})

针对映射文件,首先是一系列的属性名称的改变,这些仅仅是名称的改变,用法和含义并没有发生变化:

· 和全局配置文件一样,由于 DTD 约束发生变化,根元素也由原来的 <sqlMap> 调整为 <mapper>。

· <select> 等元素的 parameterClass 属性改为了 parameterType 属性。

· <select> 等元素的 resultClasss 属性改为了 resultType 属性。

· <parameterMap> 等元素的 class 属性改为了 type 属性。

· <result> 元素的 columnIndex 属性被移除了。

· 嵌套参数由 #value# 改为了 #{value}。

· <parameter> 等元素的 jdbcType 属性取值中,原来的 "ORACLECURSOR" 取值改为了现在的 "CURSOR","NUMBER" 取值改为了 "NUMERIC"。

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

   try{UserInfo userinfo = (UserInfo) sqlSession.selectOne("mybatis.demo.UserInfoMapper.getUser", 2);System.out.println(userinfo);} finally{sqlSession.close();}

需要注意的是,SqlSession 的使用必需遵守上面的格式,即在 finally 块中将其关闭。以保证资源得到释放,防止出现内存泄露!以上就是一个简单而完整的 MyBatis 程序。其中涉及了全局配置文件,映射文件,构建 SqlSession 对象,执行数据访问操作等四个步骤。

4.iBatis/MyBatis 对存储过程的支持.

iBatis  中调用存储过程的方式(通过使用 <procedure> 元素进行存储过程的定义):

  <procedure id="getValues" parameterMap="getValuesPM">{ ? = call pkgExample.getValues(p_id => ?) }</procedure>

在 MyBatis 中,<proccedure> 元素已经被移除,通过 <select>、<insert> 和 <update> 进行定义:

  <select id="getValues" parameterMap="getValuesPM" statementType="CALLABLE">  { ? = call pkgExample.getValues(p_id => ?)}   </select>

如上所示,通过 statementType 属性将该语句标识为存储过程而非普通 SQL 语句。

总结:

通过前面的示例可以看出,MyBatis 在编码中的最大的改变就是将一个最常用的 API 由 SqlMapClient 改为SqlSessionFactory。另外,类型处理器接口也由原来的 TypeHandlerCallback 改为了 TypeHandler。最后 DataSourceFactory 也进行了调整,移动到 org.apache.ibatis.datasource 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本。

转载于:https://blog.51cto.com/gauyanm/1707498

从Ibatis过渡到Mybatis-比较Mybaits较与Ibatis有哪些方面的改进相关推荐

  1. ibatis转成Mybatis问题小结

    在数据层ibatis转换成mybatis的时候,遇到了点问题. 区别1: ibatis的结构是Service->ServiceImpl->Dao->DaoImpl->Domai ...

  2. ibatis升级到mybatis总结

    ibatis升级到mybatis,不是简单的升级包就OK了,为什么这么说呢?因为升级后,调用接口变了,配置文件的写法也变了,所以从某种程度来说, mybatis不是ibatis的升级版,只是一个家族出 ...

  3. ibatis 数据库获取不到 java_如何拦截ibatis中所有的执行sql,并记录进数据库

    通过spring aop去拦截SqlMapClientTemplate下的方法,即可进行对所有执行sql的拦截,并进行操作. package com.detain.system.aop; import ...

  4. Mybatis报错org.apache.ibatis.binding.BindingException: Type interface com.trf.dao.UserDao is not known

    报错log:org.apache.ibatis.binding.BindingException: Type interface com.trf.dao.UserDao is not known to ...

  5. 总结mybatis plus解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)方法

    总结解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)方法 问题背景:在做Spring ...

  6. Ibatis与Mybatis的区别—侧重于Ibatis

    目录 一.什么是Ibatis? 1.iBatis是一款轻量级的持久化框架 2.iBatis最大的特点是将SQL语句与Java代码分离 3.iBatis具有以下几个关键组成部分: 二.Ibatis与My ...

  7. 初学mybatis时出现 org.apache.ibatis.binding.BindingException报错

    错误分析:由于每一个Mapper.xml都需要在mybatis核心配置文件中注册 解决方法: ①检测mapper是否声明 在mybatis-config.xml配置文件中添加下面几行代码(注意路径一定 ...

  8. ibatis mysql分页查询语句_简单实现ibatis的物理分页

    一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧.逻辑分页虽然能很干净地独立于特定数据库,但效率在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则 ...

  9. iBatis详解以及和MyBatis区别

    文章目录 1 ibatis 1.1 ibatis基础 1.1.1 ibatis过渡为mybatis 1.2 区别 1.2.1 ibatis和mybatis区别 1.2.1.1 配置文件区别 1.2.1 ...

  10. .NET转JAVA曲折之路

    .NET转JAVA曲折之路 响应国家号召,让软件适应国产化系统,我们被迫走上了这条坎坷大路. 道路崎岖,但挺有意思,从拿来主义到主动思考,这是一个质的转变. 我们花了更多时间用来思考,而不是copy. ...

最新文章

  1. Netflix这公司居然没有运维,也没有CTO
  2. win10自带Ubuntu
  3. 噬血代码进不了游戏_玩家认可,二次元魂类游戏,《噬血代码》在三个方面做出了差异化...
  4. ADSL宽带为什么下载和上传速度差别如此之大?
  5. thymeleaf 中文_springboot 整合 thymeleaf(上手即用)
  6. c++学习笔记之继承和多态
  7. Animate.css
  8. 面试题 01.03. URL化
  9. leet415字符串相加
  10. 优漫动游平面设计的形式美
  11. 关于QQ登录出现非官方应用 错误码100044的解决办法
  12. 微服务--应对每秒上万并发下的参数优化实战(实战经验)
  13. 介绍个人计算机水平,计算机个性自我介绍范文
  14. MySQL数据库入门【最详细的入门教学】
  15. 算法设计例题分析 食物链
  16. python面试技术面都过了,薪资都谈好了20K*13结果还是被刷了,问HR原因竟是...
  17. mac 设置mysql登录快捷键_Mac ox mysql启动登录和环境变量配置
  18. 计算机毕业的人有很多不从事IT行业
  19. sql server,mysql,oracle的区别
  20. 【2017年圣诞特辑】普元数字化企业云平台技术文章合集

热门文章

  1. 常见前端开发的题目,可能对你有用
  2. SQL server int 转char类型
  3. C# Redis之ServiceStack
  4. Simple Data帮助类
  5. HTML与JSP页面的区别
  6. C#获取屏幕大小或任务栏大小
  7. 实现简单的web框架
  8. 《Cisco安全防火墙服务模块(FWSM)解决方案》——2.6 硬件架构
  9. 4.4 Hibernate高级功能
  10. 自动生成数据同步存储过程的存储过程