【SSH项目实战】国税协同平台-24.条件查询分析与实现

2023-11-03 01:18

本文主要是介绍【SSH项目实战】国税协同平台-24.条件查询分析与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们之前做好了信息发布管理这一块的功能

这次我们就以这个模块为例,去为其添加查询和分页功能。

我们先从查询功能做起:
条件查询(QueryHelper):

1、查询条件语句hql:
from 子句:必定出现;而且只出现一次
where 子句:可选;但关键字where 出现一次;可添加多个查询条件
order by子句:可选;但关键字order by 出现一次;可添加多个排序属性

2、查询条件值集合:
出现时机:在添加查询条件的时候,?对应的查询条件值

例子:
[sql]  view plain copy
  1. FROM Info   
  2. WHERE title like ? and state = ?   
  3. order by createTime,state  

于是我们为了满足以后所有拥有查询功能的模块来编写查询类,我们在BaseDao(接口和实现类)中添加下面方法:
BaseDao接口中添加
[java]  view plain copy
  1. //条件查询  
  2. public List<T> findObjects(String hql, List<Object> parameters);  

BaseDaoImpl实现类中添加实现方法:
[java]  view plain copy
  1. @Override  
  2. public List<T> findObjects(String hql,List<Object> parameters) {  
  3.     Query query=getSession().createQuery(hql);  
  4.     //添加查询条件  
  5.     if(parameters!=null){  
  6.         for (int i = 0; i < parameters.size(); i++) {  
  7.             query.setParameter(i, parameters.get(i));  
  8.         }  
  9.     }  
  10.     return query.list();  
  11. }  

然后我们在基础Service层中引用它,我们在BaseService(接口和实现类)中添加下面方法:
BaseService接口中添加
[java]  view plain copy
  1. //条件查询  
  2. public List<T> findObjects(String hql, List<Object> parameters);  

BaseServiceImpl实现类中添加实现方法:
[java]  view plain copy
  1. @Override  
  2. public List<T> findObjects(String hql, List<Object> parameters) {  
  3.     return baseDao.findObjects(hql, parameters);  
  4. }  

然后我们要修改我们的信息发布的Action中的listUI方法,因为我们一旦添加了分类查询方法,必然需要看看跳转到此界面是查询所有还是按条件查询,也就是判断一下有无条件值的存在,如果存在,说明用户是要获取查询后的列表,我们根据查询条件组织hql语句进行查询:
[java]  view plain copy
  1. //列表页面  
  2. public String listUI() throws Exception{  
  3.     try {  
  4.         //加载分类集合  
  5.         ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);  
  6.         String hql="FROM Info i ";  
  7.         List<Object> parameters=new ArrayList<Object>();  
  8.         if(info != null){  
  9.             if(StringUtils.isNotBlank(info.getTitle())){  
  10.                 hql+="WHERE i.title like ?";  
  11.                 //加“%”进行模糊查询  
  12.                 parameters.add("%"+info.getTitle()+"%");  
  13.             }  
  14.         }  
  15.         //根据创建时间降序排序  
  16.         hql+="ORDER BY i.createTime DESC";  
  17.         infoList=infoService.findObjects(hql,parameters);  
  18.     } catch (Exception e) {  
  19.         throw new Exception(e.getMessage());  
  20.     }  
  21.     return "listUI";  
  22. }  

在信息发布管理列表的jsp界面,我们点击“搜索”按钮时执行的是的js方法:
[html]  view plain copy
  1. <li>  
  2. 信息标题:<s:textfield name="info.title" cssClass="s_text" id="infoTitle"  cssStyle="width:160px;"/>  
  3. </li>  
  4. <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li>  

我们来编写doSearch()这个方法:
[javascript]  view plain copy
  1. function doSearch(){  
  2.     document.forms[0].action = "${basePath}tax/info_listUI.action";  
  3.         document.forms[0].submit();  
  4. }  


我们测试一下:
我们一共有“图片上传测试”和“测试1”这两个文章,我们首先搜索“图片”关键字,然后出现如下结果:


然后我们搜索“测试”关键字,发现成功得到相关的文章:


