转来IBATIS的一些小文章

 
初识iBATIS
现在最新的版本是(2007-8-2)2.3.0,也是第一个没有加入JAVA DAO(Data Access Object)框架的版本,在前面的版本中都加入有DAO,其目的在于推荐用户使用Spring框架。
前面学了一下Hibernate,不过,没有学习多久,我就被它的复杂性以及这样那样的弯来弯去给吓回来了,太复杂了,真不知道那些写这样框架的人是怎么样想的,有没有担心过用户在使用过程中是否会有不便性。我个人写软件就希望简单,最好是把需要的参数传进去就OK了,用户没有必要去照顾这么复杂的东东。
现在终于找到了一个不用学习Hibernate更充分的更由,前面我准备用Oracle Jdeveloper的绑定取代它,不过想到绑定的不可移植性,因为它不太支持其它的数据库,只支持ORACLE,毕竟全天下不可以都用ORACLE的数据库,所以这个想法一直没有去做,今天在QQ郡里面,突然看到了这个东西,当时就没有在意,只知道是这么一个数据持久层的东东。今晚无意在搜索“J2EE IN ACTION”的时候突然再次出现在我的眼前,一定要看看了。
The iBATIS Data Mapper framework 可以方便我们通过 JAVA .NET 操作数据库应用, iBATIS 通过 XML 描述将对象与存储过程或者是 SQL statement 。在对象关系映射工具中,它的简单性无疑是它最大的优点。
要使用 iBATIS 数据映射,依靠于你本身的对象、 XML SQL ,只需要学习很少的新知识就 OK 。使用 iBATIS ,你完全可以操作 SQL 及存储过程于指间。
它本身的文档也不是像其它的框架一样,动不动就是几十页,这个就只有仅仅九页,并且支持七种语言,这样就可以方便不同的用于使用了,我下载的是英文版的,很好懂,下载页面: http://ibatis.apache.org/javadownloads.cgi,2.3.0的下载地址是: http://apache.mirror.phpchina.com/ibatis/binaries/ibatis.java/ibatis-2.3.0.677.zip,如果喜欢用JAVA DAO的可以下载2.2.0的: http://apache.mirror.phpchina.com/ibatis/binaries/ibatis.java/iBATIS_DBL-2.2.0.638.zip。
      

看了这一篇文章,终于对为什么要用Hibernate或者是iBATIS有了一个清楚的认识,不过,个人觉得Hibernate确实是难了一点,我个人喜欢简单,还是先用iBATIS吧。

转贴地址:http://www.xwin32.cn/program/java/java20061024/67237.html

   Hibernate VS iBATIS首先这个题目有点哗众取宠,呵呵,故意的.参考了网上许多前辈的见解,然后加了自己一点点的理解.如果有什么板砖,欢迎来拍 chinaewolf@gmail.com简介Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了
iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。
相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了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要把那些sql mapping的地方一一修改。6. 以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。7. Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS8. 最关键的一句话是iBATIS的作者说的:If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy .

结论:
Hibernate 和iBATIS可以说是互相补充,共同发展的关系.具体你想用什么要看实际情况.如果看了上面的文字还是拿不定注意,那就Just to try it.实践是检验真理的唯一标准.鞋合不合适,只有试了才知道

 

 

看着iBATIS简单的文档,心理面就有想要试用的冲动,因为它不知道比HIBERNATE好看到那去了。于是就去它的官方网站http://ibatis.apache.org把该下载的东西都下载回来了,第一个程序就从它里面自带的例子(为了不使这篇内容过长,例子就请从其官方网站下载,我的当前版为2.3.0)开始,根据JAVA BEAN Account.java的内容,创建一个表:

create table Account(ACC_ID int,ACC_FIRST_NAME varchar(50),ACC_LAST_NAME varchar(50),ACC_EMAIL varchar(50))
insert into Account values(1,'Feng','**','56dd@163.com');
insert into Account values(2,'Zhou','**','28ddd@163.com');

并在里面插入了两条语句来做测试。

我把sqlMapConfig.xml里面的数据源改为如下:

    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="org.gjt.mm.mysql.Driver"/>
      <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/users"/>
      <property name="JDBC.Username" value="root"/>
      <property name="JDBC.Password" value="admin"/>
    </dataSource>

我的测试文件Test.java如下:

package com.mydomain.data;
import java.sql.SQLException;
import com.mydomain.domain.*;
public class Test {
 public static void main(String[] args) {  
  try {
   
   Account account=new Account();
   account.setId(3);
   account.setFirstName("TestFirst");
   account.setLastName("testLast");
   account.setEmailAddress("test@test.com");
   SimpleExample.insertAccount(account);
  } catch (SQLException e) {   
   e.printStackTrace();
  }
 }
}

但是我运总是给我如下提示错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values (       3, 'TestFirst', 'testLast', 'test@test.com'     )' at line 1

说我的值处有错误,但是这些又不是我能够控制的,我是按规则写的,当前的MYSQL版本为mysql-5.0.41-win32,我检查了好久,就是找不出那里出问题,在网上看了看,没有遇到我这种类型问题的,我真的搞不懂的了,为什么其它的人在用的时候都不出错,偏偏我要出错,放在这里,回去休息了,改天再来弄弄

