设为首页 收藏本站
查看: 1172|回复: 0

[经验分享] iBatis与MyBatis区别

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-11-24 10:14:50 | 显示全部楼层 |阅读模式
  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 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304861-1-1.html 上篇帖子: MyBatis 3 常用Sql配置 下篇帖子: mybatis与hibernate区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表