论坛首页 Java企业应用论坛

service于dao的界限

浏览 10350 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-26  
DAO
本人最近在项目里面用到spring+hibernate的框架,总感觉到自己在service和dao上的划分不明确,请各位指点一下!
   主要问题是出在分页上面!请大家看我的做发。
下面是本人的一个CommonListDAOImp.java

public class CommonListDAOImp extends HibernateDaoSupport implements
		CommonListDAO {
	// Log
	private static final Log log = LogFactory.getLog(CommonListDAOImp.class);;

	private int maxPages;

	private int totalNum;

	private int pageSize;

	private List currentPageList;

	/*
	 * (non-Javadoc);
	 * 
	 * @see com.denis.testproject.dao.imp.CommonListDAO#initialListDAO(java.lang.String,
	 *      int, int);
	 */
	public void initialListDAO(String hql, int pageNo, int pageSize); {
		log.info("$$ initialListDAO(); is runing ....");;
		Query query = null;
		query = this.getSession();.createQuery(hql);;
		int start = (pageNo - 1); * pageSize;
		int rowNum = pageSize;
		query.setFirstResult(start);;
		query.setMaxResults(rowNum);;

		this.totalNum = query.list();.size();;
		this.pageSize = pageSize;
		this.maxPages = totalNum / pageSize;
		if (totalNum % pageSize != 0); {
			this.maxPages++;
		}
		this.currentPageList = query.list();;

	}

	/*
	 * (non-Javadoc);
	 * 
	 * @see com.denis.testproject.dao.imp.CommonListDAO#getCurrentPageList();
	 */
	public List getCurrentPageList(); {
		return currentPageList;
	}

	/*
	 * (non-Javadoc);
	 * 
	 * @see com.denis.testproject.dao.imp.CommonListDAO#getMaxPages();
	 */
	public int getMaxPages(); {
		return maxPages;
	}

	/*
	 * (non-Javadoc);
	 * 
	 * @see com.denis.testproject.dao.imp.CommonListDAO#getPageSize();
	 */
	public int getPageSize(); {
		return pageSize;
	}

	/*
	 * (non-Javadoc);
	 * 
	 * @see com.denis.testproject.dao.imp.CommonListDAO#getTotalNum();
	 */
	public int getTotalNum(); {
		return totalNum;
	}

}



下面是我service里面的一个对应的方法
	public Map getMainTipsByPages(Map inputParam);{
		Map result = new HashMap();;
		PaginationVO paginationVO = (PaginationVO); inputParam.get("paginationVO");;
		String hql = "select mainTip from MainTips as mainTip  order by mainTip.postTime";
		int pageNo = paginationVO.getCurrentPageNo();;
		int pageSize = paginationVO.getPageSize();;
		commonListDAO.initialListDAO(hql,pageNo,pageSize);;
		paginationVO.setCurrentPageList(commonListDAO.getCurrentPageList(););;
		paginationVO.setMaxPage(commonListDAO.getMaxPages(););;
		paginationVO.setTotalRecord(commonListDAO.getTotalNum(););;
		result.put("paginationVO",paginationVO);;		
		return result;
	}


commonListDAO 是用spring注入进去的!

   上面就是我的dao和service的设计,但是我这样做的话就一定会在service层里面出现hql代码了!哪位兄弟给点好的建议!非常感谢。
   发表时间:2005-07-26  
service只提供参数,hql的钩造工作交给DAO.
0 请登录后投票
   发表时间:2005-07-26  
能不能对这个分页提供一个好的解决方法呢!
0 请登录后投票
   发表时间:2005-07-27  
你可以这样封装:
public class SearchCriteria{
   static int PageSize;
   int totalRowNum;
   int currentPageNum;
   List params;
   List orderBys;
}

public Class Pager{
   List result;
   int totalRowNum;  
}

SearchCriteria 用来保存从前台传过来的分页,参数,分页等信息,在service layer进行过滤,增加查询参数等。然后把SearchCriteria传给DAO,DAO返回Pager对象,包括分页后的结果等信息。然后给前台处理。
在Service层中不要对分页信息处理。
0 请登录后投票
   发表时间:2005-07-27  
阿木欢 写道
你可以这样封装:
public class SearchCriteria{
   static int PageSize;
   int totalRowNum;
   int currentPageNum;
   List params;
   List orderBys;
}

public Class Pager{
   List result;
   int totalRowNum;  
}

