赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

用15分钟了解DaoZero:它为你实现DAO接口 (1)

发布时间:2006.05.11 05:21     来源:javajia    作者:oneworld 转

    DaoZero是1个很小的Spring Java Bean。可以到http://dao-zero.sourceforge.net下载。使用DaoZero可以减少基于 iBatis+Spring的持久层代码数量,因为DaoZero会动态地替我们实现持久层接口。

1. DaoZero是什么?它可以在哪方面帮助我?

*假设你具有使用Spring的iBatis支持类作为持久层实现的实际编码经验(即时没有,学习Spring和iBatis也应该不是件怎么难的事情)。

DaoZero是1个很小的Spring Java Bean。可以到http://dao-zero.sourceforge.net下载。使用DaoZero可以减少基于 iBatis+Spring的持久层代码数量,因为DaoZero会动态地替我们实现持久层接口。它不是1个Spring中iBatis支持类的包装,而是用来直接替换掉我们手工编写的持久层实现代码的。使用DaoZero时,一旦我们完成了DAO接口的定义(Java Interface),通常情况下,我们只需要再在Spring Context定义文件中声明类型(class)为daozero.ibatis.Dao的bean,并且设置这些bean的targetType属性为已定义好的DAO接口,然后这些DaoZero bean 就会在运行时为我们动态地生成实现了targetType的DAO实现类,由这些实现类去调用iBatis API访问数据库。所以,不需要DAO接口的实现代码了。

2. DaoZero的工作原理

DaoZero约定iBatis SQL Mapping XML文件中定义的statement的名字需要和DAO接口(抽象类)的method的名字保持一致,而且,当前版本还要求statement的parameter的数量及首次出现顺序也必须要和DAO接口(抽象类)的method的参数(形参)的数量及出现顺序保持一致,通过做出这些约定(应该不太难于遵守吧),DaoZero就可以确定如何把method被调用时传入的参数(实参)和statement的 parameter对应起来,于是就可以用这些传入的参数组成statement需要的parameter map,去调用iBatis API访问数据库。DaoZero是一个实现了org.springframework.beans.factory.FactoryBean 的bean,就是说它是可以产生bean的factory bean,而DaoZero factory bean产生的bean就是实现了DAO接口的DAO对象,这些DAO对象负责调用Spring的iBatis template的方法,例如queryForObject()、queryForList()和update()等。这些DAO对象也有足够“智能”,它们会依据method的返回类型推断出该调用queryForObject()还是queryForList()(当前版本尚不支持queryForMap)。 DaoZero factory bean是如何产生DAO对象的呢?这要视其属性targetType是接口还是抽象类来定:如果targetType是接口,那么使用JDK标准的 proxy(java.lang.reflect.Proxy)机制,由该proxy负责拦截下对该接口方法的调用;如果是抽象类,那么就使用CGLIB的enhancer(net.sf.cglib.proxy.Enhancer)莱拦截下对该抽象类中抽象方法的调用,而将方法调用拦截下来后的处理则基本上一致。使用JDK Proxy或CGLIB enhancer对性能的影响在数百纳秒(ns)这个数量级,因此对于大多数Web应用来说相对于数据库SQL执行是可以忽略不计的。

事实上DaoZero不得不hack了一些iBatis的代码,不得不把iBatis提供的一些接口强行转型(Cast)到iBatis的内部实现类,原因在于iBatis似乎没有提供检索其statement元数据的方法,使得DaoZero不得不在代码中留下了一些坏味道。(所以,如果iBatis出现了大的版本改变,那么DaoZero这部分代码也不得不重新写。)

3. 用DaoZero代替原来的iBatis DAO bean

假设我们有一个数据库表叫"account",表结构如下所示,

create table account (
userid varchar(80) not null,
email varchar(80) not null,
constraint pk_account primary key (userid)
);


我们使用了一个叫Account的domain class来代表该表,Account是标准的Java Bean(POJO),具有属性:"userId"和"email",
public class Account implements Serializable {
private String userid;
private String email;
public String getUserId() { return this.userid; }
public void setUserId(String s) { this.userid=s; }
public String getEmail() { return this.email; }
public void setEmail(String s) { this.email=s; }
}


操作Account的DAO接口是这样的,
public interface AccountDao {
Account getAccountByUserId(String userId) throws DataAccessException;
void updateAccount(Account account) throws DataAccessException;
List getUsernameList() throws DataAccessException;
}



使用DaoZero之前,一般情况下,我们会用iBatis做一个DAO实现类,该类继承自Spring的SqlMapClientDaoSupport,该基类封装了iBatis SqlMapClient的主要操作以和Spring集成起来,该实现类可能是这样的:
import org.springframework.org.ibatis.support.SqlMapClientDaoSupport;

public class AccountDaoImpl extends SqlMapClientDaoSupport implements AccountDao {
   public Account getAccountByUserIdAndEmail(String userId, String email) throws DataAccessException {
    Map params = new HashMap();
    params.put( "userId", userId );
    params.put( "email", email );
    return getTemplate().queryForObject( "getAccountByUserIdAndEmail", params );
   }

  public int updateAccount(Account account) throws DataAccessException {
    return getTemplate().update( "updateAccount", account );
   }
   public List getUsernameList() throws DataAccessException;
    return getTemplate().queryForList( "getUsernameList", null );
   }


自然,iBatis的SQL Mapping XML文件是必不可少的:





    update account set email = #email# where userid=#userId#

1 2 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 基于AJAX技术的DataGrid控件编程 (05-10) · 新手必读:JAVA开发工具安装配置心得 (05-10)
· 浅谈Java中final,finalized,finally (05-10) · Java EE 5通过终审投票—JSR 224技术规范 (05-10)
· 使用Java Annotations来管理对象的生命周期 (05-10) · JavaOne即将召开 Sun将发布Java EE (05-10)
· 【开发工具】Eclipse照亮Java众生 (05-09) · Java基础:提升JSP应用程序七大绝招 (05-09)
· 源码提供:数据库连接的一些代码 (05-09) · Spring里面的一些添删改查示例(二) (05-09)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 工信部“三定”公布 总编制731名设24司局
· 北京发电子商务监管意见 营利性网店须办照
· 直播 08中国城市信息化高峰论坛 案例点评
· 烽火网络校园解决方案 移民安置信息管理系统
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统