Java研学-过滤查询

一 概述

1 原理

  根据用户传入的条件进行数据的筛选查询,最后将结果放回给用户,例如对员工的姓名与工资范围进行筛选查询

// 查询所有员工
SELECT * FROM employee
// 模糊查询员工名称
SELECT * FROM employee WHERE name LIKE '%黄%'
// 查询工资为8000的员工
SELECT * FROM employee WHERE salary=8000
// 查询工资在8000-9000范围内的员工(包含)
SELECT * FROM employee WHERE salary >= 8000 AND salary <= 9000
// 模糊查询员工名称的同时对工资范围进行限定
SELECT * FROM employee WHERE name LIKE '%黄%' AND salary >= 8000 AND salary <= 9000

  SELECT * FROM employee 这部分SQL是固定的,只是WHERE子句部分在变动,这取决于用户在页面传递的查询参数,根据用户查询传递的参数,拼接WHERE条件,这就是过滤查询的底层原理。
  想实现上述需求,应定义一个类封装用户传递到后台的请求参数,使用 MyBaits的动态SQL 根据用户传递的参数在Mapper XML中拼接对应的SQL

2 数据封装 – EmployeeQueryObject

  过滤查询时,请求可能会传递多个过滤条件的参数来查询对应的数据,这些参数需在后台多个层次之间进行传递(servlet – service – dao),故将参数封装到指定的对象中便于参数传递
  编写 EmployeeQueryObject 来封装过滤查询的参数。产品查询又想支持分页查询,又想支持过滤查询,所以使用 EmployeeQueryObject 来继承 QueryObject,既可以封装分页查询的参数,又可以封装过滤查询的参数。

// EmployeeQueryObject
@Setter
@Getter
public class EmployeeQueryObject extends QueryObject{private String employeeName;private Double minSalary;//小的区间值private Double maxSalary;//大的区间值
}

二 Mybatis动态Sql

1 if 标签 – 单条件判断

