`
robin35java
  • 浏览: 20461 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ibatis给我们带来了什么

阅读更多
http://www.35java.com/zhibo/forum.php?mod=viewthread&tid=367&extra=page%3D3
自从unclepeng commons 2.0发布以后,笔者一直在寻找合适的ORM框架,以期加以改造作为unclepeng ORM的起源。很久之前曾经深使用过ibatis,后来由于一直都在维护人家的代码故没有深入下去,趁这几天重新研究了下,却发现当时自己觉得很适用的东西,今日已成鸡肋。
笔者曾经使用过spring的JdbcTemplate,后来经过重新实现,直接作为unclepeng commons 2.0的一部分,本文即通过JdbcTemplate与ibatis之间的对比,阐述笔者放弃ibatis的原因。
1、有人说ibatis把sql语句放在配置文件里方便管理。这个我不敢苟同,对我来说,文件越多,头越晕,所以这个“优点”不算是优点。
2、代码量的对比,比如查询所有的用户,用ibatis实现如下
public class User {
private int id;
private String name;
private String pwd;

public int getId() {
  return id;
}
public void setId(int id) {
  this.id = id;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public String getPwd() {
  return pwd;
}
public void setPwd(String pwd) {
  this.pwd = pwd;
}
}
 
  public static List selectAllAccounts () throws SQLException {
      return sqlMapper.queryForList("selectAll");
  }
     对应的xml如下
     esultMap id="users" class="User">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="pwd" column="pwd"/>
    </resultMap>
    <!-- Select with no parameters using the result map for Account class. -->
    <select id="selectAll" resultMap="users">
    select * from account
    </select>
    说白了其实是两部分,一部分是sql参数的填充生成statement,另一部分是将查询结果与Object之间的mapping。
    用JdbcTemplate
    String sql = "select * from account";
    return template.queryForRowSetList(sql);
    当然这里将所有的查询结果都mapping到RowSet这个类里了,如果要mapping到指定的类,需要这样:
   public interface RowMapper{
Object mapRow(ResultSet rs, int rowNum) throws SQLException;
   }
  其中User类需要实现RowMapper接口,并指定rs到User字段之间的映射,而这与
  <resultMap id="users" class="User">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="pwd" column="pwd"/>
    </resultMap>
  所做的事情是一样的。
  所以!从编码量上来看,ibatis与JdcbTemplate 相比不具备优势。
3、性能上的对比,笔者经过测试,忽略cashe,纯粹的数据库操作下,JdbcTemplate的性能比ibatis快一倍。
4、ibatis具备cache,更强大?笔者认为作为纯粹的数据库持久操作,cache不应混杂其中.另外,这种使用方式很难适应类似换分布式缓存memcache的需求。正解的做法是把数据库操作跟cache独立分开,cache对数据或对象提供接口,这样切换缓存方案时能够更加平滑。
5、上文中的User类存在的意义仅仅是为了将数据库查询中来的数据mapping其中,为了查询一百多个表,你可能不得不写一百个类似的类,而且对于像数据库添加几个字段的需求响应过慢。倒还不如直接用HashMap来封装字段名与字段值来得干脆,这样还具备了动态的功能。
    其实笔者还嫌HashMap过于”重量“,直接用两个数组的映射做为RowSet的实现,试想一个表字段总不可能超过1000个,而这种直接用字段名与字段值数组之间建之映射的办法在经过测试之后确实也颇为高效。所以用ibatis灵活性可扩展性都不如JdbcTemplate。
6、对于历史性代码,很多都把数据源或者数据库连接字符串直接写入properties中,又或者历史代码都是对Connection进行操作,又或者历史代码都是更为丑陋的JDBC实现,用JdbcTemplate能够无缝地修改这些代码,对ibatis来说,那是不敢想象的,什么都要实现两套的话,倒不如一套来得好。
既然ibatis不适合笔者,那什么时候适合用ibatis呢?适用于什么人呢?作为半成品的OR/Mapping框架,ibatis把sql抽取出来作为配置,另外还抽取出了Object 与数据库数据之间的mapping配置,让程序员从两个泥沼之中解脱了出来:一、冗长而风格各异的的jdbc查询代码, 二、重复的ResultSet到Object的mapping代码。
相比传统的JDBC确实是一大改进,同时也有利于统一项目组统一持久层的编码风格。如果你对Hibernate等更强大的ORM没有足够的把控能力,又不想写冗长的JDBC,而且你还没有时间实现自己的JdbcTemplate(spring提供的那个还不够好用,需要改造),那么使用ibatis是不二之选。
}

分享到:
评论

相关推荐

    ibatis教程,ibatis帮助文档

    它不仅是最简单的持久化框架,还带来了架构级的性能提升。SQL语句与程序代码分离,提高了代码的可重用性和团队分工的明确性,同时增强了项目的移植性。 三、iBATIS与Hibernate的对比 1. 映射关系:Hibernate提供了...

    IBatis .NET框架实例

    IBatis(现在称为MyBatis)是一个轻量级的持久层框架,它允许开发者将SQL语句直接嵌入到应用程序代码中,从而避免了传统的ADO.NET模式带来的复杂性。通过使用XML或注解来配置和映射SQL,IBatis使得数据访问更加灵活...

    ibatis乱码解决方法(ibatis独立)

    然而,数据处理时遇到的编码问题,如乱码,常常会给开发者带来困扰。本文将详细讨论如何解决Ibatis中的乱码问题,特别是涉及到GBK和ISO_8859_1编码格式时的解决方案。 首先,我们需要了解乱码产生的原因。乱码通常...

    Ibatis驱动

    Ibatis 是一个轻量级的Java持久层框架,它提供了SQL映射功能,将数据库操作与业务逻辑分离,使得开发者可以更加灵活地控制SQL语句,避免了过度封装和ORM框架带来的性能损失。Ibatis驱动是这个框架的核心组成部分,...

    ibatis_with_memcached

    Ibatis是一个基于Java的SQL映射框架,它允许开发者编写SQL语句并与Java对象进行绑定,从而避免了传统的JDBC代码带来的繁琐。Ibatis提供了一种灵活的方式来控制SQL的执行,同时保持了SQL与业务逻辑的分离,使得数据库...

    IBatis.NET开发文档

    通过深入学习这些文档,开发者可以熟练掌握iBATIS.NET,实现高效、灵活的数据访问,同时减少因为SQL语句硬编码在代码中而带来的维护难题。iBATIS的易用性和强大的功能使其成为.NET平台上的流行选择,对于任何处理...

    spring ibatis整合所需jar包

    在Java Web开发中,Spring和iBatis是两个非常重要的框架...这种整合方式允许开发者充分利用Spring的高级特性,如AOP事务管理,同时享受iBatis带来的灵活SQL操作。在实际项目中,这可以大大提高开发效率,降低维护成本。

    iBATIS内置别名列表

    通过对iBATIS内置别名列表的学习,我们不仅能够更好地理解iBATIS的工作原理,还能在实际项目中更加高效地使用该框架。此外,掌握这些内置别名也有助于提高配置文件的可读性和可维护性,减少因错误配置导致的问题。...

    从iBatis迁移到MyBatis

    虽然初期可能需要投入一些时间和精力,但MyBatis的诸多增强特性和更好的集成能力,通常会带来长期的开发效率提升和项目维护的便利。通过深入学习官方文档,开发者可以更好地理解和利用MyBatis的功能,顺利完成迁移...

    ibatis.Net

    Ibatis.Net是一个流行的开源持久层框架,主要用于简化.NET应用程序中的数据访问层(DAL)开发。...通过深入学习和使用Ibatis.Net,你可以更好地理解和掌握数据库驱动的应用程序设计,为你的项目带来诸多便利。

    ibatis-2.3.4.zip

    Ibatis 2.3.4是该框架的一个特定版本,这里我们将详细探讨其主要特性和使用方法。 一、Ibatis框架概述 Ibatis的核心理念是“SQL就是SQL”,它并不像Hibernate那样尝试完全对象化数据库,而是将数据访问逻辑保留在...

    ibatis 使用手册

    本手册旨在帮助开发者更好地理解和应用iBatis,提高开发效率,减少因为SQL操作带来的复杂性。 **iBatis核心概念** 1. **配置文件**: iBatis的配置文件定义了数据库连接信息、SqlMap的位置等,是系统运行的基础。 ...

    ibatis插件

    Ibatis,原名SqlMap,是由Clinton Begin创建的一款开源的Java数据库持久层框架。它提供了一个SQL映射框架,能够...在选择和使用Ibatis插件时,一定要根据项目需求和插件特性进行匹配,确保插件能为项目带来实际的价值。

    解决IBatis缓存动态字段问题

    通过在 `&lt;select&gt;` 标签中设置 `remapResults="true"`,可以有效地解决IBatis缓存动态字段带来的问题。这不仅避免了因缓存错误而导致的查询失败,还确保了程序能够灵活地处理动态表名和字段名。同时,需要注意的是,...

    ibatis配置文件模板

    在Ibatis中,SQL是手写的,这使得开发者能够完全控制SQL的编写,避免了传统的对象关系映射工具所带来的性能损失。下面我们将详细探讨Ibatis配置文件模板中的关键组成部分,包括`SqlMap.properties`、`SqlMapConfig....

    iBatis入门(三)

    在本篇中,我们将深入探讨iBatis,这是一个流行的开源持久层框架,它允许开发者将SQL语句与Java代码分离,提供更灵活的数据库操作方式。iBatis的核心是SQL Maps,这些映射文件包含了SQL语句以及它们与Java对象之间的...

    ibatis的jar包

    这种设计使得SQL的编写和维护更为便捷,同时避免了硬编码SQL带来的问题。Ibatis 支持多种数据库,包括MySQL、Oracle、SQL Server等,具有良好的数据库兼容性。 2. **Ibatis 架构** Ibatis 主要由...

    iBatis实战and源代码.zip

    《iBatis实战and源代码.zip》这个压缩包包含了关于iBatis框架的实战经验和源代码,对于深入...通过深入学习,我们不仅可以提高数据库操作的效率,还能提升项目的可维护性和扩展性,为我们的开发工作带来极大的便利。

    ibatis笔记

    总的来说,iBATIS 提供了一种灵活的、基于SQL的持久层解决方案,适合那些需要精细控制数据库操作并希望避免传统ORM框架带来的性能损失的项目。通过清晰的配置和映射文件,开发者可以轻松地将Java对象与数据库交互,...

    iBATIS 2.0 开发指南

    ### iBATIS 2.0 开发指南 #### 概述 iBATIS 2.0 开发指南是一份详尽的技术文档,旨在为开发者提供...对于那些希望在保留 SQL 控制权的同时又不想完全放弃 ORM 带来的便利性的开发者来说,iBATIS 是一个理想的选择。

Global site tag (gtag.js) - Google Analytics