论坛首页 Java企业应用论坛

我的万能dao 设计源码,请大家多多指教!

浏览 24101 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (10)
作者 正文
   发表时间:2009-08-11  
楼主,写的是基于Hibernate。如果要跳出Hibernate直接用Spring的JDBC可以实现DAO的对象化封装么?
0 请登录后投票
   发表时间:2009-08-11  
xxxccc81 写道
楼主,写的是基于Hibernate。如果要跳出Hibernate直接用Spring的JDBC可以实现DAO的对象化封装么?

这个倒是没仔细想过
0 请登录后投票
   发表时间:2009-08-11  
weich_1211 写道
linliangyi2007 写道
虽然想法有点“幼稚”(因为无数的人都像楼主这样设想过),但精神还是值得鼓励的。

这样做不适合复杂逻辑的应用,尤其是性能上不好处理。具体为啥,楼主可以在今后的使用中感悟吧,一言难尽!!

赞同,不知道楼主参加工作多久了,能有这样的想法。对于任何的项目或者工程,程序员应该注重的是业务,而不是DB,DB是根据业务来做的,你这种对于复杂的业务来讲,有点太过于牵强了。

刚出来工作不久,差两个月就以年了吧,很多东西还是要自己摸索的...
0 请登录后投票
   发表时间:2010-03-15  
   个人认为你的万能DAO写的太繁琐了,每一个类操作都的去实现你那么多方法,不太灵活,其次最好使用泛型,最好借鉴点适配器模式的思想,你可以看看我的DAO类,不太完善,还需要修改。
0 请登录后投票
   发表时间:2010-03-15  
很难做到“万能”
0 请登录后投票
   发表时间:2010-03-15  
sky_dream 写道
   个人认为你的万能DAO写的太繁琐了,每一个类操作都的去实现你那么多方法,不太灵活,其次最好使用泛型,最好借鉴点适配器模式的思想,你可以看看我的DAO类,不太完善,还需要修改。


谢谢你,你可以看下我重新整理的dao,现在我基本上不用写新的方法,泛型dao接口定义的方法基本能满足我的需求了,在开发效率上明显提高很多:

package com.lym.db.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.type.Type;
import org.springframework.stereotype.Repository;

/**
 * 基础Dao接口,定义通用的操作
 * @author LYM
 *
 */
@Repository
public interface IGenericDao<T, PK extends Serializable> {

	/**
	 * 对于返回列表的方法,通过调用我来实现返回记录数的控制,
	 * 设置返回记录数,若top为0不设置
	 */
	public void setMaxResults(int top);
	
	/**
	 * 获得hibernate session
	 * @return
	 */
	public Session getHibernateSession();
	
	/**
	 * 保存T实体
	 * @param entity 继承T抽象类的实体
	 * @return Serializable 主键
	 */
	public Serializable save(T entity);
	
		
	/**
	 * 更新T实体
	 * @param entity 继承T抽象类的实体  
	 */
	public void update(T entity);
	
	/**
	 * 保存或更新T实体
	 * @param entity 继承T抽象类的实体
	 */
	public void saveOrUpdate(T entity);
	
	/**
	 * 保存或跟新实体集合Collection<T>
	 * 若实体已经存(根据主键判断)在则更新实体,则保存实体
	 * @param entityList 继承T抽象类的实体集合
	 */
	public void saveOrUpdateAll(Collection<T> entityList);
	
	/**
	 * 删除T实体
	 * @param entity 继承T抽象类的实体
	 */
	public void delete(T entity);
	
	/**
	 * 删除Collection<T>集合实体
	 * @param entityList 继承T抽象类的实体集合
	 */
	public void deleteAll(Collection<T> entityList);
	
	/**
	 * 根据主键值获得继承T的实体
	 * @param id 实体主键
	 * @return T
	 */
	public T findEntityById(PK id);
	
	/**
	 * 根据hql语句查找T,返回List<T>类型
	 * @param hql HQL查询语句
	 * @return List<T>
	 */
	public List<T> findEntityByHqlQuery(String hql);
	
	/**
	 * 根据hql语句查找T,返回List<T>类型
	 * @param hql HQL查询语句
	 * @param obj 查询参数,匹配站位符?
	 * @return List<T>
	 */
	public List<T> findEntityByHqlQuery(String hql, Object obj);
	
	/**
	 * 根据hql语句查找T,返回List<T>类型
	 * @param hql HQL查询语句
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @return List<T>
	 */
	public List<T> findEntityByHqlQuery(String hql, Object[] objs);
	
	/**
	 * 根据hql语句查找某些列,返回List<Object[]>类型
	 * @param hql HQL查询语句
	 * @return List<Object[]>
	 */
	public List<Object[]> findColsByHqlQuery(String hql);
	
	/**
	 * 根据hql语句查找某些列,返回List<Object[]>类型
	 * @param hql HQL查询语句
	 * @param obj 查询参数,匹配站位符?
	 * @return List<Object[]>
	 */
	public List<Object[]> findColsByHqlQuery(String hql, Object obj);
	
	/**
	 * 根据hql语句查找某些列,返回List<Object[]>类型
	 * @param hql HQL查询语句
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @return List<Object[]>
	 */
	public List<Object[]> findColsByHqlQuery(String hql, Object[] objs) ;
	
	/**
	 * 根据hql语句查找某些列,返回List<Object>类型
	 * @param hql HQL查询语句
	 * @return List<Object>
	 */
	public List<Object> findColByHqlQuery(String hql) ;
	
