Java课程设计大作业学生管理系统的设计与开发(Java+Mysql)

项目目标

    这篇文章是Java语言得课程设计大作业记录。
    项目由JavaMysql实现。
    本片文章包含完整的源程序代码结构图
    实现对学生信息的增、删、改、查功能。


欢迎大家关注我的公众号【kingdeguo
项目代码地址: https://github.com/KingdeGuo/StudentManagementSystem

项目截图展示

  • 软件初始界面
    在这里插入图片描述
  • 查询界面(按照姓名查找)
    在这里插入图片描述
  • 添加学生信息界面
    在这里插入图片描述
    修改删除界面
    在这里插入图片描述

项目Java源程序

    各个源文件的名字在第一行的注释信息中给出,注意自己在保存的时候使用正确的命明,否则可能找不到包的位置或者类的位置。
    另外需要注意的是我使用的是数据库Mysql8版本的,一般学生可能使用的Mysql5版本的人比较多。两个版本在连接数据库时使用的语法是不同的具体应使用什么连接语句在像相应的代码位置处已给出,根据自身环境修改以下即可。
    还有一个需要修改的地方就是连接数据库时采用的账号和密码。一般账号是root,密码是你自己设置的,需要在代码中修改,否则是连接不上的。

//filename :Test3.java  这个是主程序
//package SchoolProject.src;
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test3 extends JFrame implements ActionListener {
	// 定义一些控件
	JPanel jp1, jp2;
	JLabel jl1, jl2;
	JButton jb1, jb2, jb3, jb4;
	JTable jt;
	JScrollPane jsp;
	JTextField jtf;
	StuModel sm;
	// 定义连接数据库的变量
	Statement stat = null;
	PreparedStatement ps;
	Connection ct = null;
	ResultSet rs = null;

	public static void main(String[] args) {
		Test3 test3 = new Test3();
	}

	// 构造函数
	public Test3() {
		jp1 = new JPanel();
		jtf = new JTextField(10);
		jb1 = new JButton("查询");
		jb1.addActionListener(this);
		jl1 = new JLabel("请输入名字:");

		jp1.add(jl1);
		jp1.add(jtf);
		jp1.add(jb1);

		jb2 = new JButton("添加");
		jb2.addActionListener(this);
		jb3 = new JButton("修改");
		jb3.addActionListener(this);
		jb4 = new JButton("删除");
		jb4.addActionListener(this);

		jp2 = new JPanel();
		jp2.add(jb2);
		jp2.add(jb3);
		jp2.add(jb4);

		// 创建模型对象
		sm = new StuModel();

		// 初始化
		jt = new JTable(sm);

		jsp = new JScrollPane(jt);

		// 将jsp放入到jframe中
		this.add(jsp);
		this.add(jp1, "North");
		this.add(jp2, "South");
		this.setSize(600, 400);
		// this.setLocation(300, 200);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setVisible(true);

	}

	public void actionPerformed(ActionEvent arg0) {
		// 判断是哪个按钮被点击
		if (arg0.getSource() == jb1) {
			System.out.println("用户希望被查询...");
			// 因为把对表的数据封装到StuModel中,可以比较简单的完成查询
			String name = this.jtf.getText().trim();
			// 写一个sql语句
			String sql = "select * from stu where stuName = '" + name + "' ";
			// 构建一个数据模型类,并更新
			sm = new StuModel(sql);
			// 更新jtable
			jt.setModel(sm);

		}

		// 一、弹出添加界面
		else if (arg0.getSource() == jb2) {
			System.out.println("添加...");
			StuAddDiag sa = new StuAddDiag(this, "添加学生", true);

			// 重新再获得新的数据模型,
			sm = new StuModel();
			jt.setModel(sm);
		} else if (arg0.getSource() == jb4) {
			// 二、删除记录
			// 1.得到学生的ID
			int rowNum = this.jt.getSelectedRow();// getSelectedRow会返回给用户点中的行
			// 如果该用户一行都没有选,就返回-1
			if (rowNum == -1) {
				// 提示
				JOptionPane.showMessageDialog(this, "请选中一行");
				return;
			}
			// 得到学术ID
			String stuId = (String) sm.getValueAt(rowNum, 0);
			System.out.println("Id: " + stuId);

			// 连接数据库,完成删除任务
			try {
				// 1.加载驱动
//				Class.forName("com.mysql.jdbc.Driver");
				Class.forName("com.mysql.cj.jdbc.Driver");
				// 2.连接数据库
				String url = "jdbc:mysql://localhost:3306/stuinfo?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC";
				String user = "root";
				String passwd = "1234";

				ct = DriverManager.getConnection(url, user, passwd);
				System.out.println("连接成功");
				ps = ct.prepareStatement("delete from stu where stuId = ?");
				ps.setString(1, stuId);
				ps.executeUpdate();

			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (rs != null) {
						rs.close();
						rs = null;

					}
					if (ps != null) {
						ps.close();
						ps = null;
					}
					if (ct != null) {
						ct.close();
						ct = null;
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			sm = new StuModel();
			// 更新jtable
			jt.setModel(sm);
		} else if (arg0.getSource() == jb3) {
			System.out.println("11111");
			// 三、用户希望修改
			int rowNum = this.jt.getSelectedRow();
			if (rowNum == -1) {
				// 提示
				JOptionPane.showMessageDialog(this, "请选择一行");
				return;
			}
			// 显示对话框
			System.out.println("12435");
			StuUpDiag su = new StuUpDiag(this, "修改学号", true, sm, rowNum);
			sm = new StuModel();
			jt.setModel(sm);
		}
	}
}

//filename: StuUpDiag.java
//package SchoolProject.src;

/*
 * 修改学生
 */
import javax.swing.JDialog;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.*;

public class StuUpDiag extends JDialog implements ActionListener {
	// 定义我需要的swing组件
	JLabel jl1, jl2, jl3, jl4, jl5, jl6;
	JTextField jf1, jf2, jf3, jf4, jf5, jf6;
	JPanel jp1, jp2, jp3;
	JButton jb1, jb2;

	// owner代笔父窗口,title是窗口的名字,modal指定是模式窗口()或者非模式窗口
	public StuUpDiag(Frame owner, String title, boolean modal, StuModel sm, int rowNum) {
		// 调用父类方法
		super(owner, title, modal);

		jl1 = new JLabel("学号");

		jl2 = new JLabel("名字");

		jl3 = new JLabel("性别");
		jl4 = new JLabel("年龄");
		jl5 = new JLabel("专业");

		jl6 = new JLabel("院系");

		jf1 = new JTextField(10);
		jf1.setText((sm.getValueAt(rowNum, 0)).toString());
		jf2 = new JTextField(10);
		jf2.setText((String) sm.getValueAt(rowNum, 1));
		jf3 = new JTextField(10);
		jf3.setText(sm.getValueAt(rowNum, 2).toString());
		jf4 = new JTextField(10);
		jf4.setText((sm.getValueAt(rowNum, 3)).toString());
		jf5 = new JTextField(10);
		jf5.setText((String) sm.getValueAt(rowNum, 4));
		jf6 = new JTextField(10);
		jf6.setText((String) sm.getValueAt(rowNum, 5));

		jb1 = new JButton("修改");
		jb1.addActionListener(this);
		jb2 = new JButton("取消");

		jp1 = new JPanel();
		jp2 = new JPanel();
		jp3 = new JPanel();

		// 设置布局
		jp1.setLayout(new GridLayout(6, 1));
		jp2.setLayout(new GridLayout(6, 1));

		jp3.add(jb1);
		jp3.add(jb2);

		jp1.add(jl1);
		jp1.add(jl2);
		jp1.add(jl3);
		jp1.add(jl4);
		jp1.add(jl5);
		jp1.add(jl6);

		jp2.add(jf1);
		jp2.add(jf2);
		jp2.add(jf3);
		jp2.add(jf4);
		jp2.add(jf5);
		jp2.add(jf6);

		this.add(jp1, BorderLayout.WEST);
		this.add(jp2, BorderLayout.CENTER);
		this.add(jp3, BorderLayout.SOUTH);

		this.setSize(300, 200);
		this.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == jb1) {
			Connection ct = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;

			try {
				// 1.加载驱动
				Class.forName("com.mysql.cj.jdbc.Driver");
				System.out.println("加载成功");
				// 2.连接数据库
				// 定义几个常量
				String url = "jdbc:mysql://localhost:3306/stuinfo?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC";
				String user = "root";
				String passwd = "1234";
				ct = DriverManager.getConnection(url, user, passwd);

				// 与编译语句对象

				String strsql = "insert into stu values(?,?,?,?,?,?)";
				pstmt = ct.prepareStatement(strsql);

				// 给对象赋值
				pstmt.setString(1, jf1.getText());
				pstmt.setString(2, jf2.getText());
				pstmt.setString(3, jf3.getText());
				pstmt.setString(4, jf4.getText());
				pstmt.setString(5, jf5.getText());
				pstmt.setString(6, jf6.getText());

				pstmt.executeUpdate();

				this.dispose();// 关闭学生对话框

			} catch (Exception arg1) {
				arg1.printStackTrace();
			} finally {
				try {
					if (rs != null) {
						rs.close();
						rs = null;
					}
					if (pstmt != null) {
						pstmt.close();
						pstmt = null;
					}
					if (ct != null) {
						ct.close();
						ct = null;
					}
				} catch (Exception arg2) {
					arg2.printStackTrace();
				}
			}

		}

	}

}

//filename:StuModel.java
//package SchoolProject.src;

// 导入数据库相关包
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
// 导入向量包
import java.util.Vector;
// 导入Java界面组件
import javax.swing.table.*;

public class StuModel extends AbstractTableModel {
// 继承TableModel抽象类,实现学生模型
// 在rowData中存放行数据,在columnNames存放列名
	Vector rowData, columnNames;

	// 定义连接数据库的变量
	// 进行初始化,置为空
	Statement stat = null;
	Connection ct = null;
	ResultSet rs = null;

	// 初始化
	public void init(String sql) {
		if (sql.equals("")) {
			// 初始化时显示所有的存放在数据库中的数据
			sql = "select * from stu";
		}
		// 中间部分
		// 设置列名
		columnNames = new Vector();//创建向量
		columnNames.add("学号");
		columnNames.add("名字");
		columnNames.add("性别");
		columnNames.add("年龄");
		columnNames.add("专业");
		columnNames.add("院系");

		// rowData存放多行
		rowData = new Vector();

		try {
			// 1.加载驱动
			// 8版本MySQL使用的是"com.mysql.cj.jdbc.Driver",5版本使用的是"com.mysql.jdbc.Driver".
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("加载成功");//控制台提示
			// 2.连接数据库
			// 定义几个常量
			// 8版本需要加"?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC"
			// 其中需要设置nullCatalogMeansCurrent=true,出现这种问题的原因是mysql版本问题,mysql8.xxx以上驱动会出现这个问题,下图是我原mysql配置,是8.0.16的。
			// 一开始因为使用的版本不一致导致总是连接不成功。后来驱动版本与数据库版本都统一之后连接成功。
			String url = "jdbc:mysql://localhost:3306/stuinfo?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC";
			String user = "root";  // 账号
			String passwd = "1234";  // 密码

			ct = DriverManager.getConnection(url, user, passwd);  // connection
			stat = ct.createStatement(); // 创建stat对象,prepare statement
			rs = stat.executeQuery(sql); // 查询结果

			while (rs.next()) {
				Vector hang = new Vector();
				hang.add(rs.getString(1));
				hang.add(rs.getString(2));
				hang.add(rs.getString(3));
				hang.add(rs.getInt(4));
				hang.add(rs.getString(5));
				hang.add(rs.getString(6));
				// 加入到rowData中
				rowData.add(hang);

			}

		} catch (Exception e) {
			// 捕获异常
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
					rs = null;
				}
				if (stat != null) {
					stat.close();
					stat = null;
				}
				if (ct != null) {
					ct.close();
					ct = null;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	// 增加学生函数
	public void addStu(String sql) {
		// 根据用户输入的sql语句,完成添加任务

	}

	// 构造函数,传递的sql语句获取数据模型
	public StuModel(String sql) {
		this.init(sql);
	}

	// 构造学生模型,并进行初始化
	public StuModel() {
		this.init("");
	}

	// 获取行数
	public int getRowCount() {
		// TODO Auto-generated method stub
		return this.rowData.size();
	}

	// 获取列数
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return this.columnNames.size();
	}

	// 获取目标行及目标列的数据
	public Object getValueAt(int row, int column) {
		// TODO Auto-generated method stub
		return ((Vector) (this.rowData.get(row))).get(column);
	}

	// 获取属性字段名字
	public String getColumnName(int column) {
		// TODO Auto-generated method stub
		return (String) this.columnNames.get(column);
	}
}

//filename:StuAddDiag.java
//package SchoolProject.src;
import javax.swing.JDialog;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.*;

public class StuAddDiag extends JDialog implements ActionListener {
	// 定义我需要的swing组件
	JLabel jl1, jl2, jl3, jl4, jl5, jl6;
	JTextField jf1, jf2, jf3, jf4, jf5, jf6;
	JPanel jp1, jp2, jp3;
	JButton jb1, jb2;

	// owner代笔父窗口,title是窗口的名字,modal指定是模式窗口()或者非模式窗口
	public StuAddDiag(Frame owner, String title, boolean modal) {
		// 调用父类方法
		super(owner, title, modal);

		jl1 = new JLabel("学号");
		jl2 = new JLabel("名字");
		jl3 = new JLabel("性别");
		jl4 = new JLabel("年龄");
		jl5 = new JLabel("专业");
		jl6 = new JLabel("院系");

		jf1 = new JTextField(10);
		jf2 = new JTextField(10);
		jf3 = new JTextField(10);
		jf4 = new JTextField(10);
		jf5 = new JTextField(10);
		jf6 = new JTextField(10);

		jb1 = new JButton("添加");
		jb1.addActionListener(this);
		jb2 = new JButton("取消");

		jp1 = new JPanel();
		jp2 = new JPanel();
		jp3 = new JPanel();

		// 设置布局
		jp1.setLayout(new GridLayout(6, 1));
		jp2.setLayout(new GridLayout(6, 1));

		jp3.add(jb1);
		jp3.add(jb2);

		jp1.add(jl1);
		jp1.add(jl2);
		jp1.add(jl3);
		jp1.add(jl4);
		jp1.add(jl5);
		jp1.add(jl6);

		jp2.add(jf1);
		jp2.add(jf2);
		jp2.add(jf3);
		jp2.add(jf4);
		jp2.add(jf5);
		jp2.add(jf6);

		this.add(jp1, BorderLayout.WEST);
		this.add(jp2, BorderLayout.CENTER);
		this.add(jp3, BorderLayout.SOUTH);

		this.setSize(300, 200);
		this.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == jb1) {
			Connection ct = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;

			try {
				// 1.加载驱动
				// 8版本MySQL使用的是"com.mysql.cj.jdbc.Driver",5版本使用的是"com.mysql.jdbc.Driver".
				Class.forName("com.mysql.cj.jdbc.Driver");
				System.out.println("加载成功");
				// 2.连接数据库
				// 定义几个常量
				// 8版本需要加"?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC"
				// 其中需要设置nullCatalogMeansCurrent=true,出现这种问题的原因是mysql版本问题,mysql8.xxx以上驱动会出现这个问题,下图是我原mysql配置,是8.0.16的。
				// 一开始因为使用的版本不一致导致总是连接不成功。后来驱动版本与数据库版本都统一之后连接成功。
				String url = "jdbc:mysql://localhost:3306/stuinfo?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC";
				String user = "root";
				String passwd = "1234";
				ct = DriverManager.getConnection(url, user, passwd);

				// 插入语句
				String strsql = "insert into stu values(?,?,?,?,?,?)";
				pstmt = ct.prepareStatement(strsql);

				// 给对象赋值
				pstmt.setString(1, jf1.getText());
				pstmt.setString(2, jf2.getText());
				pstmt.setString(3, jf3.getText());
				pstmt.setString(4, jf4.getText());
				pstmt.setString(5, jf5.getText());
				pstmt.setString(6, jf6.getText());

				pstmt.executeUpdate();

				this.dispose();// 关闭学生对话框

			} catch (Exception arg1) {
				arg1.printStackTrace();
			} finally {
				try {
					if (rs != null) {
						rs.close();
						rs = null;
					}
					if (pstmt != null) {
						pstmt.close();
						pstmt = null;
					}
					if (ct != null) {
						ct.close();
						ct = null;
					}
				} catch (Exception arg2) {
					arg2.printStackTrace();
				}
			}

		}

	}

}

项目数据库文件信息

注意要将数据库命名为 stu
否则你需要改上面代码中数据库的名字。
下面是各个属性名称的设计以及字段的设计。
这个名字也不能改,否则会造成无法正确读取库中的信息。
(当然也可以改库中的名字,不过你需要同时更改上述源程序中对应的名字。)
在这里插入图片描述

项目结构图设计

  • 系统功能结构图:

在这里插入图片描述

软件架构设计

    注意专业的应该用Visio画图,当时电脑上没有成功装上Visio,便用了WPS的画图工具,导致上面留有水印。推荐使用Visio再画一遍。

  • 逻辑架构
    在这里插入图片描述
  • 开发架构
    在这里插入图片描述
  • 数据架构
    在这里插入图片描述
  • 运行架构
    在这里插入图片描述
  • 物理架构
    在这里插入图片描述
用来完成大作业的。文档内容: 1 Java技术体系 1.1 Java语言 1.2 Java平台 1.3 Java应用领域 2 Java语言的技术特点 2.1 1 2.2 2 2.3 3 3 Java语言C++的异同分析总结。 4 选用Cjava语言时编程算法程序有什么不同,有什么优势劣势。 5 自己编程学习的级别状态。以及自己以后的编程学习的计划想法。 6 下面3道题目中选一道,给出算法分析程序。 1)“黄金分割数”在我们的生活中很常见,但是在不同的应用领域,要求的精度也不一样。 例如:三位小数是0.618 现在我们需要你能求出保留100位小数的黄金分割数,采用的算法为“分层计算法”: 黄金数= 1 --------------- 1+ 1 ------------- 1+ 1 ----------- 1+ 1 --------- ..... 注意,计算出的结果,如果第100位为0也需要保留。 2)已知一个数列: 5,2,4,3,7,6 那么,在这个数列中存在这样一些“连续数”,例如:5,2,4,3这个子数列排序后是连续的。同样2,4,3也是连续的,为了方便表示 我们使用下标来标识,这样,这个数列中存在以下“连续数”: [1,1] [1,4] [1,6] [2,2] [2,4] [3,3] [3,4] [4,4] [5,5] [5,6] [6,6] 这样,他就存在11个“连续数”。现在需要你在用户找出一个数组中所有的“连续数”。 要求: 1、用户输入一个整数N,表示下面数组的个数 2、用户每输入一行作为一个数组 如: 用户输入: 1 5,2,4,3,7,6 程序输出: 11 3)有一种数我们称之为幸运数,它的特点是这样的,首先,由自然数按顺序排列: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 … 这样,1比较特殊, 1为第一个幸运数,那么,我们移除掉序号能被2整除的数(注意:是序号,而不是数本身,每次移除后都重新排序)就剩下: 1 3 5 7 9 11 13 15 17 19… 3为第二个幸运数,那么我们需要去掉序号能被3(下一次是除4,然后是5,每次加1)整除的数,5 11 17...剩下: 1 3 7 9 13 15 19… 那么7为第三个幸运数,后面的幸运数,依此类推,移除之后剩下的数字都是幸运数。 现在我们需要你求出给定的mn之间的幸运数的个数: 例如:给定1 20,那么个数为:5(5个幸运数分别是1,3,7,13,19) 现在要求用户输入两个数mn(m<n<=1000*1000),输出幸运数的个数。 例如: 用户输入: 1 20 程序输出: 5 格式:小四,1.5倍行距
评论 82
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值