论坛首页 Java企业应用论坛

Spring的DAO设计实践

浏览 108722 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-14  
dhj1 写道
正在做个程序生成器,自动跟据表名的集合,生成一个bean.xml配置.

在bean.xml配置中,每个表对应一个DAO,统一命名为DAO的名字是表名+DAO. 在DAO中有一些表的基本操作的方法,录入,删除,修改,查询.按时间段查询等!
在每个表生成一个对应的service,类名为:表名+service.
这个只有基本框架.只有表维护的SERVICE,没多少内容.有待于手工填充.
又跟据表名和表字段,生成几个JSP,录入的JSP,修改的JSP,列表的JSP.
再生成几个ACTION,处理表的录入,修改,删除!

对于一个真正的项目,程序生成后,就开始跟据项目的特点,手工增加和修改JSP, ACTION.和SERVICE!

接受了本论坛几位高人的意见,想把每个表对应一个DAO缩水为一个.SERVICE跟业务逻辑有关,要跟据业务关系来确定并人工编程,但是表维护的SERVICE则保留自动生成.

表维护的ACTION也想缩水,但还不知如何下手!

--- 以上做法有什么不当之处,欢迎痛批!



我也做过Spring+Hibernate的代码生成器.
结构如下
生成DAO接口,DAO实现类. Service接口,Service实现类.
Spring的Conteroller 及配置文件.JSP页面
整个代码生成器只要写模块名和建表语句就会生成整个正常运行项目基础代码.
CURD 及分页查询功能等.有机会一起控讨.做尝试一个eclipse通用插件
0 请登录后投票
   发表时间:2005-09-27  
说句废话,构建一个适合自己系统的构架就可以了,不要被众多的技术所累。
0 请登录后投票
   发表时间:2005-10-14  
[quote="Shine]
我现在的做法就和robbin推荐的文章一致。
HibernateTemplate封装的实在是简单,很多Hibernate的API还是需要继续在BaseDao中利用execute/excuteFind来扩展。在oracle中操作B/CLOB字段就有问题了,连flush()和refresh都没提供

HibernateTemplate提供了flush()和refresh:

getHibernateTemplate().flush();
getHibernateTemplate().refresh(Object object,LockMode.UPGRADE);
0 请登录后投票
   发表时间:2006-01-10  
getHibernateTemplate().createQuery(Session arg,String arg)不是可以取得Query对象的吗?
query.setFirstResult(),query.setMaxResults()不就可以实现分页吗?
0 请登录后投票
   发表时间:2006-01-10  
robbin 写道
HibernateTemplate封装的并不完整,例如我要Query对象,拿不到,我要多个命名参数的iterator,没有,我要设置分页,不提供!你怎么办?都用HibernateCallBackup()?Spring的作用不是把Hibernate再封装一层,让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。hibernateTemplate只不过帮你剩几行代码而已,他没有完整的封装也无法取代Hibernate原生API。


原文甚简单, 想看robbin作的扩充.
0 请登录后投票
   发表时间:2006-01-10  
robbin 写道:
http://www.gpowersoft.com/tech/Spring/39.htm

这里有篇如何设计DAO来良好利用Spring的Hibernate支持类的文章,我觉得挺不错,推荐一下。

连不上!
0 请登录后投票
   发表时间:2006-01-12  
楼上的,要先看前面的回复。将39改为46。
0 请登录后投票
   发表时间:2006-02-22  
引用
package com.blandware.atleap.persistence.hibernate.core;

import com.blandware.atleap.common.util.QueryInfo;
import com.blandware.atleap.model.core.BaseObject;
import com.blandware.atleap.persistence.core.DAO;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.type.Type;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* Executes find using <code>org.springframework.orm.hibernate3.HibernateCallback</code>
     * with additional query info; with arguments and their types
*
* @param hql         Query to execute
* @param queryInfo   Object with additional information for query, currently offset and limit
* @param args        Arguments to add to query. If <code>null</code>, nothing will be added.
* @param types       Types of arguments. If <code>null</code>, Hibernate will determine types by itself.
* @param cacheable   <code>true</code> if the query is cacheable
* @param cacheRegion region of cache. E.g. one that used in configuration file of EHCahce (ehcache.xml)
* @return List of found entities
* @see org.springframework.orm.hibernate3.HibernateCallback
     * @see com.blandware.atleap.common.util.QueryInfo
*/
protected List executeFind(final String hql, final QueryInfo queryInfo, final Object[] args, final Type[] types, final boolean cacheable, final String cacheRegion) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery(hql);
query.setCacheable(cacheable);
if ( cacheRegion != null ) {
query.setCacheRegion(cacheRegion);
}
if ( args != null ) {
for ( int i = 0; i < args.length; i++ ) {
Object arg = args[i];
Type type = null;
if ( types != null && i < types.length ) {
type = types[i];
}
if ( type == null ) {
query.setParameter(i, arg);
} else {
query.setParameter(i, arg, type);
}
}
}
if ( queryInfo != null ) {
if ( queryInfo.getLimit() != null ) {
query.setMaxResults(queryInfo.getLimit().intValue());
}
if ( queryInfo.getOffset() != null ) {
query.setFirstResult(queryInfo.getOffset().intValue());
}
}
return query.list();
}
});
}。
0 请登录后投票
   发表时间:2006-03-21  
   非常好的讨论。
to dhj1:不知道你的代码生成器进展如何了?
0 请登录后投票
   发表时间:2006-03-28  
HibernateTemplate的确不够完善,但是如果要自己管理session和控制事务,又麻烦了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics