提供一个数据库的表,然后,分页显示表中所有信息,一页10个,此表130条信息。最后再以饼图显示男 女 未知 人数的情况。

news2024/9/22 9:51:08

 

运行之后显示的效果:

如果是新项目,建立项目后,把mysql驱动放到指定的目录下即:

WebContent\WEB-INF-lib

我用的驱动是 mysql-connector-j-8.0.33.jar

展示页

listpage.jsp

<%@page import="java.util.Map.Entry"%>
<%@page import="week18.util.PageUtil"%>
<%@page import="week18.biz.StuBizImpl"%>
<%@page import="week18.entity.*"%>
<%@page import="java.util.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    
    <% 
    
    String page1=request.getParameter("page");
    
    int pageNum =  1;
    if(page1==null)
    	pageNum =  1;
    else
    	pageNum = Integer.parseInt(page1);
    
	StuBizImpl sbi= new StuBizImpl();
	int pageSize=20;
	int currIndex =pageNum;
	int totalCount=sbi.SelectCount();
	PageUtil pageUtil = new PageUtil( pageSize,  currIndex,  totalCount);
	List<Stu> list=sbi.SelectByPage(pageUtil.getStart(), pageUtil.getPageSize());	
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>分页显示记录</title>
<style type="text/css">
p{
text-align: center;
color:red;
}
table{
width:100%;
background-color: green;
text-align: center;
}

.d1{
text-align: right;
}
</style>

<script src="https://cdn.staticfile.org/Chart.js/3.9.1/chart.js"></script>
</head>
<body>
<div>
<canvas id="myChart" width="400" height="400"></canvas>
</div>
<p></p>
<p></p>
<p></p>
<p></p>
<p>人员名单相关信息</p>
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>成绩</th>
</tr>
<%for(Stu stu:list) {%>
<tr>
<td><%=stu.getId() %></td>
<td><%=stu.getName() %></td>
<td><%=stu.getSex() %></td>
<td><%=stu.getScore() %></td>
</tr>
<%} %>
</table>

<div class="d1">
<a href="listpage.jsp?page=1">第一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="listpage.jsp?page=<%=pageUtil.getCurrIndex()-1%>">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="listpage.jsp?page=<%=pageUtil.getCurrIndex()+1%>">下一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="listpage.jsp?page=<%=pageUtil.getTotalPage()%>">最后页</a>&nbsp;&nbsp;&nbsp;&nbsp;
(<%=pageUtil.getCurrIndex() %>/<%=pageUtil.getTotalPage() %>)
</div>

<%
Map<String,Integer> map=sbi.SexConut();

String keyStr="",valStr="";
for(Entry<String,Integer> entry:map.entrySet()){
	String key=entry.getKey();
	Integer value=entry.getValue();
	keyStr+="'"+key+"',";
	valStr+=value+",";
}
%>


<script>
const ctx = document.getElementById('myChart');
const data = {
  labels: [
	  <%=keyStr%>
  ],
  datasets: [{
    label: '不同性别占比情况',
    data: [<%=valStr%>],
    backgroundColor: [
      'rgb(255, 99, 132)',
      'rgb(54, 162, 235)',
      'rgb(255, 205, 86)'
    ],
    hoverOffset: 4
  }]
};
const config = {
  type: 'pie',
  data: data,
  options: {
    responsive: true, // 设置图表为响应式,根据屏幕窗口变化而变化
    maintainAspectRatio: false,// 保持图表原有比例
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero:true
		}
	  }]
    }
  }
};
const myChart = new Chart(ctx, config);
</script>

</body>
</html>

工具类

连接库的工具

