Java项目---开发一个学生成绩管理系统(使用mysql数据库)

2023-11-08

1、设计数据库

建立一个学生成绩表,表中的数据有姓名sname 、学号sno、英语成绩english、高等数学 math、计算机应用 computer、java编程 java。
建立一个账号密码表 users 和 pass 俩个属性
建表语句如下:(建库建表以及添加一条数据)

create database student
USE `student`;

DROP TABLE `t_gread`
CREATE TABLE T_gread #学生成绩表
(
  sname CHAR(5) NULL,
  sno CHAR(10) NOT NULL, 
  english CHAR(3) NULL,
  math CHAR(3) NULL,
  computer CHAR(3) NULL,
  java CHAR(3) NULL,
  PRIMARY KEY(sno)       
 )ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
 
 CREATE TABLE pass#账号密码表
 (
 users CHAR(10) NOT NULL,
 pass CHAR(15) NOT NULL,
 PRIMARY KEY (users)
 )ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
 
 INSERT INTO pass VALUES('admin','123456') #设置初始账号密码
 INSERT INTO t_gread (sname,sno,english,math,computer,java) VALUES ('黄月月','1825123602','80','80','87','75');#添加一条学生信息作为样例
 
 SELECT * FROM pass;
 SELECT * FROM `t_gread`

2、添加jdbc驱动包及数据库连接

参考这一篇的博文、https://blog.csdn.net/qq_44973159/article/details/91360332
连接数据库的代码异曲同工:下载驱动包直接百度即可
Java+mysql数据库

