傳統做法為每個實體編寫 UserDao、NewsDao 等,導致大量樣板代碼。採用泛型 EntityDao<T, PK> 統一實現,Service 層直接注入使用。
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);
}
MyHibernateDaoSupport(封裝 HibernateTemplate)。HibernateCallback 執行原生 Session 操作(Criteria、Query)。Criterion... criterions)、排序、分頁。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);
}
}