// 语法
<if test="boolean 表达式"></if>// 例子 分页查询薪资于8000-9000范围内的,姓名含employeeName的员工
<!--分页查询:mybatis-->
<select id="queryForList" resultType="employee">SELECT * from employee<if test="employeeName != null">and employeeName LIKE CONCAT("%",#{employeeName},"%")</if><if test="minSalary != null ">and salary &gt;=#{minSalary}</if><if test="maxSalary != null">and salary &lt;=#{maxSalary}</if>LIMIT #{start},#{pageSize}
</select>

  当用户只模糊查询时 minSalary 与 maxSalary 没有传递,此时需要使用where标签解决SQL语法问题

2 where 标签 – 去除多余and或or关键字

// 语法
<where>条件语句</where>// 例子
<select id="queryForList" resultType="Employee">SELECT * from employee<where><if test="employeeName != null">and employeeName LIKE CONCAT("%",#{employeeName},"%")</if><if test="minSalary != null ">and salary &gt;=#{minSalary}</if><if test="maxSalary != null">and salary &lt;=#{maxSalary}</if></where>LIMIT #{start},#{pageSize}
</select>

  sql查询语句无where关键字,则在语句前插入where,若sql查询语句以and和or开头,则用where替换掉

3 Mybatis转义符

&lt;       <        小于
&gt;       >        大于
&amp;      &&apos;     '        单引号
&quot;     "        双引号

三 过滤实现

① EmployeeQueryObject

@Setter
@Getter
public class EmployeeQueryObject extends QueryObject{private String employeeName;private Double minSalary;//小的区间值private Double maxSalary;//大的区间值
}

② EmployeeMapper.xml

<!--查询总条数--><select id="queryForCount" resultType="int">SELECT count(*) from employee<include refid="where_sql"></include></select><!--分页查询:mybatis--><select id="queryForList" resultType="Employee">SELECT * from employee<include refid="where_sql"></include>LIMIT #{start},#{pageSize}</select><!--封装sql片段--><sql id="where_sql"><where><if test="employeeName != null">and employeeName LIKE CONCAT("%",#{employeeName},"%")</if><if test="minSalary != null ">and salary &gt;=#{minSalary}</if><if test="maxSalary != null">and salary &lt;=#{maxSalary}</if></where></sql>

③ list,jsp

<form action="/employee" method="post">姓名:<input type="text" name="employeeName" value="${qo.employeeName}">工资:<input type="text" name="minSalary" value="${qo.minSalary}">-<input type="text" name="maxSalary" value="${qo.maxSalary}"><input type="submit" value="查询">

④ EmployeeServlet

// 获取过滤参数封装对应QO对象中
/*分页查询所有*/
private void list(HttpServletRequest req, HttpServletResponse resp) {try {/*客户端如果传入了当前页码和每页显示条数则设置给qo对象,如果没有传入则使用默认值*/String currentPage = req.getParameter("currentPage");String pageSize = req.getParameter("pageSize");// 获取过滤参数String employeeName = req.getParameter("employeeName");String minSalary = req.getParameter("minSalary");String maxSalary = req.getParameter("maxSalary");// 继承了qo,qo有的他也有EmployeeQueryObject qo=new EmployeeQueryObject();if (StringUtil.hasLength(currentPage)){qo.setCurrentPage(Integer.valueOf(currentPage));}if (StringUtil.hasLength(pageSize)){qo.setPageSize(Integer.valueOf(pageSize));}if (StringUtil.hasLength(employeeName)){qo.setEmployeeName(employeeName);}if (StringUtil.hasLength(minSalary)){qo.setMinSalary(new Double(minSalary));}if (StringUtil.hasLength(maxSalary)){qo.setMaxSalary(new Double(maxSalary));}//调用service分页查询的方法PageResult<Employee> pageResult = employeeService.queryByPage(qo);//将查询的结果存储到请求作用域req.setAttribute("pageResult",pageResult);// 查询条件回显req.setAttribute("qo",qo);//转发到列表页面req.getRequestDispatcher("/WEB-INF/views/employee/list.jsp").forward(req,resp);} catch (Exception e) {e.printStackTrace();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欢迎关注我的公众号

后续我会在公众号更新相关的C/rust等相关语言知识&#xff0c;此外计算机基础相关的知识。 欢迎大家关注&#xff1a;松元漫话

了解统计分类中的贝叶斯理论误差限

一、介绍 统计分类和机器学习领域正在不断发展&#xff0c;努力提高预测模型的准确性和效率。这些进步的核心在于一个基本基准&#xff0c;即贝叶斯理论误差极限。这个概念深深植根于概率和统计学&#xff0c;是理解分类算法的局限性和潜力的基石。本文深入探讨了贝叶斯错误率的…

【LabVIEW FPGA入门】使用LabVIEW FPGA进行编程并进行编译

在本文中会进行一个简单的FPGA编程演示&#xff0c;这通常可以验证编译工具链是否正常使用。在LabVIEW FPGA中和rt、PC编程一样使用数据流编程&#xff0c;但是需要注意的是FPGA中有些函数是不可以用的&#xff0c;因为这些函数很占用资源&#xff0c;且FPGA只能同时下载运行一…

AI软件开发:探索原理、挑战与未来趋势

AI软件开发已经成为当前最热门和具有前景的技术领域之一。随着人工智能技术的快速发展&#xff0c;AI软件的应用范围也在不断扩大。本文将主要探讨AI软件开发的原理、挑战以及未来的趋势。 首先&#xff0c;AI软件开发的原理是基于机器学习和深度学习算法。机器学习是一种通过…

C#中Random.Next 方法

目录 一、重载 二、Next() 1.定义 2.示例 三、Next(Int32) 1.定义 2.示例1 3.示例2 四、Next(Int32, Int32) 1.定义 2.示例1 3.示例2 一、重载 返回一个随机整数。 Next()返回一个非负随机整数。Next(Int32)返回一个小于所指定最大值的非负随机整数。Next(Int32,…

Jetbrains ai assistant激活成功了

使用ai assistant插件助手 很完美&#xff0c;第一次用在idea 开发工具就完美的把激活了&#xff0c;你也不妨试试 链接地址&#xff1a;https://web.52shizhan.cn 激活后如下 登录页面 完美使用

Linux 文件和文本内容

本篇主要分两类&#xff0c;一类是vim 这种交互式的文本编辑软件&#xff0c;另外就是各种花式的文本处理命令&#xff0c;有 awk、sed 这种强大的命令&#xff0c;也有简单的重定向和echo打印&#xff0c;指在提升文本处理效率&#xff0c;建议试试&#xff0c;来增强记忆 一、…

python设计模式有哪几种

Python 中常见的设计模式有以下几种 一 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点。 二 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;使用工厂方法来创建对象&#xff0c;而不是直…

c++算法之枚举

目录 解空间的类型 循环枚举解空间 例题 特别数的和 输入格式 输出格式 输入样例&#xff1a; 输出样例&#xff1a; 解 例题 反倍数 问题描述 输入格式 输出格式 样例输入 样例输出 解 例题 找到最多的数 解 枚举算法是一种基本的算法思想&#xff0c;它通过…

《设计模式的艺术》笔记 - 单例模式

介绍 单例模式优点是可以确保系统中只存在单个对象实例&#xff0c;缺点是不便扩展&#xff0c;一定程度上违背单一原则&#xff0c;既提供业务方法&#xff0c;又提供创建对象方法 饿汉式单例 在类加载的时候就创建好对象&#xff0c;获取对象时直接返回即可 class EagerSin…

喜报 | 联诚发斩获卓越品牌奖,总裁龙平芳荣获优秀企业家奖

1月10日&#xff0c;深圳市半导体产业发展促进会五届三次会员大会暨五届四次理/监事会在深圳宝安登喜路国际大酒店隆重举行&#xff0c;全体会员、党员、兄弟商协会等共600多位代表出席会议。联诚发LCF作为协会会长单位也受邀出席盛会。 本次大会颁布了卓越品牌奖、优秀企业奖、…

79LXX 三端负电源电压调节器,具有一系列固定电压输出,适用于小于100mA电源供给的场合

79LXX系列三端负电源电压调节器是单片双极型线性集成电路&#xff0c;采用TO92、SOT89-3的封装形式封装&#xff0c;有一系列固定的电压输出&#xff0c;适用于小于100mA电源供给的场合。 主要特点&#xff1a; 最大输出电流为100mA 固定输出电压分别为-5V、-6V、-8V、-9V、-1…

QT第三天

使用QT完成水果计价界面和功能&#xff0c;如下图&#xff1a; 运行结果&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QListWidgetItem>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_N…

redis复习总结

我的redis 1. redis集群 主从集群【哨兵集群】&#xff1a;主从集群是指中&#xff0c;存在一个master节点和多个slave节点。master节点负责接收客户端的读写&#xff0c;slave节点负责读操作。主节点一旦接收到数据的变更&#xff0c;就会将数据同步至slave节点。 但这样的…

用TF-IDF处理文本数据

计算机擅长处理数字&#xff0c;但不擅长处理文本数据&#xff0c;TF-IDF是处理文本数据最广泛使用的技术之一&#xff0c;本文对它的工作原理以及它的特性进行介绍。 根据直觉&#xff0c;我们认为在文本数据分析中出现频率更高的单词应该具有更大的权重&#xff0c;但事实并…

机器人技能学习-构建自己的数据集并进行训练

概要 若想训练自己的场景&#xff0c;数据集的重要性不做过多赘述&#xff0c;下面就基于 robomimic 和 robosuite 构建自己的数据集进行讲解&#xff0c;同时&#xff0c;也会附上 train 和 run 的流程&#xff0c;这样&#xff0c;就形成了闭环。 自建数据集 采集数据 采…

【MATLAB】REMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 REMD-LSTM神经网络时序预测算法是一种结合了REMD&#xff08;Reservoir Enhanced Multi-scale Deep Learning&#xff09;算法和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序…

解决“Ubuntu系统与windows系统之间不能执行复制粘贴”之问题

在win11中&#xff0c;发现“Ubuntu系统与windows系统之间不能互相复制粘贴”&#xff0c;只能通过“FPT客户端FileZilla”才能交换文件&#xff0c;但遇到字符串&#xff0c;就没法实现了&#xff0c;因此&#xff0c;在两个系统之间实现互相复制和粘贴字符串&#xff0c;就很…

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

RK3568驱动指南|第十二篇 GPIO子系统-v

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…