package week18.util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
	private final static String driver = "com.mysql.cj.jdbc.Driver";                      // 数据库驱动
	    private final static String url    = "jdbc:mysql://mysql.sqlpub.com:3306/huangjin";   // url
	    private final static String dbName = "laocooon";                                      // 数据库用户名
	    private final static String dbPass = "fc12f7a5215e8e0a";                              // 数据库密码
	    
	    private static Connection        conn  = null;
	    private static PreparedStatement pstmt = null;			        
	    private static ResultSet         rs    = null;

	    public static Connection getConn() throws Exception{
	        Class.forName(driver);                                     //注册驱动
	        return DriverManager .getConnection(url,dbName,dbPass);   //获得数据库连接并返回
	    }
	    public static void closeAll( Connection conn, PreparedStatement pstmt, ResultSet rs ) throws Exception {	        
	        if(rs != null) rs.close();
	        if(pstmt != null) pstmt.close();
	        if(conn != null) conn.close();
	    }
	    
	    public static void closeAll( Connection conn, PreparedStatement pstmt) throws Exception {
	        if(pstmt != null) pstmt.close();
	        if(conn != null) conn.close();
	    }
	    
	    
	    //直接关静态成员的资源
	    public static void closeAll() throws Exception {	        
	    	closeAll(conn,pstmt,rs);// 关 17 18 19行的资源的
	    }
	    
	  //增删改  返回多少条发生了变化,如果0表示没变化
	    public static int executeUpdataSQL(String sql,String[] param)throws Exception {
			Connection        conn  = null;
			PreparedStatement pstmt = null;			        
			
			conn = getConn();                         
			pstmt = conn.prepareStatement(sql);    
			    
			for( int i = 0; i < param.length; i++ ) 
				pstmt.setString(i+1, param[i]);
			
			int num  = pstmt.executeUpdate();
			closeAll(conn,pstmt);
			
			return num;
	    }
	    
	    
	    //调用此代码,使用完 记录集的内容之后,通过  closeAll();
	    public static ResultSet executeQuerySQL(String sql,String[] param)throws Exception {
	    	closeAll();
			conn = getConn();                         
			pstmt = conn.prepareStatement(sql);    
			    
			for( int i = 0; i < param.length; i++ ) 
				pstmt.setString(i+1, param[i]);			
			rs  = pstmt.executeQuery();		
			return rs;
			
	    }
	    
}

 

分页工具

package week18.util;

public class PageUtil {
	private int pageSize;//一页有多少条
	private int currIndex;//当前是第几页
	private int totalCount;//共有多少条记录  谁给我? 逻辑层的 getTotalCount
	private int totalPage;//共有多少页	
	private int start;//显时时开始的位置
	
	
	//构造方法时,需要提供什么参数  一页多少个,当前第几页,一共多少条
	public PageUtil(int pageSize, int currIndex, int totalCount) {
		this.pageSize = pageSize;
		this.currIndex = currIndex;
		this.totalCount = totalCount;
	}
 
 
	public int getPageSize() {
		return pageSize;
	}
 
 
	public int getCurrIndex() {
		currIndex=currIndex<1?1:currIndex;//如果当前页小于1,则为1
		currIndex=currIndex>getTotalPage()?getTotalPage():currIndex;//如果当前页大于总页数	
		
		return currIndex;
	}
 
 
	public int getTotalCount() {
		return totalCount;
	}
 
 
	public int getTotalPage() {
		return totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;
	}
 
 
 
	public int getStart() {
		return (getCurrIndex()-1)*pageSize;//开始的位置=(当前页-1)*一页的数;
	}
 
 
	@Override
	public String toString() {
		return "PageUtil [pageSize=" + pageSize + ", currIndex=" + currIndex + ", totalCount=" + totalCount
				+ ", totalPage=" + totalPage + ", start=" + start + ", toString()=" + super.toString() + "]";
	}
 
}

实体包的   VO类

package week18.entity;

public class Stu {
	private int id;
	private String name,sex;
	private int score;
	
	public Stu() {
		
	}
	public Stu(int id, String name, String sex, int score) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.score = score;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Stu [id=" + id + ", name=" + name + ", sex=" + sex + ", score=" + score + ", toString()="
				+ super.toString() + "]";
	}
}

数据交换层的dao包

package week18.dao;

import java.util.List;
import java.util.Map;

import week18.entity.Stu;

public interface IStuDao {
	//总记录数
	public int SelectCount() throws Exception;
	
	//n位置开始后的指定条记录
	public List<Stu> SelectByPage(int start,int pageSize) throws Exception;
	
	
	//不同性别的人数
	public Map<String,Integer> SexConut() throws Exception;

}
package week18.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import week18.entity.Stu;
import week18.util.BaseDao;

public class StuDaoImpl implements IStuDao {
	private Connection conn=null;
	private PreparedStatement pstmt=null;
	ResultSet rs=null;

	@Override
	public int SelectCount() throws Exception {
		
		String sql="SELECT COUNT(*) FROM stu";		
		conn=BaseDao.getConn();
		pstmt=conn.prepareStatement(sql);	
		rs=pstmt.executeQuery();
		int count = 0;
		if(rs.next()) {
			count =  rs.getInt(1);
		}
		BaseDao.closeAll(conn,pstmt,rs);
		return count;
	}
	

	@Override
	public List<Stu> SelectByPage(int start, int pageSize) throws Exception {
		List<Stu> list=new ArrayList<Stu>();
		String sql="SELECT * FROM Stu LIMIT ?,?";
		
		conn=BaseDao.getConn();
		pstmt=conn.prepareStatement(sql);		
		pstmt.setInt(1, start);
		pstmt.setInt(2, pageSize);
		rs=pstmt.executeQuery();
		while(rs.next()) {
			Stu Stu = new Stu();
			Stu.setId(rs.getInt(1));
			Stu.setName(rs.getString(2));
			if(rs.getString(3)!=null)
				Stu.setSex(rs.getString(3));
			else
				Stu.setSex("未知");
			Stu.setScore(rs.getInt(4));
			list.add(Stu);
		}
		BaseDao.closeAll(conn,pstmt,rs);
		return list;
	}

	@Override
	public Map<String, Integer> SexConut() throws Exception {
		 Map<String, Integer> map=new HashMap<String, Integer>();
		String sql="SELECT COALESCE(sex, '未知') AS sex, COUNT(*) AS count FROM stu GROUP BY sex;";
		
		conn=BaseDao.getConn();
		pstmt=conn.prepareStatement(sql);
		rs=pstmt.executeQuery();
		while(rs.next()) {
			map.put(rs.getString(1), rs.getInt(2));			
		}
		BaseDao.closeAll(conn,pstmt,rs);
		return map;
	}

}

业务逻辑层的 biz包

package week18.biz;

import java.util.List;
import java.util.Map;

import week18.entity.Stu;

public interface IStuBiz {
	//总记录数
	public int SelectCount() throws Exception;
	
	//n位置开始后的指定条记录
	public List<Stu> SelectByPage(int start,int pageSize) throws Exception;
	
	
	//不同性别的人数
	public Map<String,Integer> SexConut() throws Exception;
	
		

}
package week18.biz;

import java.util.List;
import java.util.Map;

import week18.dao.IStuDao;
import week18.dao.StuDaoImpl;
import week18.entity.Stu;

public class StuBizImpl implements IStuBiz {
	IStuDao sd = null;
	
	

	public StuBizImpl() {
		sd=new StuDaoImpl();
	}

	@Override
	public int SelectCount() throws Exception {
		// TODO Auto-generated method stub
		return sd.SelectCount();
	}

	@Override
	public List<Stu> SelectByPage(int start, int pageSize) throws Exception {
		// TODO Auto-generated method stub
		return sd.SelectByPage(start, pageSize);
	}

	@Override
	public Map<String, Integer> SexConut() throws Exception {
		// TODO Auto-generated method stub
		return sd.SexConut();
	}

}

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

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

相关文章

DIY电脑装机机箱风扇安装方法

作为第一次自己diy一台电脑主机的我&#xff0c;在经历了众多的坑中今天来说一下如何安装机箱风扇的问题 一、风扇的数量 1、i3 xx50显卡 就用一个cpu散热风扇即可 2、i5 xx60 一个cpu散热风扇 一个风扇即可 3、i7 xx70 一个cpu散热 4个风扇即可 4、i9 xx80 就需要7个以…

设计模式详解---策略模式

1. 策略模式简介 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在运行时根据不同的情境选择不同的算法或策略。该模式将算法封装成独立的类&#xff0c;使得它们可以相互替换&#xff0c;而且可以独立于客户端使用它们的方式。 1.1.…