因为我们可能还有多种查询条件,所以我们要对listUI方法进行修改,使之能够接受更多的参数去查询:
[java]  view plain copy
  1. //列表页面  
  2. public String listUI() throws Exception{  
  3.     try {  
  4.         //加载分类集合  
  5.         ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);  
  6.         String hql="FROM Info i";  
  7.         List<Object> parameters=new ArrayList<Object>();  
  8.         if(info != null){  
  9.             if(StringUtils.isNotBlank(info.getTitle())){  
  10.                 hql+=" WHERE i.title like ?";  
  11.                 //加“%”进行模糊查询  
  12.                 parameters.add("%"+info.getTitle()+"%");  
  13.             }  
  14.             if(StringUtils.isNotBlank(info.getState())){  
  15.                 hql+=" AND i.state = ?";  
  16.                 //加“%”进行模糊查询  
  17.                 parameters.add("%"+info.getState()+"%");  
  18.             }  
  19.         }  
  20.         //根据创建时间降序排序  
  21.         hql+=" ORDER BY i.createTime DESC";  
  22.         infoList=infoService.findObjects(hql,parameters);  
  23.     } catch (Exception e) {  
  24.         throw new Exception(e.getMessage());  
  25.     }  
  26.     return "listUI";  
  27. }  

但是大家是不是感觉代码有些冗余?我们应该把像拼接hql语句这种容易处出错误且重复率极高的代码封装成一个工具类。
我们这里把hql语句的条件拼接封装成了一个工具类,名叫"QueryHelper":
[java]  view plain copy
  1. package cn.edu.hpu.tax.core.util;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class QueryHelper {  
  7.       
  8.     //from子句  
  9.     private String fromClause="";  
  10.     //where子句  
  11.     private String whereClause="";  
  12.     //oeder by子句  
  13.     private String orderByClause="";  
  14.       
  15.     private List<Object> parameters;  
  16.     //排序属性  
  17.     public static String ORDER_BY_DESC="DESC";//降序  
  18.     public static String ORDER_BY_ASC="ASC";//升序  
  19.       
  20.   
  21.   
  22.     /** 
  23.      * 构造from子句 
  24.      * @param clazz实体类 
  25.      * @param alias实体类对应的别名 
  26.      * */  
  27.     public QueryHelper(Class clazz,String alias){  
  28.         fromClause="FROM "+clazz.getSimpleName()+" "+alias;  
  29.     }  
  30.     /** 
  31.      * 构造where子句 
  32.      * @param condition查询条件语句:例如i.title like ? 
  33.      * @param params 查询条件语句中?对应的查询条件值,例如:%标题% 
  34.      * */  
  35.     public void addCondition(String condition,Object... params){  
  36.         if(whereClause.length()>1){//非第一个查询条件  
  37.             whereClause+=" AND "+condition;  
  38.         }else{//第一个查询条件  
  39.             whereClause+=" WHERE "+condition;  
  40.         }  
  41.           
  42.           
  43.         //设置查询条件值到查询条件值集合中  
  44.         if(parameters == null){  
  45.             parameters=new ArrayList<Object>();  
  46.         }  
  47.         if(params != null){  
  48.             for(Object param:params){  
  49.                 parameters.add(param);  
  50.             }  
  51.         }  
  52.     }  
  53.       
  54.     /** 
  55.      * 构造order by子句 
  56.      * @param property 查询条件语句:例如: 
  57.      * @param order 
  58.      * */  
  59.     public void addOrderByProperty(String property,String order){  
  60.         if(orderByClause.length()>1){//非第一个排序属性  
  61.             orderByClause+=","+property+" "+order;  
  62.         }else{//第一个排序属性  
  63.             orderByClause+=" ORDER BY "+property +" "+order;  
  64.         }  
  65.     }  
  66.       
  67.     //查询hql语句  
  68.     public String getQueryListHql(){  
  69.         return fromClause+whereClause+orderByClause;  
  70.     }  
  71.     //查询hql语句中?对应的查询条件集合  
  72.     public List<Object> getParameters(){  
  73.         return parameters;  
  74.     }  
  75. }  

