【网学网提醒】:网学会员编辑为广大网友搜集整理了:IBatis学习总结绩等信息,祝愿广大网友取得需要的信息,参考学习。
nenty(网学)贡献
IBatis学习总结2007-04-0813:11一、介绍:相对于Hibernate和ApacheOJB等“一站式”ORM解决方案而言,IBatis是一种“半自动化”的ORM实现。这个框架将让你能够更好的在JAVA应用中设计和实现实体层。这个框架有两个主要的组成部分,一个是SQLMaps,另一个是DataAccessObjects。另外还包括一些可能很有用的工具。SQLMaps:SqlMaps是这个框架中最激动人心的部分,它是整个iBATISDatabaseLayer的核心价值所在。通过使用SqlMaps你可以显著的节约数据库操作的代码量。SQLMaps使用一个简单的XML文件来实现从javaBean到SQLstatements的映射。跟其他的框架或者对象映射工具相比,SQLMaps最大的优势是简单。它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的scheme(怎么翻complexscheme?),使用SQLMaps,你可以自由的使用SQL语句。DataAccessObjects(DAO)当我们开发灵活的JAVA应用时,有一个好主意就是通过一个通用API层把实体操作的细节封装起来。DataAccessObjects允许你通过一个简单接口的来操作数据,从而隐藏了实现的细节。使用DAO,你可以动态配置你的应用程序来访问不同的实体存储机制。如果你有一个复杂的应用需要用到几个不同的数据库,DAO可以让你建立一个一致的API,让系统的其他部分来调用。UtilitiesiBATISDatabaseLayer包含一系列的有用的工具,比如SimpleDataSource,JDBCDataSource2.0(也包括3.0)的一个轻量级实现。ScriptRunner也提供了从单元测试到自动发布的数据库准备工作。工作流程:SQLMaps提供一个简单的框架,通过XML描述来映射JAVABeans,MAPimplementations甚至原始类型的包装(String,Integer等)到JDBCPreparedStatement。想法很简单,基本的步骤如下:1)提供一个对象作为参数(eitheraJavaBean,Maporprimitivewrapper),Theparameterobjectwillbeusedsettinginputvaluesinanupdatestatement,orqueryvaluesinawhereclause(etc.).(感觉不译为好,你说呢?)2)执行这个映射的statement,这一步是魔术发生的地方。SQLMaps框架将建立一个PreparedStatement实例(instance),使用前面提供的对象的参数,执行statement,然后从ResultSet中建立一个返回对象。3)如果是Update,则返回有多少行修改了,如果是查询,则返回一个对象或者对象的集合。跟参数一样,返回对象也可以是一个JAVABEAN,MAP或者一个primitivetypewrapper。流程图如下:二、现在介绍使用IBatis的配置文件:SQLMap的配置文件。这个文件是SQLMap实现的根配置,这不是本总结所要具体描述的。
配置文件是XML文件,我们用它来配置属性,JDBCDataSources和SQLMaps。它给我们一个便利的地方可以集中配置不同的DataSource。这个框架支持iBATISSimpleDataSource,JakartaDBCP(Commons),以及其他任何可以通过JNDIcontext来访问的DataSource。我们在以后将详细讨论这个问题。现在我们用JakartaDBCP,结构很简单,上面这个例子,它的配置文件如下。
元素:这SQLMap中的
元素支持SQLMapXML配置文件。配置文件里的元素符合DataMap规则。如下图:
所应用的文件里的元素必须和
里的元素相对应。下面是SqlMapConfigExample.properties文件的内容。里面的元素和里的元素相对应。元素maxRequests:在同一时间内能执行SQL语句的次数
maxSession:在同一时间内能起作用的Session数maxTransaction:在同一时间内能执行的事务。statementCacheSize:缓冲区的大小三、现在介绍操作IBatis的方法:注意:本总结适合有使用开发IBatis基础的人员参考。由于本人的能力有限,不足之处请大家指出。1.statement支持元素及支持的属性:1.1IDID属性是必须的,它表示这个语句的名称,它在整个元素内唯一的。在代码通过ID来引用相关语句。1.2parameterMapparameterMap属性定义了一个有序的值列表,分别有序的对应了标准参数化的SQL语句中的?占位符。1.3parameterClass在没有指明parameterMap属性的情况下,你可以指定parameterClass属性方法来替代parameterMap属性。parameterClass属性的值可以使用类型的别名或者类型(类)全称1.4resultMapresultMap可以让你控制你如何让数据从查询结果(ResultMap)中提取出来存入java对象中。并且可以定义如何将字段映射到javabean的属性里。如下图:1.5resultClass在resultMap属性没有指定的情况下,可以采用resultClass方式,resultClass的属性值可采用类型别名或者类型(Class)全称的方式。指定的类将根据数据库的元数据自动的映射到查询结果的字段值中。2.ParameterMap元素属性2.1IDID属性是必须的,它提供了
对元素DataMap里的唯一表示符2.2ClassClass属性是可选的,Class属性必须是JavaBean或Map实列,Class属性虽是可选的,但推荐大家指定,Class属性可以用来验证传入的参数的合法性及优化查询3.查询语句3.1屏蔽特殊符3.2语句导入,可以是语句优化使用方法,上面的语句可以写成:4.自增长方法:,不管处于该语句的什么部位,都先执行此自增长方法。注意:Mysql和Oracle的方法不一样。5.方法:Insert方法使用parameterMap属性,字段名要和
方法里的元素一一对应6.属性:使
用resultClass方法,类Person里必须id,firstName,lastName,birthDate,werghtKilograms,heightMeters这些属性。7.使用xmlResultName:XML映射文件XML文件内容:8.使用
方法:用来设置元素的属性,其中nullValue表示缺省值上面的方法也可以写成这样:9.如果传入的参数只有一个,用#value#来替代传入的参数名。如果还传来的是字段名,则IBatis不支持10.判断传入的参数是否存在:isNotNull,判断传入的参数值是否大于设定的值:isGreaterThan
11.判断传入的参数是否为空:isEmpty和isNotEmply12.如果进行模糊查询,使用like方法//////////////////////////////////////////////////////////
Hibernate和iBatis比较
简介Hibernate是当前最流行的O/Rmapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了iBATIS是另外一种优秀的O/Rmapping框架,当前版本是2.0。目前属于apache的一个子项目了。相对Hibernate“O/R”而言,iBATIS是一种“SqlMapping”的ORM实现。Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/RMapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。程序员往往只需定义好了POJO到数据库表的映射关系,即可通过Hibernate提供的方法完成持久层操作。程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。而iBATIS的着力点,则在于POJO与SQL之间的映射关系。也就是说,iBATIS并不会为程序员在运行期自动生成SQL执行。具体的SQL需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。使用iBATIS提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate实现ORM而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL语句,而iBATIS则要求开发者编写具体的SQL语句。相对Hibernate而言,iBATIS以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。
二者的对比:二者的对比:1.iBATIS非常简单易学,Hibernate相对较复杂,门槛较高。2.二者都是比较优秀的开源产品3.当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合4.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种情况下iBATIS会有更好的可控性和表现。5.iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动
生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sqlmapping的地方一一修改。6.以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。7.Hibernate现在已经是主流O/RMapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS8.最关键的一句话是iBATIS的作者说的:
Ifyouarestartinganewprojectandyou'reinfullcontrolofyourobjectmodelanddatabasedesign,HibernateisagoodchoiceofO/Rtool.Ifyouareaccessingany3rdpartydatabases(e.g.vendorsupplied),oryou'reworkingwithalegacydatabase,orevenjustareallypoorlydesigneddatabase,thenanO/Rmappermightnotbecapableofhandlingthesituation.That'swereanSQLMappercomesinhandy结论:结论结论:Hibernate和iBATIS可以说是互相补充,共同发展的关系.具体你想用什么要看实际情况.如果看了上面的文字还是拿不定注意,那就Justtotryit.实践是检验真理的唯一标准.鞋合不合适,只有试了才知道。///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////相关文章:IBatis学习总结一、介绍:相对于Hibernate和ApacheOJB等“一站式”ORM解决方案而言,IBatis是一种“半自动化”的ORM实现。这个框架将让你能够更好的在JAVA应用中设计和实现实体层。这个框架有两个主要的组成部分,一个是SQLMaps,另一个是DataAccessObjects。另外还包括一些可能很有用的工具。SQLMaps:SqlMaps是这个框架中最激动人心的部分,它是整个iBATISDatabaseLayer的核心价值所在。通过使用SqlMaps你可以显著的节约数据库操作的代码量。SQLMaps使用一个简单的XML文件来实现从javaBean到SQLstatements的映射。跟其他的框架或者对象映射工具相比,SQLMaps最大的优势是简单。它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的scheme(怎么翻complexscheme?),使用SQLMaps,你可以自由的使用SQL语句。DataAccessObjects(DAO)当我们开发灵活的JAVA应用时,有一个好主意就是通过一个通用API层把实体操作的细节封装起来。DataAccessObjects允许你通过一个简单接口的来操作数据,从而隐藏了实现的细节。使用DAO,你可以动态配置你的应用程序来访问不同的实体存储机制。如果你有一个复杂的应用需要用到几个不同
的数据库,DAO可以让你建立一个一致的API,让系统的其他部分来调用。UtilitiesiBATISDatabaseLayer包含一系列的有用的工具,比如SimpleDataSource,JDBCDataSource2.0(也包括3.0)的一个轻量级实现。ScriptRunner也提供了从单元测试到自动发布的数据库准备工作。工作流程:SQLMaps提供一个简单的框架,通过XML描述来映射JAVABeans,MAPimplementations甚至原始类型的包装(String,Integer等)到JDBCPreparedStatement。想法很简单,基本的步骤如下:1)提供一个对象作为参数(eitheraJavaBean,Maporprimitivewrapper),Theparameterobjectwillbeusedsettinginputvaluesinanupdatestatement,orqueryvaluesinawhereclause(etc.).(感觉不译为好,你说呢?)2)执行这个映射的statement,这一步是魔术发生的地方。SQLMaps框架将建立一个PreparedStatement实例(instance),使用前面提供的对象的参数,执行statement,然后从ResultSet中建立一个返回对象。3)如果是Update,则返回有多少行修改了,如果是查询,则返回一个对象或者对象的集合。跟参数一样,返回对象也可以是一个JAVABEAN,MAP或者一个primitivetypewrapper。流程图如下:
二、现在介绍使用IBatis的配置文件:SQLMap的配置文件。这个文件是SQLMap实现的根配置,这不是本总结所要具体描述的。配置文件是XML文件,我们用它来配置属性,JDBCDataSources和SQLMaps。它给我们一个便利的地方可以集中配置不同的DataSource。这个框架支持iBATISSimpleDataSource,JakartaDBCP(Commons),以及其他任何可以通过JNDIcontext来访问的DataSource。我们在以后将详细讨论这个问题。现在我们用JakartaDBCP,结构很简单,上面这个例子,它的配置文件如下。
元素:这SQLMap中的
元素支持SQLMapXML配置文件。配置文件里的元素符合DataMap规则。如下图:
所应用的文件里的元素必须和里的元素相对应。下面是SqlMapConfigExample.properties文件的内容。里面的元素和里的元素相对应。元素maxRequests:在同一时间内能执行SQL语句的次数maxSession:在同一时间内能起作用的Session数maxTransaction:在同一时间内能执行的事务。statementCacheSize:缓冲区的大小三、现在介绍操作IBatis的方法:注意:本总结适合有使用开发IBatis基础的人员参考。由于本人的能力有限,不足之处请大家指出。1.statement支持元素及支持的属性:1.1IDID属性是必须的,它表示这个语句的名称,它在整个元素内唯一的。在代码通过ID来引用相关语句。1.2parameterMapparameterMap属性定义了一个有序的值列表,分别有序的对应了标准参数化的SQL语句中的?占位
符。1.3parameterClass在没有指明parameterMap属性的情况下,你可以指定parameterClass属性方法来替代parameterMap属性。parameterClass属性的值可以使用类型的别名或者类型(类)全称1.4resultMapresultMap可以让你控制你如何让数据从查询结果(ResultMap)中提取出来存入java对象中。并且可以定义如何将字段映射到javabean的属性里。如下图:1.5resultClass在resultMap属性没有指定的情况下,可以采用resultClass方式,resultClass的属性值可采用类型别名或者类型(Class)全称的方式。指定的类将根据数据库的元数据自动的映射到查询结果的字段值中。2.ParameterMap元素属性2.1IDID属性是必须的,它提供了
对元素DataMap里的唯一表示符2.2ClassClass属性是可选的,Class属性必须是JavaBean或Map实列,Class属性虽是可选的,但推荐大家指定,Class属性可以用来验证传入的参数的合法性及优化查询3.查询语句3.1屏蔽特殊符3.2语句导入,可以是语句优化使用方法,上面的语句可以写成:4.自增长方法:,不管处于该语句
的什么部位,都先执行此自增长方法。注意:Mysql和Oracle的方法不一样。5.方法:Insert方法使用parameterMap属性,字段名要和
方法里的元素一一对应6.属性:使用resultClass方法,类Person里必须id,firstName,lastName,birthDate,werghtKilograms,heightMeters这些属性。7.使用xmlResultName:XML映射文件XML文件内容:8.使用
方法:用来设置元素的属性,其中nullValue表示缺省值上面的方法也可以写成这样:9.如果传入的参数只有一个,用#value#来替代传入的参数名。如果还传来的是字段名,则IBatis不支持10.判断传入的参数是否存在:isNotNull,判断传入的参数值是否大于设定的值:isGreaterThan11.判断传入的参数是否为空:isEmpty和isNotEmply12.如果进行模糊查询,使用like方法/////////////////////////////////////////////////////////////////////////////////IBATIS:最大的优点是可以有效的控制sql发送的数目,提高数据层的执行效率!好象阿里巴巴现在就用的是IBATIS;它需要程序员自己去写sql语句,不想hibernate那样是完全面向对象的,自动化的,ibatis是半自动化的,通过表和对象的映射以及手工书写的sql语句,能够实现比hibernate等更高的查询效率。1.优点简单:易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。实用:提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供了DAO框架,可以使我们更容易的开发和配置我们的DAL层。灵活:通过sql基本上可以实现我们
不使用数据访问框架可以实现的所有功能,或许更多。功能完整:提供了连接管理,缓存支持,线程支持,(分布式)事物管理,通过配置作关系对象映射等数据访问层需要解决的问题。提供了DAO支持,并在DAO框架中封装了ADO.NET,NHibernate和DataMapper。增强系统的可维护性:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。2.缺点滞后性:还没有明确对.NET2.0的支持。最新版本在2.0下编译可以,但有些单元测试不能通过。不成熟,工程实践较少:IbatisNet在实际项目中的使用较少。只是理论上可行.半ORM,工具支持较少:需要我们自己写sql,并且.NET下还未发现可以自动生成业务层类和配置文件的工具,这点和NHibernate不一样,NHibernate会为我们的数据库直接产生sql,并有一些辅助工具。因此使用Ibatis比NHibernate要多做一些工作。3.可行性
没有最好的框架,只有最适合的框架。存在的便是合理的,它存在就说明有它存在的道理。但它未必为我们存在。所以选择一个框架最主要的是看它对你有没有意义,意义有多大,是不是比其他框架带给你的好处要多。没有绝对的优点也没有绝对的缺点,重要的是看在什么情况下讨论。上面说了部分的Ibatis的优点和部分缺点。这些优点从理论上证明Ibatis对任何数据持久层都合适,但未必是最好的选择。下面对上面的优缺点分别从两方面讨论。简单:我们都喜欢简单,简单意味着学习成本低,使用中出错的可能性低。同时,简单的东西一般来说功能不够强大。反过来,复杂的东西学习成本高,用起来不方便,并且团队没有很强的技术实力,一般不要使用。实用:解决了项目中需要解决的问题,这是任何实际工程中采用的框架和工具都应具有的性质,否则就不要拿到实际项目中来。灵活:灵活有两层意思,一种是简单易扩展,另一种是功能强大提供了很多选项。Ibatis属于前者,Hibernate属于后者。两者各有优缺点。功能完整:Ibatis的功能完整也是相对的,比我们自己开发的框架应该完整,但对比其他框架肯定也有一些解决不了的问题。增强系统的可维护性:利用Ibatis可以做到sql和代码分离,可以设计出一个清晰的数据访问层(DAL)。但项目架构是否科学合理,是否以维护,关键不在Ibatis,因为它只是一个数据层框架。但是我们也不得不清楚,要想发挥Ibatis的优势,我们需要做一些额外工作,比如最好设计DAO接口,需要将业务层实体和对实体的访问放在不同的工程中,同
时需要维护xml配置文件。滞后性:Ibatis组现在还没有提到要支持.NET2.0,很多人在.NET2.0下使用Ibatis都出现了问题。所以如果要使用.NET2.0开发,IBatis不是一个好选择,还需要等待。不成熟:开源的东西很难说成熟,但一般比我们自己写的框架要成熟。由于我们可以拿到他的源代码,所以关键在于我们能否驾驭它。半ORM,工具支持少:这注定了Ibatis不能从本质上提升开发效率,我们需要自己写sql,写实体类,写配置文件。但这也是它优越的地方,它没有为我们做的他多,所以我们就有更多的施展空间。而且它非常适合那些并不能完全控制数据库的系统和需要利用数据库本身提供的高级特性的统计查询系统的开发。使用Ibatis需要自己写sql,由于我们的sql不可能完全符合sql标准,比起NHibernate产生的sql来,可移植性差。不过由于我们更改数据库的可能性较小,对我们来说sql符合标准以便可以在迁移到不同服务器时代价最小并不是十分必要的。另一方面,NHibernate虽然可以屏蔽很多数据库间的不同,但是却很难利用某些数据库的高级特性,比如Oracle的分析统计函数。NHibernate不适合数据库模式不规范,约束不完整,需要大量复杂查询的系统,同时NHibernate的学习成本较高,完全掌握NHibernate也较困难,风险较大。自己写框架未必比Ibatis的好,稳定,强大和可扩展。而且自己开发框架也需要较大的工作量。如果使用DotNet并且要选一个数据层框架,而系统中有相当一部分较复杂的sql,或数据库设计不合理,脏数据多,对性能和资源要求严格,Ibatis是一个比较不错的选择。他的那些缺点并不是致命的,而且也是有一些解决方案的。尤其是,当选用了Ibatis的DataAccess作为DAO框架时,我们可以同时使用NHibernate,ADO.NET和DataMapper(IbatisNet的核心组件),那样将会使风险降到最低,并且整个系统的框架比较合理。另外,利用Ibatis可以统一编码风格,节约开发成本,大家不会再把精力浪费到分页连接池主键生成等地方了,可以集中精力进行业务组件的编写。综上:很多时候我们要在是自己开发框架和选用第三方框架和选用什么样的框架问题上进行综合考虑。考虑的标准当然是项目的当前情况和我们希望达到目的的一个平衡。Ibatis只是封装了数据访问层,替我们做了部分的对象关系映射。但我们的代价是必须要写xml配置文件,相对于Hibernate我们还要写很多sql。Hibernate通过工具直接从数据库模式生成实体类和基本的配置文件,而且大部分情况下不需要我们写sql,会较大的提升开发效率。但这些也有很多的
局限性,尤其是对环境的要求较高(数据库设计,对象设计,团队的协作等)个人感觉Ibatis对项目比较有意义的地方在于。它小巧灵活,可扩展,封装了数据访问层(事务,缓存,异常,日志),并提供了DAO框架支持。
利用Ibatis我们可以做到代码和sql的分离,只要sql能够解决的问题,Ibatis就能帮我们较容易的解决,同时也使我们的项目对某一框架的依赖性变小(因为Ibatis是非侵入性的)。这将极大的降低项目风险,减少解决复杂问题的时间,使项目的维护变得简单。Ibatis对于应用的修改,调试,扩充和维护将会变得容易自然。修改时,我们主要修改的是代表模型的实体对象,xml配置文件中的sql,和/或配置文件的ResultMap(很多时候是不需要的)。同时,sql和代码分离,我们不用在代码的StringBuffer的append方法之间寻找需要修改的sql。配置文件中的sql便利了我们的调试和对sql的评审及以后的sql重用。利用一些框架在前期一般会拖慢开发效率。因为我们需要付出学习成本,很多时候,使用框架需要写很多配置文件,在使用不熟时开发速度较慢;同时利用框架往往使系统代码量增大,比如Model1和Model2模型,开发效率应该还是Model1快,四层的架构肯定比两层的代码量大。但对于中后期开发和维护将会极大的提高效率。利用一些较完全的开发框架和代码生成工具,在前期会较大的提高开发效率,但在后期常常会拖慢进度,并有可能成为以后维护的梦魇。比如torque生成实体类和其对应的sql,虽大幅提高了效率,但修改负担较大。比较理想的开发方式是使用简单框架结合简单的代码生成工具。框架提供系统的基础服务,并规范开发。框架一方面提供了开发中某一方面的开发基础支持,比如数据访问层,事务,日志,公用类,异常等。另一方面,也为开发定义了模式,定义了系统的基本轮廓。同时,通过简单的代码生成工具生成部分低级的代码。比如通过工具从数据库模式生成实体类。这些类生成后我们可以自由修改。Hibernate是十分强大,比较完善的ORM框架,不过这是它的优点也是它的缺点。j2ee系统是否采用Hibernate3,是一个需要认真评估的问题。要想Hibernate工作的好,数据库的设计必须好。同时对于复杂的数据操作同时需要使用sql,Hibernate3对于直接使用sql的支持比Hibernate2要自然,这一点是可以接受的。Hibernate比较复杂,功能强大而灵活,要用好Hibernate确实不是很简单,当然Spring框架提供
了对Hibernate的封装,使Hibernate的使用变得简单了点。可以说Ibatis在任何系统里都适用,
但未必是最好选择。不过Ibatis提供的思路是我们应该仔细考虑的。
1