【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

相关文章

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb