日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java web dao_JavaWeb项目,DAO应该怎么写?

發(fā)布時間:2023/11/27 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java web dao_JavaWeb项目,DAO应该怎么写? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

有一張字段足夠多的表,要對它進行各種各樣的查詢:

根據(jù)字段A根據(jù)字段B,或者根據(jù)字段A和B,或者再加上字段C,然后可能還要加上分頁,排序等等的邏輯。

現(xiàn)在的項目的DAO層為了滿足上面這些需要出現(xiàn)了很多參數(shù)列表很長的方法,神煩不已。

最初想到的是類似Hibernate的QBE方式,傳給DAO一個實體類對象,但是一個實體類對象不能描述“范圍”,更不用說用到IN的查詢。

后來想到抽象出一種“查詢”類,封裝一些查詢條件。個人感覺這個解決方案可行,但是遇到了很多問題,比如可能會把表結(jié)構(gòu)直接暴露給Service,對于一些特別復雜的查詢難以描述出來等等。

那么問題來了,DAO應該怎么寫,或者說,Service應該傳給DAO什么?

Dao中需要什么參數(shù) Service就傳入啥。不需要很長的入?yún)⒘斜?#xff0c;構(gòu)建一個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 分頁查詢的結(jié)果

* @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;

}

總結(jié)

以上是生活随笔為你收集整理的java web dao_JavaWeb项目,DAO应该怎么写?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:java web dao_JavaWeb项目,DAO应该怎么