JavaWeb项目,DAO应该怎么写?

_TNT_
  • 5.9k

有一张字段足够多的表,要对它进行各种各样的查询:
根据字段A根据字段B,或者根据字段A和B,或者再加上字段C,然后可能还要加上分页,排序等等的逻辑。
现在的项目的DAO层为了满足上面这些需要出现了很多参数列表很长的方法,神烦不已。

最初想到的是类似Hibernate的QBE方式,传给DAO一个实体类对象,但是一个实体类对象不能描述“范围”,更不用说用到IN的查询。
后来想到抽象出一种“查询”类,封装一些查询条件。个人感觉这个解决方案可行,但是遇到了很多问题,比如可能会把表结构直接暴露给Service,对于一些特别复杂的查询难以描述出来等等。
那么问题来了,DAO应该怎么写,或者说,Service应该传给DAO什么?

回复
阅读 7.3k
5 个回答

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

原味丶苦茶
  • 3
新手上路,请多包涵

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

Kyrin
  • 0
新手上路,请多包涵

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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