发表于 @ 2007年08月07日 22:57:00|评论(2 <script type=text/javascript>AddFeedbackCountStack("1730815")</script> )|编辑

评论

# fenglibing 发表于2007-08-08 21:38:23  IP: 121.34.81.*
在我一次次的测试下,一次次的文档查看,终于记我看到我一些光明,用这个测试用例,可以通过,能够把数据库里面的东西读出来,可是在写入的时候还是出错,总是说数据类型不对,难道是该iBATIS要求特定的MYSQL版本,没有说明,只有再试试了:
package com.mydomain.test;
import com.mydomain.data.SimpleExample;
import com.mydomain.domain.*;
public class Test {
public static void main(String[] args) {
Account account = new Account();
try {
//能够执行上面这个我就已经看到一丝的光明了,没有原来那么失望

int id = 1;
account=SimpleExample.selectAccountById(id);
System.out.println(account.getId());
System.out.println(account.getFirstName());
System.out.println(account.getLastName());
System.out.println(account.getEmailAddress());
//下面的插入示例还是会出错,那就基本上肯定是当前的MYSQL版本与当前版本iBATIS需要的MYSQL发生了冲突了
//account = new Account();
//id=3;
//account.setId(id);
//account.setFirstName("TestFirst");
//account.setLastName("testLast");
//account.setEmailAddress("test@test.com");
//SimpleExample.insertAccount(account);

} catch (Exception e) {
e.printStackTrace();
}
}
}
# fenglibing 发表于2007-08-08 22:17:08  IP: 121.34.81.*
问题已经解决,不过,有点郁闷,不过解决的方式你想都想不到,要想怎么解决的,请进入下面:
http://blog.csdn.net/fenglibing/archive/2007/08/08/1732911.aspx

 

<script src="http://blog.csdn.net/js/LoadFeedbackCount.js" type=text/javascript></script>

原创 初学iBATIS的朋友,如果你不看我这篇文章,你一定后悔,因为它官方文档里面的示例少一个")"收藏

新一篇: 做生意,要这样才行,呵呵 | 旧一篇: JAVA或者是JSP中文件上传:FileUpload及SmartUpload

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

    iBATIS,第一次看到你的时候,我非常的喜欢你,真的是非常喜欢你,因为你虽然不是大家闰秀,但是绝对称得上是小家碧玉,物别是里面可以灵活应用的SQL语句,可以让我随心所欲的操作,那个时候,我就对你是一见钟情了。于是赶紧从你的官方网站上把所需要的文档全部下载回来,看了一下挺简单,并按要求把例子的内容导入到了JDEVELOPER里面,这里就不例出来了,需要的朋友我想早就看过了。然后就着手自己写一个测试例子,如下:

(我且已经按规定建立了数据库,且插入了两条记录,可以参看我的第一个iBATIS测试就通不过 里面记录了我痛苦的过程) 

package com.mydomain.data;
import java.sql.SQLException;
import com.mydomain.domain.*;
public class Test {
 public static void main(String[] args) {  
  try {
   
   Account account=new Account();
   account.setId(3);
   account.setFirstName("TestFirst");
   account.setLastName("testLast");
   account.setEmailAddress("
test@test.com");
   SimpleExample.insertAccount(account);
  } catch (SQLException e) {   
   e.printStackTrace();
  }
 }
}

运行的时候,总是要报错,说什么SQL语出错误,我的老天,我就是按您的要求做的,没有一点点违约,刚开始还以为是自己那里做错了,可是翻译了网上N多个例子,也是这样的,可心里就在纳闷,为什么别人都是可以通过,而我的就通不过呢?老天不会总是这么对不起我吧。昨天把头都弄大了,确实没有办法,因为这个东西也确实是第一次接触,真的是“牛吃蓝瓜,不知道从何着手”;把问题贴到论坛上去,理都没有人去理的,难道没有一个人遇到过这样的问题,还是因为这个问题大家早就发现了,没法只有带着郁闷的心情回去睡觉了。

今天晚上又是花了几个小时,终于想想试试查寻看能不能通过,示例如下:

package com.mydomain.test;
import com.mydomain.data.SimpleExample;
import com.mydomain.domain.*;
public class Test {
    public static void main(String[] args) {
        Account account = new Account();
        try {  
            int id = 1;
            account=SimpleExample.selectAccountById(id);
            System.out.println(account.getId());
            System.out.println(account.getFirstName());
            System.out.println(account.getLastName());
            System.out.println(account.getEmailAddress());           
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

没得问题的,可以通过,并且可以查寻出结果,这就说明各方面的配置如数据源及JDBC都是正确了的,那么肯定是插入的某个地方出问题了,不是提示说SQL语句出问题了吗,那就去看看,当我去打开Account.xml文件查看到插入部份的时候,如下图:

请仔细看一下,是不是在ACC_EMIAL的后面没有括号,于是我把括号加上,一试,万事OK。
测试是通过了,心里面也有几分感叹,我不知道iBATIS的示例是否真的是这个示例当成了回事,还是因为它上面有一本名为“iBATIS IN ACTION”的书的原因,是希望我们在出问题的时候去购买这本书吗???反正这是被欺负够了,自己又没有这个能耐去写这么一个东东。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值