java web dao_JavaWeb项目,DAO应该怎么写?
有一張字段足夠多的表,要對它進行各種各樣的查詢:
根據(jù)字段A根據(jù)字段B,或者根據(jù)字段A和B,或者再加上字段C,然后可能還要加上分頁,排序等等的邏輯。
現(xiàn)在的項目的DAO層為了滿足上面這些需要出現(xiàn)了很多參數(shù)列表很長的方法,神煩不已。
最初想到的是類似Hibernate的QBE方式,傳給DAO一個實體類對象,但是一個實體類對象不能描述“范圍”,更不用說用到IN的查詢。
后來想到抽象出一種“查詢”類,封裝一些查詢條件。個人感覺這個解決方案可行,但是遇到了很多問題,比如可能會把表結構直接暴露給Service,對于一些特別復雜的查詢難以描述出來等等。
那么問題來了,DAO應該怎么寫,或者說,Service應該傳給DAO什么?
Dao中需要什么參數(shù) Service就傳入啥。不需要很長的入?yún)⒘斜?#xff0c;構建一個queryparam對象即可。
用mybatis吧,自動生成的dao完全滿足
dao層是持久層,是對數(shù)據(jù)庫的增刪改查,service是服務層,是從業(yè)務的角度去考慮方法的定義!比如一個service層的方法叫下訂單,這個方法就涉及到好幾個dao層的方法!
Spring JPA把數(shù)據(jù)庫操作這一層叫做repostory咯,注解也是repostory嘛。接口定義了常用的curd方法。
Hibernate的QBC一定能滿足你的需要~
這里給你個例子:
//B2C商城中根據(jù)商品標題模糊查詢商品
public List<Goods> findByTitle(String title, int pageIndex, int orderType) {
try {
Criteria criteria = this.currentSession().createCriteria(Goods.class);
// 是否只顯示已發(fā)布商品
if (this.onlyShowEnabled) {
criteria.add(Restrictions.eq("enabled", true));
}
// 根據(jù)商品標題模糊查詢
criteria.add(Restrictions.like("title", "%" + title + "%"));
// 選擇排序方式
criteria = this.order(criteria, orderType);
// 分頁處理
List<Goods> list = super.page(criteria, pageIndex);
return list;
} catch(Exception e) {
System.out.println("GoodsDao >> findByTitle >> " + e);
return null;
}
}
//不同的排序方式
private Criteria order(Criteria criteria, int orderType) throws Exception {
if (orderType == IGoodsDao.ORDER_TYPE_LATEST) {
return criteria.addOrder(org.hibernate.criterion.Order.desc("publishDate"));
} else if (orderType == IGoodsDao.ORDER_TYPE_PRICE_HIGHEST) {
return criteria.addOrder(org.hibernate.criterion.Order.desc("maxPrice"));
} else if (orderType == IGoodsDao.ORDER_TYPE_PRICE_LOWEST) {
return criteria.addOrder(org.hibernate.criterion.Order.asc("minPrice"));
} else if (orderType == IGoodsDao.ORDER_TYPE_HOTTEST) {
return criteria.addOrder(org.hibernate.criterion.Order.desc("purchaseOrderNum"));
} else {
throw new Exception("不支持該排序類型");
}
}
至于super.page()方法是繼承了一個BaseDao類,以下是實現(xiàn):
/**
* QBC形式分頁查詢
* @param criteria 查詢條件對象
* @param pageIndex 頁碼
* @param pageSize 頁面大小
* @return 分頁查詢的結果
* @throws HibernateException
*/
protected <T> List<T> page(Criteria criteria, int pageIndex, int pageSize) throws HibernateException {
@SuppressWarnings("unchecked")
List<T> list = criteria.setFirstResult(pageSize * pageIndex)
.setMaxResults(pageSize).list();
return list;
}
總結
以上是生活随笔為你收集整理的java web dao_JavaWeb项目,DAO应该怎么写?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉字转16进制java_java实现汉字
- 下一篇: java编写一个通讯录_java写的通讯