SearchCriteria 用来保存从前台传过来的分页,参数,分页等信息,在service layer进行过滤,增加查询参数等。然后把SearchCriteria传给DAO,DAO返回Pager对象,包括分页后的结果等信息。然后给前台处理。
在Service层中不要对分页信息处理。


不知阿木欢兄所说的List params;这个里面放的是什么是一个完整的查询语句还是要查询的column,在service层的过滤和增加查询参数是指把前面的参数拼凑成一个sql语句或hql等查询语句吗?然后再传给dao处理?谢谢你的关注!
0 请登录后投票
   发表时间:2005-07-27  
为什么不试试论坛的查找功能:
http://forum.iteye.com/viewtopic.php?t=14657
0 请登录后投票
   发表时间:2005-07-27  
1. Dao base class:
public class BaseDao extends HibernateDaoSupport implements IDao {
   
    ......
    public BaseDao(){}
   
    protected HibernateTemplate createHibernateTemplate
                       (SessionFactory sessionFactory) {
return new IssHibernateTemplate(sessionFactory);
}

    public final IssHibernateTemplate getIssHibernateTemplate() {
  return (IssHibernateTemplate)getHibernateTemplate();
    }

    ......
    public List queryAllEntities(int start, int range) throws DaoException {
        return getIssHibernateTemplate().loadAll(m_entityType, start, range);
    }

    .......
}

2. then in extended dao classes, do like following:

......
public List queryAll(int start, int range, int orderBy, boolean ascend ) throws DaoException{
String sql_s = ......
return getIssHibernateTemplate().find( sql_s, start, range );
}
......
0 请登录后投票
   发表时间:2005-07-28  
我做的和阿木欢的差不多,不过我只设置了Pager这个对象,而SearchCriteria我去掉了,而是直接把在Service中用
dao.listPagination(int start,int num,List params),具体hql的构造在dao中来做,params只是一个“参数-值”的列表。
当然,你用Map,或者自己定义一个类都可以,如果查询参数比较固定的话,我一般是喜欢定义一个专门的javabean,里面就是各个参数的列表。
0 请登录后投票
   发表时间:2005-07-28  
lingcm 写道
阿木欢 写道
你可以这样封装:
public class SearchCriteria{
   static int PageSize;
   int totalRowNum;
   int currentPageNum;
   List params;
   List orderBys;
}

public Class Pager{
   List result;
   int totalRowNum;  
}

SearchCriteria 用来保存从前台传过来的分页,参数,分页等信息,在service layer进行过滤,增加查询参数等。然后把SearchCriteria传给DAO,DAO返回Pager对象,包括分页后的结果等信息。然后给前台处理。
在Service层中不要对分页信息处理。


不知阿木欢兄所说的List params;这个里面放的是什么是一个完整的查询语句还是要查询的column,在service层的过滤和增加查询参数是指把前面的参数拼凑成一个sql语句或hql等查询语句吗?然后再传给dao处理?谢谢你的关注!

这个List params指的是前台用户input的参数的值,至于column不应该让前台知道,应该在service layer对参数过滤。还有一种办法,就是结合MVC模式中的model,让前台传到service的都是已经填充好参数的model,这样再传给DAO处理会方便一些。我说的过滤指的是,用户输入的参数有时候并不能代表就是dao层需要的阐述,你可能需要在service层中进行searchCriteria的组织工作,比如:用户在界面上选择了升序排序,那你就必须在service层里面把用户的input转换成DAO能够识别的方式:searchCriteria.addOrderBy("desc");至于组装sql或者hql的工作其实是有共性的,你可以创建一个SQL/HQLRendering类,专门负责把searchCriteria translate成你需要的sql/hql clause。然后在需要的dao中调用Rendering类翻译。
0 请登录后投票
   发表时间:2005-07-28  
giginet 写道
我做的和阿木欢的差不多,不过我只设置了Pager这个对象,而SearchCriteria我去掉了,而是直接把在Service中用
dao.listPagination(int start,int num,List params),具体hql的构造在dao中来做,params只是一个“参数-值”的列表。
当然,你用Map,或者自己定义一个类都可以,如果查询参数比较固定的话,我一般是喜欢定义一个专门的javabean,里面就是各个参数的列表。


这个searchCriteria其实是和我设计的一个hqlRendering类配合使用的,我用这个hqlRendering类把servicelayer组织的searchCriteria翻译成hql,这样很多dao的功能比如dynamic search就可以写成一个放在BasicDAO里面的通用方法,减少代码量。
0 请登录后投票
论坛首页 Java企业应用版

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