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

博客探讨了在面临大量复杂查询需求时,DAO层如何设计以避免长参数列表的问题。提出了创建查询类来封装查询条件的解决方案,但遇到了表结构暴露和服务层描述复杂查询的挑战。讨论了Hibernate的QBC方式以及使用MyBatis和SpringJPA的解决方案,强调了DAO层应关注持久化操作,而Service层则应从业务角度定义方法。
摘要由CSDN通过智能技术生成

有一张字段足够多的表,要对它进行各种各样的查询:

根据字段A根据字段B,或者根据字段A和B,或者再加上字段C,然后可能还要加上分页,排序等等的逻辑。

现在的项目的DAO层为了满足上面这些需要出现了很多参数列表很长的方法,神烦不已。

最初想到的是类似Hibernate的QBE方式,传给DAO一个实体类对象,但是一个实体类对象不能描述“范围”,更不用说用到IN的查询。

后来想到抽象出一种“查询”类,封装一些查询条件。个人感觉这个解决方案可行,但是遇到了很多问题,比如可能会把表结构直接暴露给Service,对于一些特别复杂的查询难以描述出来等等。

那么问题来了,DAO应该怎么写,或者说,Service应该传给DAO什么?

Dao中需要什么参数 Service就传入啥。不需要很长的入参列表,构建一个queryparam对象即可。

用mybatis吧,自动生成的dao完全满足

dao层是持久层,是对数据库的增删改查,service是服务层,是从业务的角度去考虑方法的定义!比如一个service层的方法叫下订单,这个方法就涉及到好几个dao层的方法!

Spring JPA把数据库操作这一层叫做repostory咯,注解也是repostory嘛。接口定义了常用的curd方法。

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

这里给你个例子:

//B2C商城中根据商品标题模糊查询商品

public List<Goods> findByTitle(String title, int pageIndex, int orderType) {

try {

Criteria criteria = this.currentSession().createCriteria(Goods.class);

// 是否只显示已发布商品

if (this.onlyShowEnabled) {

criteria.add(Restrictions.eq("enabled", true));

}

// 根据商品标题模糊查询

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类,以下是实现:

/**

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值