首先說明,這個東西最開始是我從網上找到的,但是不記得在那里找到的了。只是覺得非常有用,所以就根據我的需要做了修改,放在了這里,當作一個備忘錄吧。
這個是接口:

/**   
 *
@author Fred   
 * Jun 25, 2007 5:52:47 PM   
 */
   
public interface BaseDao<T>{   
  
    
/**   
     * 根據對象ID來查詢對象。   
     *
@param id 對象ID。   
     *
@return 如果找到對應的對象,則返回該對象。如果不能找到,則返回null。   
     */
   
    
public T findById(Long id);       
      
    
/**   
     * 查詢所有的指定對象。   
     */
       
    
public List listAll();       
        
    
/**   
     * 查詢,并指定起始的紀錄和最大的查詢結果集大小以及需要排序的屬性和排序的方向。   
     *
@param startPos 起始紀錄的序號。   
     *
@param amount 最大的查詢結果集大小。   
     *
@param conditions 一個以屬性名為key,以屬性值為value的Map   
     *
@param sortableProperty 需要排序的屬性。   
     *
@param desc 排序的方向。   
     *
@return 結果集。   
     */
   
    
public List listAndSort(int startPos, int amount, Map conditions, String sortableProperty, boolean asc);   
  
    
/**   
     * 統計當前的總紀錄數.   
     */
   
    
public Long countTotalAmount();   
        
    
/**   
     * 持久化指定的對象。   
     *
@param entity 將要持久化的對象。   
     *
@return 持久化以后的對象。   
     */
   
    
public T save(T entity);     
        
    
/**   
     * 在數據庫中刪除指定的對象。該對象必須具有對象ID。   
     *
@param entity 將要被刪除的對象。   
     */
   
    
public void delete(T entity);   
        
    
/**   
     * 更新給定的對象。   
     *
@param entity 含有將要被更新內容的對象。   
     *
@return 更新后的對象。   
     */
   
    
public T update(T entity);   
  
    
/**   
     * 獲取標志是否被刪除的標志字段。如果是直接刪除,返回 null   
     */
   
    
public String getDeleteToken();   
}

然后是其實現類:

/**   
 * 范型化的BaseDao的實現,作為其他實際被Service層調用的Dao實現的基類。   
 *
@author Fred   
 * Jun 25, 2007 5:56:38 PM   
 */
   
public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {   
  
    
private Class persistentClass;     
        
    
protected static final String DEFAULT_INDEIRECTLY_DELETE_TOKEN = "disused";   
        
    
/**   
     *
@return the persistentClass   
     */
   
    
public Class getPersistentClass() {   
        
return this.persistentClass;   
    
}   
        
    
/**   
     * 默認構造函數,用于獲取范型T的帶有類型化信息的Class對象   
     */
   
    @
SuppressWarnings("unchecked")   
    
public BaseDaoImpl() {   
        
this.persistentClass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];     
    
}   
        
    @
SuppressWarnings("unchecked")   
    
public T findById(Long id) {   
        
return (T) this.getHibernateTemplate().get(this.getPersistentClass(), id);   
    
}   
  
    
public List listAll() {   
        
return this.findByCriteria();   
    
}   
        
    @
Override   
    
public List listAndSort(int startPos, int amount, Map conditions, String sortableProperty,   
            
boolean asc) {   
        
return this.listAndSort(this.getPersistentClass(), startPos, amount, conditions, sortableProperty, asc, false);   
    
}   
        
    @
Override   
    
public Long countTotalAmount() {   
        
StringBuilder hql = new StringBuilder()   
        .
append("select count(obj.id) from ")   
        .
append(BaseDaoImpl.this.getPersistentClass().getSimpleName())   
        .
append(" obj ");   
        
if (BaseDaoImpl.this.getDeleteToken() != null) {   
            
hql.append("where obj.")   
               .
append(BaseDaoImpl.this.getDeleteToken())   
               .
append(" = false");   
        
}   
        
final String hqlString = hql.toString();     
        
return (Long) this.getHibernateTemplate().execute(new HibernateCallback() {   
            @
Override   
            
public Object doInHibernate(Session session) throws HibernateException, SQLException {   
                
Query query = session.createQuery(hqlString.toString());   
                
return query.uniqueResult();   
            
}   
        
});   
    
}   
  
    
public T save(T entity) {   
        
this.getHibernateTemplate().saveOrUpdate(entity);       
        
return entity;       
    
}   
        
    
public T update(T entity) {   
        
this.getHibernateTemplate().update(entity);       
        
return entity;       
    
}   
        
    
public void delete(T entity) {   
        
this.getHibernateTemplate().delete(entity);     
    
}   
  
    @
