day45_项目

news2025/1/12 16:09:02

SQL

/*
在分页查询中,有一些常见变量名
pageNo    当前页(页码),默认是1
pageSize  每页展示数据的条数,需求给定
pageCount 共多少页
     pageCount=total%pageSize==0?(total/pageSize):(total/pageSize)+1;
total     共多少条数据,select count(id)计算出
*/
-- 假设,每页展示4条
-- 第一页
select * from user limit 0,4
-- 第二页
select * from user limit 4,4
-- 第三页
select * from user limit 8,4
-- 第四页
select * from user limit (pageNo-1)*pageSize,pageSize

分页

技术:

​ 最终要执行出select * from user limit (pageNo-1)*pageSize,pageSize,就可以实现分页

流程:

- 在第一次查全部时开始分页查询
- 且一定是从第一页开始,后续下一页是当前页+1
  • 还需要在展示结果处写出分页信息: 总页数,总条数,上一页,下一页

编码:

  • 改造之前的代码

  • 改造dao层

    • // 1 方法加参数,int pageNo, int pageSize
      // 2 sql语句加limit
      @Override
          public List<House> findHouseAll(int pageNo, int pageSize) {
              Connection conn = DBUtil.getConnection( );
              PreparedStatement ps = null;
              ResultSet rs = null;
              ArrayList<House> list = new ArrayList<>( );
      
              try {
                  String sql = "select * from house limit ?,?";
                  ps = conn.prepareStatement(sql);
                  ps.setInt(1, (pageNo - 1) * pageSize);
                  ps.setInt(2, pageSize);
              }
          }
      }
      
  • 改造service

    • // 1 方法加参数,int pageNo, int pageSize
      List<House> findHouseAll(int pageNo,int pageSize);
      
          @Override
          public List<House> findHouseAll(int pageNo,int pageSize) {
      
              HouseDao houseDao = new HouseDaoImpl();
              List<House> list = houseDao.findHouseAll(pageNo,pageSize);
              return list;
          }
      
      
  • 改造servlet

    •     @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 固定每页大小
              int pageSize = 2;
              // 接收请求
              String pageNoStr = req.getParameter("pageNo");
              // 如果请求中没有页码,认为是第一页
              if (pageNoStr == null || "".equals(pageNoStr)) {
                  pageNoStr = "1";
              }
      
              int pageNo = Integer.parseInt(pageNoStr);
      
              // 调用业务层
              HouseService houseService = new HouseServiceImpl();
              //  查询分页数据
              List<House> list = houseService.findHouseAll(pageNo,pageSize);
      
              
              // 做出响应
              req.setAttribute("list",list);
      
              // 跳转至list.jsp       req.getRequestDispatcher("/view/house/list.jsp").forward(req,resp);
      
          }
      

    到此处已经实现,第一次展现分页

    后续,要向页面展现分页数据: 总页数,总条数,上一页,下一页

    继续改造代码

  • servlet

    • 查出总条数,计算出总页数

    • 将数据存储,到页面展现

    •     @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 固定每页大小
              int pageSize = 2;
              // 接收请求
              String pageNoStr = req.getParameter("pageNo");
              // 如果请求中没有页码,认为是第一页
              if (pageNoStr == null || "".equals(pageNoStr)) {
                  pageNoStr = "1";
              }
      
              int pageNo = Integer.parseInt(pageNoStr);
      
              // 调用业务层
              HouseService houseService = new HouseServiceImpl();
              //  查询分页数据
              List<House> list = houseService.findHouseAll(pageNo,pageSize);
      
              // 查询数据条数
              int total = houseService.count();
      
              // 计算出总页数
              int pageCount = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;
      
              // 做出响应
              req.setAttribute("list",list);
              // 将分页信息存储,到页面展现
              req.setAttribute("total",total);// 总条数
              req.setAttribute("pageNo",pageNo);// 当前页
              req.setAttribute("pageCount",pageCount);// 总页数
      
      
              // 跳转至list.jsp
              req.getRequestDispatcher("/view/house/list.jsp").forward(req,resp);
      
          }
      
      
  • service 需要设置方法count();

  • dao需要设置方法count();

    •    @Override
          public int count() {
              Connection conn = DBUtil.getConnection( );
              PreparedStatement ps = null;
              ResultSet rs = null;
              int total = 0;
              try {
                  String sql = "select count(hid) total from house";
                  ps = conn.prepareStatement(sql);
            
                  rs = ps.executeQuery( );
                  if (rs.next( )) {
                      total = rs.getInt("total");
                  }
              } catch (Exception e) {
                  e.printStackTrace( );
              } finally {
                  DBUtil.closeAll(rs, ps, conn);
              }
              return total;
          }
      
  • 改造页面

    • 页面要展现分页信息

      • <div>共有 ${total} 条记录,第 ${pageNo}/${pageCount} 页</div>
        
    • 页面做逻辑处理,第一页时不能再点击上一页,最后一页不能再点击下一页

      • <div>
            <ul class="pagination">
         <%--  if判断为true,内部标签就会展现,if判断为false,内部标签会隐藏 --%>
                <c:if test="${pageNo != 1}">
                    <li class="paginate_button previous disabled }">
                        <a href="${pageContext.request.contextPath}/house/list?pageNo=${pageNo - 1}">上一页</a>
                    </li>
                </c:if>
                <li class="paginate_button active"><a href="#">1</a></li>
                <c:if test="${pageNo != pageCount}">
                    <li class="paginate_button next disabled">
                        <a href="${pageContext.request.contextPath}/house/list?pageNo=${pageNo + 1}">下一页</a>
                    </li>
                </c:if>
            </ul>
        </div>
        
  • 自行完成

    • 页码