我们在我们刚刚的listUI方法中使用这个工具类:
[java]  view plain copy
  1. //列表页面  
  2. public String listUI() throws Exception{  
  3.     try {  
  4.         //加载分类集合  
  5.         ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);  
  6.         QueryHelper queryHelper=new QueryHelper(Info.class,"i");  
  7.         if(info != null){  
  8.             if(StringUtils.isNotBlank(info.getTitle())){  
  9.                 queryHelper.addCondition("i.title like ?""%"+info.getTitle()+"%");  
  10.             }  
  11.             queryHelper.addCondition("i.state = ?""1");  
  12.         }  
  13.         //根据创建时间降序排序  
  14.         queryHelper.addOrderByProperty("i.createTime", queryHelper.ORDER_BY_DESC);  
  15.         infoList=infoService.findObjects(queryHelper);  
  16.     } catch (Exception e) {  
  17.         throw new Exception(e.getMessage());  
  18.     }  
  19.     return "listUI";  
  20. }  

可以看到我们的findObjects现在只接收queryHelper这一个参数了,我们在BaseService中再添加一个只包含queryHelper参数的findObjects方法。
[java]  view plain copy
  1. package cn.edu.hpu.tax.core.service;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import cn.edu.hpu.tax.core.util.QueryHelper;  
  7. import cn.edu.hpu.tax.info.entity.Info;  
  8.   
  9. public interface BaseService<T> {  
  10.       
  11.     //新增  
  12.     public void save(T entity);  
  13.     //更新  
  14.     public void update(T enetity);  
  15.     //根据id删除  
  16.     public void delete(Serializable id);  
  17.     //根据id查找  
  18.     public T findObjectById(Serializable id);  
  19.     //查找列表  
  20.     public List<T> findObjects();  
  21.     //条件查询  
  22.     @Deprecated //不推荐使用  
  23.     public List<T> findObjects(String hql, List<Object> parameters);  
  24.     //使用工具类的条件查询  
  25.     public List<T> findObjects(QueryHelper queryHelper);  
  26. }  

BaseServiceImpl中实现这个方法:
[java]  view plain copy
  1. @Override  
  2. public List<T> findObjects(QueryHelper queryHelper) {  
  3.     // TODO Auto-generated method stub  
  4.     return baseDao.findObjects(queryHelper);  
  5. }  

然后我们在Dao中也实现这个方法:
[java]  view plain copy
  1. package cn.edu.hpu.tax.core.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import cn.edu.hpu.tax.core.util.QueryHelper;  
  7. import cn.edu.hpu.tax.info.entity.Info;  
  8.   
  9. public interface BaseDao<T> {  
  10.       
  11.     //新增  
  12.     public void save(T entity);  
  13.     //更新  
  14.     public void update(T enetity);  
  15.     //根据id删除  
  16.     public void delete(Serializable id);  
  17.     //根据id查找  
  18.     public T findObjectById(Serializable id);  
  19.     //查找列表  
  20.     public List<T> findObjects();  
  21.     //条件查询  
  22.     public List<T> findObjects(String hql, List<Object> parameters);  
  23.     //使用工具类的条件查询  
  24.     public List<T> findObjects(QueryHelper queryHelper);  
  25. }  

BaseDaoImpl中实现这个方法:
[java]  view plain copy
  1. @Override  
  2. public List<T> findObjects(QueryHelper queryHelper) {  
  3.     Query query=getSession().createQuery(queryHelper.getQueryListHql());  
  4.     List<Object> parameters=queryHelper.getParameters();  
  5.     //添加查询条件  
  6.     if(parameters!=null){  
  7.         for (int i = 0; i < parameters.size(); i++) {  
  8.             query.setParameter(i, parameters.get(i));  
  9.         }  
  10.     }  
  11.     return query.list();  
  12. }  

然后我们测试一下,搜索“测试”关键字,结果:

证明我们的分类助手工具类编写没有问题,至此我们的分类查询暂时编写完毕。

这篇关于【SSH项目实战】国税协同平台-24.条件查询分析与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334563

相关文章

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键