拷贝的艺术:深拷贝与浅拷贝的区别与应用(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

轻量封装WebGPU渲染系统示例<50>- Json数据描述材质等场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene2.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: json场景数据: {"renderer": {"mtplE…

设计模式——组合模式(结构型)

引言 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如&#xff0c; 你有两类对象&#xff1a; ​…

搞懂这6 个持续集成工具,领先80%测试人

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

太空旅行:计算机技术的崭新航程

太空旅行&#xff1a;计算机技术的崭新航程 一、引言 自古以来&#xff0c;人类就对浩渺的宇宙充满了无尽的好奇和渴望。随着科技的飞速发展&#xff0c;太空旅行已经从科幻小说中的构想变为现实。在这个过程中&#xff0c;计算机技术起到了不可或缺的作用。从阿波罗时代的初…

12V升18V4A同步升压恒压WT3210

12V升18V4A同步升压恒压WT3210 WT3210 是一款高功率密度的全集成同步升压转换器&#xff0c;内部集成的功率MOSFET管导通电阻为上管8mΩ和下管15mΩ。可为便携式系统提供空间小尺寸 解决方案。WT3210具有 2.7V 至 20V 的宽输入电压范围&#xff0c;应用在单节或两节锂电池的便携…

数据可视化?这些平台能处

图表在各行各业都起到举重若轻的作用&#xff0c;无论是项目汇报、业绩分析&#xff0c;亦或是数据挖掘、统计分析&#xff0c;良好的可视化可以为我们的阐述起到画龙点睛的效果。在一篇文章中&#xff0c;如果只有密密麻麻的文字堆积&#xff0c;无论是谁恐怕都无法长期保持注…

[Verilog] Verilog 简介

主页&#xff1a; 元存储的博客 全文 2100 字。 文章目录 前言1. Verilog 简介2. 主要特性3. 应用领域总结 前言 Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建…

GZ015 机器人系统集成应用技术样题3-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题3 选手须知&#xff1a; 本任务书共 26页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

seaborn库图形进行数据分析(基于tips数据集)

Seaborn 是一个基于 matplotlib 的数据可视化库&#xff0c;可以用来绘制各种统计图表&#xff0c;包括散点图、条形图、折线图、箱线图等。Seaborn 提供了一些用于美化图表的默认样式和颜色主题&#xff0c;使得生成的图表更具有吸引力。下面是一些 Seaborn 库的常用功能和用法…

性能测试基础知识总结

1、CPU 使用率 除了空闲时间外的其他时间占总 CPU 时间的百分比&#xff0c;就是CPU 使用率&#xff0c;即 1- 空闲时间/CPU 总时间。 当计算 CPU 使用率时&#xff0c;我们通常使用 /proc/stat 文件中的数据。该文件提供了有关 CPU 的计数器信息&#xff0c;包括各种状态下的…

HPM6750系列--第九篇 GPIO详解(基本操作)

一、目的 在之前的博文中我们主要介绍了不同系统不同开发编译调试环境的配置和操作&#xff08;命令行方式、Visual Studio Code、Segger Embedded Studio for RISC-V&#xff09;&#xff0c;以帮助大家准备好学习环境为目的&#xff0c;但是未涉及到芯片本身以及外设的讲解。…

CCF编程能力等级认证GESP—C++2级—20230318

CCF编程能力等级认证GESP—C2级—20230318 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)画三角形百鸡问题 答案及解析单选题判断题编程题1编程题2 单选题…

【MySQL学习之基础篇】概述

文章目录 1. mysql的启动和停止命令2. 客户端连接3. 数据模型 1. mysql的启动和停止命令 通过指令启动或停止&#xff0c;以管理员身份运行cmd&#xff0c;进入命令行执行如下指令&#xff1a; &#xff08;1&#xff09;启动myaql net start mysql&#xff08;2&#xff09;…

解决App Store上架提示您必须上传 12.9 英寸 iPad Pro(第 2 代)显示屏的截屏

出错场景 在App Store Connect中&#xff0c;上架App时&#xff0c;出现以下错误提示. 要开始审核流程&#xff0c;必须提供以下项目&#xff1a;您必须上传 12.9 英寸 iPad Pro&#xff08;第 2 代&#xff09;显示屏的截屏。&#xff08;2048&#xff0c;2732&#xff09;您…

netty-daxin-2(netty常用事件讲解)

文章目录 netty常用事件讲解ChannelHandler接口ChannelHandler适配器类ChannelInboundHandler 子接口Channel 的状态调用时机ChannelHandler 生命周期示例NettServer&CustomizeInboundHandlerNettyClient测试分析 ChannelInboundHandlerAdapter适配器类SimpleChannelInboun…

【MySQL学习之基础篇】多表查询

文章目录 1. 多表关系1.1. 一对多1.2. 多对多1.3. 一对一 2. 多表查询概述2.1. 数据准备2.2. 概述 3. 查询的分类3.1. 内连接查询3.2. 外连接查询3.3. 自连接3.3.1. 自连接查询3.3.2. 联合查询 3.4. 子查询3.4.1. 概述3.4.2. 标量子查询3.4.3. 列子查询3.4.4. 行子查询3.4.5. 表…

等等Domino 14.0FP1

大家好&#xff0c;才是真的好。 节奏确实太快了&#xff0c;有时候我深感我也追不上。 以前Notes Domino是三年磨一剑&#xff0c;也就说每三年才发一个大版本&#xff0c;从2019年开始&#xff0c;进行了高频提速&#xff0c;居然一年一个大版本&#xff01; 周末&#xf…