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

根据字段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;

}

java web dao_JavaWeb项目,DAO应该怎么写?相关推荐

  1. Java Web入门项目之“网络交友”的设计与实现

    前言:这个小项目是我刚学习JSP时,参考"JSP程序设计"这本书写的.这里之所以说参考这本书而不是照着这本书写,主要是因为我自己完成的时候删掉了不少繁琐的写法(比如:文件上传):同 ...

  2. Java web小项目_个人主页(1)—— 云环境搭建与项目部署

    摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...

  3. 【暑假学习笔记】之——用Intellij idea新建一个java web+Servlet项目(有实例)——idea中快速重写父类的方法

    Intellij idea中快速重写父类方法 在写java文件时,有时候需要重写父类方法,但在idea中创建java文件时并不会像eclipse一样可以选择父类,但是重写父类方法其实只需要这样做: 鼠 ...

  4. java/web/springboot项目使用WebSocket消息推送

    java/web/springboot项目使用WebSocket消息推送 最近项目中,有消息推送的广播和在线咨询的功能,以前也没搞过啊,有些小伙伴估计也是,那肯定要赶紧学习起来啊~ 不说废话,今天就告 ...

  5. java web学习项目20套源码完整版

    java web学习项目20套源码完整版 自己收集的各行各业的都有,这一套源码吃遍所有作业项目! 1.BBS论坛系统(jsp+sql) 2.ERP管理系统(jsp+servlet) 3.OA办公自动化 ...

  6. Java web小项目_个人主页(2)—— 边缘加速原理与实现

    摘自:Java web小项目_个人主页(2)-- 边缘加速原理与实现 作者:丶PURSUING 发布时间: 2021-03-27 14:44:40 网址:https://blog.csdn.net/w ...

  7. 分享java web 期末项目实验源码20套,BBS论坛,ERP管理系统,OA自动化等等

    分享java web 期末项目实验源码20套,BBS论坛,ERP管理系统,OA自动化等等 我自己也从里面学习到了很多东西! 1.BBS论坛系统(jsp+sql) 2.ERP管理系统(jsp+servl ...

  8. java web银行项目

    java web银行项目 一.项目简介 ​ 本项目是基于idea,后台实现的技术:jsp,servlet,前端开发技术:javascript.css.bootstrap本项目主要实现一个模拟ATM机存 ...

  9. IntelliJ IDEA 创建 hello world Java web Maven项目从头到尾都有图有真相2017版本

    IntelliJ IDEA使用教程 (总目录篇) 学Java的大部分吧都是要整Java web开发项目的,那么最好用的编辑器估计就是这个 IntelliJ IDEA,然后现在maven管理项目是很流行 ...

最新文章

  1. maven超级pom内容
  2. 系列笔记 | 深度学习连载(2):梯度下降
  3. JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed
  4. python中的log模块笔记
  5. mysql5.7免安版配置_mysql5.7免安装版配置
  6. El 表达式、jstl学习
  7. mysql 表中中文不显示
  8. 格子玻尔兹曼机(Lattice Boltzmann Method)系列5:LBM多相流实例之Shan-Chen模型
  9. python环境下数据操作_数据分析环境搭建和Python基础知识
  10. 建模学习—带你轻松认识并掌握3Dmax
  11. C语言习题练习2——被5整除问题
  12. 数电仿真实验-数字钟的设计
  13. 使用环信进行即时通信IM
  14. PYTHON使用arcpy出现“Error 000824: The tool is not licensed”
  15. 计算机仿真三个基本活动,计算机仿真-Read.ppt
  16. Java异常处理的普遍误解
  17. DDS协议与OPCUA对比
  18. 安卓开发 科学计算器
  19. 100kW光伏并网发电系统MATLAB仿真模型。 采用“增量电导+积分调节器”技术的MPPT控制器
  20. No such file or directory #include <QX11Info>

热门文章

  1. 蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路
  2. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)
  3. python基础===拆分字符串,和拼接字符串
  4. 亿级PV请求的三种负载均衡技术
  5. Centos中文输入法安装以及切换
  6. SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全
  7. 网络配置文件、命令详解
  8. MOS管体二极管的作用
  9. 概率图论PGM的D-Separation(D分离)
  10. ×××作,不知写些什么