package 学生成绩系统sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//定义该类用于连接到数据库
public class StudentDB {
	private String driverName = "com.mysql.jdbc.Driver";
	private String dbURL = "jdbc:mysql://localhost:3306/student?serverTimezone=UTC";
	private Connection dbConn = null;
	public PreparedStatement stmt = null;
	private ResultSet rs = null;
	private String user = "root";#注意数据库的账号密码
	private String pass = "root";
	public StudentDB() { // 构造方法调用数据库连接。一旦创建对象,数据库建立连接
		 this.getConnection();
	}
	public void getConnection() {
		try {
			Class.forName(driverName);
			dbConn = DriverManager.getConnection(dbURL, user, pass);
			System.out.println("连接数据库成功");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.print("连接失败");
		}
	}
	public static void main(String[] args) {
		StudentDB studb = new StudentDB();
		studb.getConnection();
		System.out.println("=====================");
	public void close() { // 做完后关闭数据库操作
		try {
			if (rs != null) {
				rs.close();
				rs = null;
			}
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (dbConn != null) {
				dbConn.close();
				dbConn = null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	// 增删改通用方法      insert delete update都是一个方法
	public int update(String sql, Object... obj) {
		int result = -1;
		try {			
			stmt = dbConn.prepareStatement(sql);
			if (obj != null) {
				int len = obj.length;
				for (int i = 0; i < len; i++) {
					stmt.setObject(i + 1, obj[i]);
				}
			}	
			result = stmt.executeUpdate();
			System.out.println("======"+result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
}

连接成功后,参考这一篇博文,https://blog.csdn.net/qq_44973159/article/details/103532431 套用其模板。这是使用文件系统存储的学生成绩管理系统的代码

3、修改代码之前,我们还需要将数据库中用到的列名进行定义,定义在一个新的Applicant类里面。并且再get/set将其封装。

	private String zhanghao; //账号
	private String mima; //密码
	private String name;//姓名
	private String no;//学号
	private String english;//英语成绩
	private String math;//数学成绩
	private String computer;//计算机成绩
	private String java;//java成绩

4、编写接口类

再定义一个类javadao,在这个类当中写入数据库查询的方法,需要用到的有注册,登录,录入成绩,查询成绩,删除信息。

4.1 登录操作的sql语句

// 使用该方法查询密码,从传入账号,再返回再数据库中的密码。
	public String srhpass(String user) { 
		StudentDB studb = new StudentDB();
		String sql = "select pass from pass where users =?";
		String password1 = null;
		try {
			ResultSet rs1 = studb.search(sql, user);
			while (rs1.next()) {				
				password1 = rs1.getString(1);				
			}
			rs1.close();
			studb.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return password1;
	}
	public String srhuse (String user) { //加上一层保险,
		StudentDB studb = new StudentDB();
		String sql = "select count(*) from pass where users =?";
		int count =0;//列数先设置为0
		try {
			//设置了账号为主键,主键值不可重复,所以count值只能为0或者1
			ResultSet rs1 = studb.search(sql, user);
			while (rs1.next()) {				
				count++;				
			}
			rs1.close();
			studb.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if (count==1) {
			return user;
		} else {
			return null;
		}
	}

4.2 注册用户

注册用户需要使用的sql语句。先导入Applicant这个类,在同一个包下面可省略。实例化studentDB,使用update方法,而插入的参数就是在Applicant传入进来的值。

//	注册用户。
	public int adduse(Applicant app) {
		StudentDB studb = new StudentDB();
		String sql = "insert into pass values(?,?)";
		Object[] obj = { app.getZhanghao(), app.getMima(),};
		//打印参数,判断是否可以获取值,
		System.out.println(obj[0]);System.out.println(obj[1]);
		return studb.update(sql, obj);
	}

4.3、成绩录入

再者,录入学生成绩的方法同理,

//录入学生成绩
	public int addgread(Applicant app) {
		StudentDB studb = new StudentDB();
		String sql = "insert into t_gread values(?,?,?,?,?,?)";
		Object[] obj = {app.getName(),app.getNo(),app.getEnglish(),app.getMath(),app.getComputer(),app.getJava()};
		//打印参数,判断是否可以获取值,
		System.out.println(obj[0]);System.out.println(obj[1]);System.out.println(obj[2]);
		return studb.update(sql, obj);
	}

根据输入的学号查询学生所有的信息:使用list集合对数据进行存储

public List<Applicant> srhdate(String no) {
			List<Applicant> list = new LinkedList<Applicant>();
			StudentDB studb = new StudentDB();
			String sql = " SELECT * FROM t_gread where sno = ?";
			try {
				Applicant t = new Applicant();
				ResultSet rs1 = studb.search(sql, no);
				while (rs1.next()) {				
					String sname = rs1.getString(1);
					String english=rs1.getString(3);
					String math=rs1.getString(4);
					String computer=rs1.getString(5);
					String java=rs1.getString(6);
					System.out.println("=======");
					t.setName(sname);
					t.setEnglish(english);
					t.setMath(math);
					t.setComputer(computer);
					t.setJava(java);
					list.add(t);
				}
				rs1.close();
				studb.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return list;
		}

最后使用main函数对方法进行测试。基本上就是调用方法进行验证,下面代码验证俩个,其余的省略。

public static void main(String[] args) {
//		测试注册的方法。
//		javadao dao =new javadao();
//		Applicant a =new Applicant(); //每一个测试都需要先实例化这俩个类
//		a.setZhanghao("zhhs");
//		a.setMima("1245");
//		dao.adduse(a);
		
		//测试录入成绩,与上面方法同理,要先实例化对象,此处省略。
//		a.setName("黄三");
//		a.setNo("1825123603");
//		a.setEnglish("74");
//		a.setMath("75");
//		a.setComputer("87");
//		a.setJava("85");
//		dao.addgread(a);	
	}
//测试根据学号查询学生信息
		List<Applicant> all = dao.srhdate("1825123602");
		System.out.println("=====");
		for (Applicant applicant : all) {
			System.out.println(applicant.getName());
			}
		}

5、界面修改,

5.1 登录界面

即MYJFrame01,修改其pd方法即可,如下图所示:类名修改成了UI
在这里插入图片描述
代码段如下:

	System.out.println("账号"+tf.getText());//输入的账号
	System.out.println("密码"+pf.getText());//输入的密码		
	//根据输入的账号在数据库当中查询密码
	javadao jdao = new javadao();
	System.out.println("javadao查询"+jdao.srhpass(tf.getText()));//返回的是数据库中的密码
	String pass1 = jdao.srhpass(tf.getText());//使用变量将获取过来的密码保存下来	
	System.out.println("javadao查询账号"+jdao.srhuse(tf.getText()));
	String zhanghao =jdao.srhuse(tf.getText());
	if (tf.getText().equals(zhanghao)&&pf.getText().equals(pass1)) {//验证密码是否正确

5.2 注册界面

只需要修改save方法,throws 到SQL异常,登录的时候以及其他的IOException都需要改成SQLEception。如下图所示:
在这里插入图片描述
代码段如下:

public void save() throws SQLException {
		javadao dao =new javadao();
		Applicant a =new Applicant();
		a.setZhanghao(tf.getText());
		a.setMima(pf1.getText());
		dao.adduse(a);
	}

5.3 录入学生成绩

与上注册同理,修改方法即可,
在这里插入图片描述
代码段如下:

public void xieru() throws SQLException{
		javadao dao =new javadao();
		Applicant app =new Applicant();
		System.out.println(tf1.getText());
		System.out.println(tf2.getText());
		System.out.println(tf3.getText());
		System.out.println(tf4.getText());
		System.out.println(tf5.getText());
		System.out.println(tf6.getText());
		app.setName(tf1.getText());
		app.setNo(tf2.getText());
		app.setEnglish(tf3.getText());
		app.setMath(tf4.getText());
		app.setComputer(tf5.getText());
		app.setJava(tf6.getText());
		dao.addgread(app);
		System.out.println("写入成功!");
	}

5.4 根据学号对学生信息进行查询

在这里插入图片描述
该方法代码如下:

public void ck() throws SQLException {		
		javadao dao =new javadao();
		Applicant a =new Applicant();
		a.setNo(tf.getText());
		System.out.println("a的值:"+a);
		List<Applicant> list1 = dao.srhdate(tf.getText());	
		System.out.println("获取a学号 1:"+ a.getNo());		    
			System.out.println(tf.getText());
			if (dao.srhno(tf.getText())==null) {
				JOptionPane.showConfirmDialog(lookstu.this, "查看失败:学生信息不存在", "系统提示", JOptionPane.OK_CANCEL_OPTION,JOptionPane.CANCEL_OPTION);
		        new lookstu();
			}else {
				System.out.println("获取a学号  xianshi :"+ a.getNo());
				List<Applicant> all = dao.srhdate(a.getNo());				
				for (Applicant applicant : all) {
					System.out.println("姓名 :"+applicant.getName());
					System.out.println("学号 :"+a.getNo());
					System.out.println("英语 :"+applicant.getEnglish());
					System.out.println("数学:"+applicant.getMath());
					System.out.println("计算机 :"+applicant.getComputer());
					System.out.println("Java:"+applicant.getJava());
					}		
				new lookstu();
			}
	        lookstu.this.dispose();
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java项目---开发一个学生成绩管理系统(使用mysql数据库) 的相关文章

  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • 仅当值发生更改时如何插入数据库?

    我需要更新 替换 MySQL 数据库中的字段 但前提是它们已更改 该表包含 ID 文本字段和更改日期 用户根据更改日期通过 ID 查询数据 即 如果该日期早于用户上次查询数据的时间 则他不想要它 仅当文本字段与具有相同 ID 的现有文本字段
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • MySQL 通过 current_timestamp 选择上个月的数据

    直到今天 当我使用 MySQL 并需要对日期 时间执行操作时 我使用带有 unix 时间戳的 int 列 没有出现任何问题 但今天在阅读了一些指南后 我决定默认使用 current timestamp 测试时间戳列 所以我感兴趣如何按列选择
  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • mysql转储到derby

    我正在使用 derby 在 eclipse 中进行开发 是否可以从 MySQL 转储表并以某种方式将其用于 derby 我知道 ddl 和 dml 对于两个 dbms 来说是不同的 但我正在寻找一种除了转储 导出之外的合适方法 我可以找到两
  • PHP 和 MySQL - 高效处理多个一对多关系

    我正在寻求一些有关使用 MySQL 和 PHP 检索和显示数据的最佳方法的建议 我有 3 个表 所有一对多关系如下 Each SCHEDULE有很多覆盖每个覆盖都有很多地点 我想检索这些数据 以便它可以全部显示在单个 PHP 页面上 例如列
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