服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

j2ee核心:ibatis dao入门与进阶一

在核心j2ee模式中是这样介绍dao模式的:为了建立一个健壮的j2ee应用,应该将所有对数据源的访问操作抽象封装在一个公共api中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。

 

比如考虑在ibatis: sql maps中的应用例子。这是一个struts应用允许对一个关系表执行select, insert, updatedeletesql请求。在这个应用中,使用sql maps做持续性框架。现在我们要修改这个应用,将这个关系表储存在一个xml文件中而不是存在关系数据库中,或者使用hibernate来实现select请求,而用sql map来执行其他请求,因为hibernate提供了对高速缓存更好的支持。这样的修改很难实现,或者即使我们能修改而实现了这个功能,也会是很混乱的解决方案。

 

对于这类问题更好的解决方法是建立一个contactdao接口,在这个接口中定义处理select, insert, update, delete 请求的事务方法。然后根据不同的事务逻辑建立不同的类实现各个方法。所以可能会有一个类处理使用sql maps同关系表进行交互的情况,而另外一个类处理用xml文件存放关系表而不是关系数据库的情况,等等。在项目中,根据实际的需要从不同的contactdao中选择相应的实现。这种关系见图1j2ee核心:ibatis dao入门与进阶一

1. contactdao 接口及实现

 

ibatis dao是由apache主持的开源框架项目,主要目标是为了解决这类问题。它允许在工程中以dao模式为基础建立应用。这就意味着可以建立一个xml文件,并声明xmlcontactdao.javacontactdao的实现类,这个类知道如何从xml文件中读写数据。sqlmapcontactdao则知道如何用sql maps作为持续化框架与关系表进行交互。在工程中,如果向dao框架提交一个需要xmlcontactdao请求,框架则会返回一个xmlcontactdao对象。同样的dao框架提供了唯一的接口处理事务管理,这个接口能实现与数据的存储方式无关。它同样考虑了底层连接管理细节和初始化存储框架。

这篇文章是关于如何一步一步的在项目中应用ibatis dao框架的基础指导。我们将由如何把sql maps一文中的应用实例改为应用dao框架入手。然后,我们要讨论dao框架的构造。再下一步,我们关注事务管理是如何在dao框架中得到支持的。最后一部分是关于如何建立自己的事务管理模块。

 

示例应用


首先,我们将sql maps一文中的例子改为应用dao框架。

1.        ibatis-dao-2.jar文件复制到web-inf/lib目录下。

2.        java源程序的目录里新建一个如下的daomap.xml文件

清单1

 


 
  
     "com/sample/contact/dao/sqlmap/sqlmapconfig.xml"/>
  

     implementation=
   "com.sample.contact.dao.sqlmap.sqlmapcontactdao"/>
 

 

daomap.xml是发布ibatis dao框架的配置文件。是根元素,每个元素描述了一种存储机制。在这个例子中只使用了sql maps来存储,所以我们这里只有一个元素。每种存储机制必须包含一个元素,这个元素描述连接它后面的数据存储所用的管理器,并且标记事务的界限。我们将在稍后再讨论transactionmanager

 

元素还包括一组dao用于描述其他的存储管理机制。在这个例子中,我们将生成一个使用sql maps存储的contactdao,所以在配置文件中添加一个ie标记来定义sqlmapcontactdao

 

3.       建立contactdao.java,如下:

2

 

public interface contactdao extends dao {
    public int insertcontact(contact contact);
    public int updatecontact(contact contact);
    public contact selectcontact(int contactid);
    public int deletecontact(int contactid);
}

  

 

contactdao.java定义了用户和一个关系表进行交互所需要用到的所有事务处理方法。请注意到contactdao.java中的所有方法都将一个contact对象作为参数,这是一个用来携带数据的数据传递对象。

 

4.        建立一个sqlmapcontactdao.java文件,如下

清单3

public class sqlmapcontactdao extends
 sqlmapdaotemplate implements contactdao {
  public sqlmapcontactdao(daomanager arg0) {
      super(arg0);
  }
  public int deletecontact(int contactid) {
    return super.delete("deletecontact",
    new integer(contactid));
  }
  public int insertcontact(contact contact) {
    integer contactid =(integer)super.insert
      ("insertcontact",contact);
    return contact.getcontactid();
  }
  public contact selectcontact(int contactid) {
    return (contact)super.queryforobject("getcontact",
      new integer(contactid));
  }
  public int updatecontact(contact contact) {
    return super.update("updatecontact",contact);
  }
}

 

sqlmapcontactdaocontactdao接口的具体实现,它用sql maps作为存储管理机制。注意到我们并没有写任何代码来或者初始化sql maps,或得到一个连接,或者在类中标注一个事务的界限。相反,我们继承sqlmapdaotemplate.java类,它帮我们处理下层的、反复的操作。我们在sqlmapcontactdao类中需要考虑的唯一的事情就是事务处理逻辑。

 

5.        修改contactselectaction.java类中的execute()方法,如下:

清单4

 

contact contactform = (contact) form;
reader reader=
  resources.getresourceasreader("daomap.xml");
daomanager daomanager =
  daomanagerbuilder.builddaomanager(reader);
contactdao contactdao =
  (contactdao) daomanager.getdao(
contactdao.class,"sqlmap");

request.setattribute("contactdetail",
  contactdao.selectcontact(
    contactform.getcontactid()));

 

最后一步是修改contactselectaction类中的execute()方法,使它使用dao框架。为了初始化dao框架,我们需要一个为daomap.xml 准备一个reader对象。ibatis框架为我们提供了方法resources.getresourceasreader()来读取资源。一旦有了reader对象来读取daomap.xml,就能将它们读取至daomanagerbuilder.builddaomanager(),返回一个daomanager实例,将来用于与dao框架进行交互。从理论上来说,应该在项目启动的时候初始化dao框架,在我们这个程序中,可以将这个模块放入struts