首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring + Hibernate 通用 DAO 基類實現:消除重複 CRUD 代碼

     編輯:Java 相關知識

設計動機

傳統做法為每個實體編寫 UserDao、NewsDao 等,導致大量樣板代碼。採用泛型 EntityDao<T, PK> 統一實現,Service 層直接注入使用。

核心介面 EntityDao

public interface EntityDao<T, PK extends Serializable> {
    void saveOrUpdate(T t);
    void update(String hql, Object... params);
    void delete(T t);
    void delete(Class<T> entityClass, PK id);
    T get(Class<T> entityClass, PK id);
    List<T> findAll(Class<T> entityClass, String propertyName, boolean isAsc, Criterion... criterions);
    List<T> findByCriteria(Class<T> entityClass, String propertyName, boolean isAsc,
                           int firstResult, int maxResults, Criterion... criterions);
    int findCountsByCriteria(Class<T> entityClass, Criterion... criterions);
    Pager<T> findForPager(Class<T> entityClass, String propertyName, boolean isAsc,
                           int firstResult, int maxResults, Criterion... criterions);
    List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);
    T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value);
    boolean isPropertyExist(Class<T> entityClass, String propertyName, Object value);
    T findUniqueByHql(String hql, Object... params);
    List<T> findByHql(String hql, Object... params);
    Pager<T> findForPagerByHql(int firstResult, int maxResults, String hql, Object... params);
}

實現類 EntityDaoImpl 關鍵點

  • 繼承 MyHibernateDaoSupport(封裝 HibernateTemplate)。
  • 使用 HibernateCallback 執行原生 Session 操作(Criteria、Query)。
  • 支援動態條件(Criterion... criterions)、排序、分頁。
  • 提供 HQL 與 Criteria 兩套查詢 API,滿足不同複雜度需求。
  • 內建 Pager<T> 封裝分頁結果(totalCounts + entityList)。

典型用法示例

@Service
public class UserService {
    @Autowired private EntityDao<User, Long> userDao;

    public Pager<User> listUsers(int pageNo, int pageSize, String keyword) {
        Criterion c = Restrictions.like("name", "%" + keyword + "%");
        return userDao.findForPager(User.class, "id", true,
                (pageNo - 1) * pageSize, pageSize, c);
    }

    public User login(String username, String password) {
        return userDao.findUniqueByHql(
            "from User where username=? and password=?", username, password);
    }
}

優勢總結

  1. 減少 80%+ DAO 代碼量。
  2. 統一異常處理、事務邊界(由 Spring 管理)。
  3. 新增實體零代碼即可獲得完整 CRUD 能力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved