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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

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

有一張字段足夠多的表,要對(duì)它進(jìn)行各種各樣的查詢:

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

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

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

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

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

Dao中需要什么參數(shù) Service就傳入啥。不需要很長的入?yún)⒘斜?#xff0c;構(gòu)建一個(gè)queryparam對(duì)象即可。

用mybatis吧,自動(dòng)生成的dao完全滿足

dao層是持久層,是對(duì)數(shù)據(jù)庫的增刪改查,service是服務(wù)層,是從業(yè)務(wù)的角度去考慮方法的定義!比如一個(gè)service層的方法叫下訂單,這個(gè)方法就涉及到好幾個(gè)dao層的方法!

Spring JPA把數(shù)據(jù)庫操作這一層叫做repostory咯,注解也是repostory嘛。接口定義了常用的curd方法。

Hibernate的QBC一定能滿足你的需要~

這里給你個(gè)例子:

//B2C商城中根據(jù)商品標(biāo)題模糊查詢商品

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ù)商品標(biāo)題模糊查詢

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()方法是繼承了一個(gè)BaseDao類,以下是實(shí)現(xiàn):

/**

* QBC形式分頁查詢

* @param criteria 查詢條件對(duì)象

* @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)容還不錯(cuò),歡迎將生活随笔推薦給好友。

歡迎分享!

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

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