SuppressWarnings("unchecked")       
    
protected List findByCriteria(Criterion... criterion) {       
        
DetachedCriteria detachedCrit = DetachedCriteria       
                .
forClass(getPersistentClass());       
        
for (Criterion c : criterion) {       
            
detachedCrit.add(c);       
        
}       
        
return getHibernateTemplate().findByCriteria(detachedCrit);       
    
}     
        
    
/**   
     * 查詢,并指定起始的紀錄和最大的查詢結果集大小以及需要排序的屬性和排序的方向。   
     *
@param clazz 要被查詢的對象對應的Class。   
     *
@param startPos 起始紀錄的序號。   
     *
@param amount 最大的查詢結果集大小。   
     *
@param conditions 一個以屬性名為key,以屬性值為value的Map   
     *
@param sortableProperty 需要排序的屬性。   
     *
@param desc 排序的方向。   
     *
@return 結果集。   
     */
   
    @
SuppressWarnings("unchecked")   
    
protected List listAndSort(Class clazz, final int startPos, final int amount,     
            
final Map conditions, String sortableProperty, boolean asc, boolean getDisused) {   
            
        
boolean hasCondition = false;   
            
        
StringBuilder hql = new StringBuilder().append("from ").append(clazz.getSimpleName()).append(" obj ");   
            
        
//是否查詢被刪掉的   
        
if (this.getDeleteToken() != null) {   
            
hasCondition = true;   
            
hql.append("where obj.")   
               .
append(this.getDeleteToken())   
               .
append(" ");   
            
if (getDisused) {   
                
hql.append("is true ");   
            
} else {   
                
hql.append("is false ");   
            
}   
        
}   
            
        
//設置查詢條件   
        
boolean needsAnd = false;   
        
if (!conditions.isEmpty()) {   
            
if (!hasCondition) {   
                
hql.append("where ");   
            
} else {   
                
needsAnd = true;   
            
}   
        
}   
        
for (String property : conditions.keySet()) {   
            
if (needsAnd) {   
                
hql.append("and ");   
            
}   
            
hql.append("obj.").append(property).append(" = :").append(property).append(" ");   
        
}   
            
        
//排序   
        
hql.append("order by ").append(" obj.").append(sortableProperty).append(" ");   
        
if (asc) {   
            
hql.append("asc");   
        
} else {   
            
hql.append("desc");   
        
}   
            
        
//分頁   
        
final String hqlString = hql.toString();   
        
return (List) this.getHibernateTemplate().execute(new HibernateCallback() {     
            @
Override   
            
public Object doInHibernate(Session session) throws HibernateException, SQLException {   
                
Query query = session.createQuery(hqlString);   
                
query.setFirstResult(startPos);   
                
query.setMaxResults(amount);   
                    
                
//給查詢條件賦值   
                
for (String property : conditions.keySet()) {   
                    
query.setParameter(property, conditions.get(property));   
                
}   
                    
                
return query.list();   
            
}   
        
});   
    
}   
        
    @
Override   
    
public String getDeleteToken() {   
        
return null;   
    
}   
}

最后,你的實際使用的Dao就可以繼承這個基本的Dao實現,只需要添加在實際中需要的特定方法就可以了,對在基本的Dao實現中提供的方法可以直接使用,而且不用考慮類型問題。比如:

我有一個UserDao,是作對用戶對象的操作的:

接口如下:

/**   
 *
@author Fred   
 * Jun 26, 2007 12:16:47 AM   
 */
   
public interface UserDao extends BaseDao {   
        
    
/**   
     * 根據用戶ID查找用戶   
     */
   
    
public User find(String userId);   
}

實現類如下:

/**   
 *
@author Fred   
 * Jun 26, 2007 12:20:49 AM   
 */
   
public class UserDaoImpl extends BaseDaoImpl implements UserDao {   
  
    @
SuppressWarnings("unchecked")   
    
public User find(final String userId) {   
        
return (User) this.getHibernateTemplate().execute(new HibernateCallback() {   
            @
Override   
            
public Object doInHibernate(Session session)   
                    
throws HibernateException, SQLException {   
                
String hql = "from User user where user.userId = :userId";   
                
Query query = session.createQuery(hql);   
                
query.setString("userId", userId);   
                
return query.uniqueResult();   
            
}   
        
});   
    
}   
        
    @
Override   
    
public String getDeleteToken() {   
        
return "expired";   
    
}   
}

我們的這個UserDaoImpl沒有提供對

public User findById(Long id);

這樣的方法的實現,但是通過

public class UserDaoImpl extends BaseDaoImpl implements UserDao {   
    ......   
}