	/**
	 * 根据hql语句查找某些列,返回List<Object>类型
	 * @param hql HQL查询语句
	 * @param obj 查询参数,匹配站位符?
	 * @return List<Object>
	 */
	public List<Object> findColByHqlQuery(String hql, Object obj);
	
	/**
	 * 根据hql语句查找某些列,返回List<Object>类型
	 * @param hql HQL查询语句
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @return List<Object>
	 */
	public List<Object> findColByHqlQuery(String hql, Object[] objs);
	
	/**
	 * 根据hql语句查找某些列,返回List<String[]>类型,支持分页
	 * @param hql HQL查询语句
	 * @param start 查找记录数其实位置(从0开始)
	 * @param reCount  要返回的记录数(页显示记录数)
	 * @return List<Object[]>
	 */
	public List<Object[]> findColsByHqlQuerySupportPaging(String hql, int start, int reCount);
	
	/**
	 * 根据hql语句查找某些列,返回List<String[]>类型,支持分页
	 * @param hql HQL查询语句
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @param types  查询参数类型数组,按顺序对应objs中的参数类型
	 * 			注:参数必须是Hibernate类型的,比如String对应Hibernate.STRING,boolean对应Hibernate.BOOLEAN等
	 * @param start 查找记录数其实位置(从0开始)
	 * @param reCount  要返回的记录数(页显示记录数)
	 * @return List<Object[]>
	 */
	public List<Object[]> findColsByHqlQuerySupportPaging(String hql, Object[] objs,
			Type[] types, int start, int reCount);
	
	/**
	 * 根据hql语句查找,获得记录数
	 * 例如:select count(*) from T
	 * @param hql HQL查询语句
	 * @return long
	 */
	public long getRecordCountByHqlQuery(String hql) ;
	
	/**
	 * 根据hql语句查找,获得记录数
	 * 例如:select count(*) from T where ...
	 * @param hql HQL查询语句
	 * @param obj 查询参数,匹配站位符?
	 * @return long
	 */
	public long getRecordCountByHqlQuery(String hql, Object obj) ;
	
	/**
	 * 根据hql语句查找,获得记录数
	 * 例如:select count(*) from T where ...
	 * @param hql
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @return long
	 */
	public long getRecordCountByHqlQuery(String hql, Object[] objs) ;
	
	/**
	 * 执行更新update/删除delete操作
	 * @param hql
	 * @return int 更新数量/删除数量
	 */
	public int executeHqlQuery(String hql) ;
	
	/**
	 * 执行更新update/删除delete操作
	 * @param hql
	 * @param obj 查询参数,匹配站位符?
	 * @return int 更新数量/删除数量
	 */
	public int executeHqlQuery(String hql, Object obj);
	
	/**
	 * 执行更新update/删除delete操作
	 * @param hql
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @return int 更新数量/删除数量
	 */
	public int executeHqlQuery(String hql, Object[] objs) ;
	
	/**
	 * 根据hql语句查找T,返回List<T>类型,支持分页
	 * @param hql HQL查询语句
	 * @param start 查找记录数其实位置(从0开始)
	 * @param reCount  要返回的记录数(页显示记录数)
	 * @return  List<T>
	 */
	public List<T> findEntityByHqlQuerySupportPaging(String hql, 
			int start, int reCount); 
	
	/**
	 * 根据hql语句查找T,返回List<T>类型,支持分页
	 * @param hql HQL查询语句
	 * @param objs 查询参数数组,按顺序匹配站位符?
	 * @param types  查询参数类型数组,按顺序对应objs中的参数类型
	 * 			注:参数必须是Hibernate类型的,比如String对应Hibernate.STRING,boolean对应Hibernate.BOOLEAN等
	 * @param start 查找记录数其实位置(从0开始)
	 * @param reCount  要返回的记录数(页显示记录数)
	 * @return List<T>
	 */
	public List<T> findEntityByHqlQuerySupportPaging(String hql, Object[] objs,
			Type[] types, int start, int reCount) ;
	
	/**
	 * 支持SQL查询,根据sql语句查找某些列,返回List<String[]>类型
	 * @param sql SQL查询语句
	 * @return List<Object[]>
	 */
	public List<Object[]> findColsBySqlQuery(String sql) ;
	
	/**
	 * 支持SQL查询,根据sql语句查找某列,返回List<Object>类型
	 * @param sql SQL查询语句
	 * @return List<Object>
	 */
	public List<Object> findColBySqlQuery(String sql) ;
	
	/**
	 * 支持SQL操作,执行sql语句update/delete/存储过程
	 * @param sql SQL语句
	 * @return int
	 */
	public int executeSqlQuery(String sql) ;
	
}


1 请登录后投票
   发表时间:2010-03-30  
楼主用什么画的图哦?
0 请登录后投票
   发表时间:2010-03-30  
fancyboy2050 写道
楼主用什么画的图哦?

用的是violet UML Editor,看附件吧!
  • uml.jar (1.7 MB)
  • 下载次数: 50
0 请登录后投票
   发表时间:2010-03-31  
LZ 的接口规定 考虑的很 全面 ,我大概看了一下 ,但是我没有仔细用 ,不知道能不能经得起需求的考验!
0 请登录后投票
   发表时间:2010-04-01  
JavaLanguageFun 写道
LZ 的接口规定 考虑的很 全面 ,我大概看了一下 ,但是我没有仔细用 ,不知道能不能经得起需求的考验!

这个我已经在项目中实践过了,基本上是可以满足需求的。
0 请登录后投票
论坛首页 Java企业应用版

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