image-20230530190404470

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLcGD6LF-1685693127601)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/%E9%A1%B5%E7%A0%81.gif)]

模糊查询

场景:

​ 查询多个数据

SQL:

select * from house where address like '%航海路%'

模糊查询的时机:

​ 与分页查询全部同时实现.


前端:

  • list.jsp设置搜索框
  • 设置请求路径(/house/list)
  • 点击发送

后台:

  • HouseListServlet接收请求

  • 将关键词也发送给service–> service的findHoseAll方法需要再设计第三个参数,接收关键词

  • List<House> findHouseAll(int pageNo,int pageSize,String keyword);
    
  • dao.findHoseAll方法也设置第三个参数

  • List<House> findHouseAll(int pageNo,int pageSize,String keyword);
    
  • 改造dao,查询的方法方法代码

  •         try {
                // 基础查询
                String sql = "select * from house ";
                // 根据搜索关键词,有关键词就拼接模糊搜索sql
                if (keyword != null && !"".equals(keyword)) {
                    sql += " where haddress like concat('%',?,'%')";
                }
                // 一定要拼接分页用的limit语句
                sql += " limit ?,?";
                System.out.println("动态sql = " + sql );
                ps = conn.prepareStatement(sql);
          
                
                // 根据模糊搜索的关键词的有无,来决定给几个?赋值
                if (keyword != null && !"".equals(keyword)) {
                    ps.setString(1,keyword);
                    ps.setInt(2, (pageNo - 1) * pageSize);
                    ps.setInt(3, pageSize);
                }else{
                    ps.setInt(1, (pageNo - 1) * pageSize);
                    ps.setInt(2, pageSize);
                }
                System.out.println("预处理后动态sql = " + sql );
    
  • 同理,count()方法需要设置keyword参数,通过关键词查出有多少条数据

  • 其余代码不用改变

BUG

  1. 搜索后,再点下一页是全部数据的下一页不是模糊搜索的下一页

原因: 点击下一页或上一页时,后台没有接收到关键词keyword,所以dao就没有拼接where后sql语句

解决: 在点击下一页时,在路径中拼接上关键词(关键词就需要后台将关键词返回)

  1. 更新时间问题

    是因为数据库设置了[根据当前时间戳更新],取消即可

  2. 更新回显下拉框问题

	<!-- option属性selected是默认选中 -->
	<select>
		<option selected>1</option>
		<option >2</option>
		<option>3</option>
	</select>

原因: 点击下一页或上一页时,后台没有接收到关键词keyword,所以dao就没有拼接where后sql语句

解决: 在点击下一页时,在路径中拼接上关键词(关键词就需要后台将关键词返回)

  1. 更新时间问题

    是因为数据库设置了[根据当前时间戳更新],取消即可

  2. 更新回显下拉框问题

	<!-- option属性selected是默认选中 -->
	<select>
		<option selected>1</option>
		<option >2</option>
		<option>3</option>
	</select>

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

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

相关文章

LEAP软件操作基础/安装与注册/基本原理和数据结构

本次内容突出与实例结合&#xff0c;紧密结合国家能源统计制度及《省级温室气体排放编制指南》&#xff0c;深入浅出地介绍针对不同级别研究对象时如何根据数据结构、可获取性、研究目的&#xff0c;构建合适的能源生产、转换、消费、温室气体排放&#xff08;以碳排放为主&…

电力系统直流潮流计算研究【IEEE9节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

JavaEE初阶学习:网络原理

1.应用层 应用层和代码直接相关的一层 决定了数据要传输什么,拿到数据之后如何使用 约定应用层数据报,数据格式,就是在自定义协议~~ 如何约定? 1.确定要传输那些信息,(根据需求走的) 外卖程序,有一个核心的功能,加载商家列表 请求 用户ID 用户的位置(经纬度) 响应 …

使用Python脚本和简单的图形用户界面轻松切割MP3文件

应用场景&#xff1a; 需要将大型MP3文件切割成较小的部分以便上传或发送。需要从MP3文件中提取特定的音频片段&#xff0c;以便用于其他目的。需要快速制作铃声或音乐片段&#xff0c;以用于手机等设备。 源代码&#xff1a; import subprocess import wxclass MyFrame(wx.…

常微分方程ODE和Neural Ordinary Differential Equations

微分方程&#xff08;英語&#xff1a;Differential equation&#xff0c;DE&#xff09;是一種數學方程&#xff0c;用來描述某一類函数與其导数之间的关系。微分方程的解是一個符合方程的函數。而在初等数学的代数方程裡&#xff0c;其解是常数值。 常微分方程&#xff08;英…

蓝桥杯青少组python:第十二届国赛

选择题 1、设s"Hi LanQiao"&#xff0c;运行一下哪个选项代码可以输出"LanQiao"子串&#xff08;&#xff09; A、print(S[-7:]) B、print(s[-6:-1]) C、print(s[-7:0]) D、print(s[-7:0]) 2、已知a2021.0529&#xff0c;运行一下代码选项可以输出2021.0…

c# vs2013 制作水晶报表并导出为 pdf

一两年前接触的&#xff0c;当时没有记录&#xff0c;现在把他写下来。 vs2013制作水晶报表&#xff0c;应该要用到插件安装&#xff0c;可以自行搜索安装插件。 在Views/RPT文件夹下创建.rpt后缀的水晶报表文件&#xff08;这里的文件夹位置根据自身随意更改&#xff09;。 在…

JavaScript数组去重的常见方法 Set filter indexOf

JavaScript实现对象深拷贝的方法&#xff08;5种&#xff09; 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现实现数组去重的五种方法1.Set()Array.from()2.filter() indexOf()3.for 嵌套 for&#xff0c;splice 去重4.利用Map()5.利用includes 实际开发问…

如何入门编程

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f;欢迎大家积极讨论 一、自学编程需要注意什么&#xff1f; 对于我个人的理解&#xff0c;其实自学编程最重要的就是兴趣。你得培养编程兴趣。 所以在学…

linuxOPS基础_linux文本文件统计及查找

wc命令 显示文件信息 语法 \# wc [选项] 文件名称选项选项说明-l表示lines&#xff0c;行数&#xff08;以回车/换行符为标准&#xff09;-w表示words&#xff0c;单词数 依照空格来判断单词数量-c表示bytes&#xff0c;字节数&#xff08;空格&#xff0c;回车&#xff0c;换…

【LED子系统深度剖析】十、详细实现流程(番外篇)

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、LED驱动初始化流程1.1 LED驱动匹配以及设备的创建1.1.1 gpio_led_probe1.1.2 gpi…

[SpringBoot]Service与Controller层

目录 关于Service 关于Controller 关于各组件的处理流程 补充&#xff1a; Service保证数据完整性是怎么体现的&#xff1f; 以下代表复制属性&#xff0c;把来源adminAddNewParam复制到目标 admin里面 关于Service Service的核心价值在于&#xff1a;组织业务流程&#…

gaussDB的schema创建查询,及其查询下面的表列,修改列类型

修改列类型与众不同 alter table adqm_safe_data_encrypt_job_instance alter COLUMN state TYPE INT4 alter COLUMN state TYPE INT4 pg_catalog.pg_namespace来查看当前数据库中全部的Schema select oid,* from pg_catalog.pg_namespace; 创建schema create schema gs_d…

vscode 配置rust、golang代码格式化方法

一共分三步&#xff1a; 点击左下角齿轮按钮&#xff0c;点击Settings&#xff0c;如下图&#xff1a;点击右上角切换到Settings.json文件。如下图增加rust、golang 配置如下&#xff0c;假如存在默认格式化配置请注释或删除。重启vscode ide&#xff0c;​尝试编写rust、gola…

HTML5+CSS3+JS小实例:简约的垂直选项卡

实例:简约的垂直选项卡 技术栈:HTML+CSS+JS 字体图标库:font-awesome 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="v…

【LED子系统深度剖析】八、小试牛刀

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、硬件管脚确定2、设备树配置3、子系统配置4、编译烧录5、验证5.1 设备树验证5.2 驱…

MySQL — 主从复制介绍

文章目录 主从复制一、概述二、原理三、 搭建主从复制结构3.1 服务器准备3.2 主库配置3.3 从库配置 主从复制 一、概述 ​ 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;…

16-Vue3中常用的 Composition API

目录 1、什么是组合式 API&#xff1f;2、拉开序幕的setup3、ref函数4、reactive函数5、Vue3.0中的响应式原理5.1 vue2.x的响应式5.2 Vue3.0的响应式 6、reactive对比ref7、setup的两个注意点8、计算属性与监视8.1 computed函数8.2 watch函数8.3 watchEffect函数 9、 生命周期1…

chatgpt赋能python:用Python编写AI:从入门到精通

用Python编写AI&#xff1a;从入门到精通 人工智能&#xff08;AI&#xff09;一直是计算机科学领域的热门话题。随着AI技术的成熟&#xff0c;越来越多的公司开始在其业务中应用AI。Python是机器学习和人工智能领域最流行的编程语言之一&#xff0c;Python提供了众多强大的库…

探索C++与Live555实现RTSP服务器的艺术

探索C与Live555实现RTSP服务器的艺术 一、引言&#xff08;Introduction&#xff09;1.1 RTSP服务器的重要性&#xff08;Importance of RTSP Server&#xff09;1.2 C与Live555库的优势&#xff08;Advantages of C and Live555&#xff09;1.3 可能用到的类和接口介绍 二、C与…