基于Java+SQL Server开发(PC)学生管理系统【100010054】

news2024/11/24 0:02:29

题目学生管理系统

一、摘要

在当今互联网行业,Java 的使用及热度在各大排行榜中始终位于前列,通过本次课程设计,巩固所学 Java 知识,了解 Java 项目的开发流程。本程序是使用 Java 开发的一款学生管理系统,设计中使用 Swing 工具类制作 GUI 界面,并连接 SQL Server 数据库进行数据的保存,其基本功能有:管理员及用户登录、用户添加、修改密码、退出账户、学生信息的增删改查等,并对修改信息功能做了优化。

关键字:Java、Swing、SQL Server、学生管理系统

题目要求:使用 Java Swing 开发一个管理系统的视图层(View 层),并能对信息进行增删改查。

二、方案说明

​ 使用 Eclipse 开发环境,以 Java 语言为载体,以 Swing 工具类为主、Windows Builder 插件为辅进行 GUI 界面的设计,用 SQL Server 数据库进行学生信息的保存。

​ 通过研究网上各种学生管理系统,汇总其优点,设计出本程序。

  • 学生管理系统要有用户登录才能进行管理学生信息;
  • 要有管理员对用户进行管理;
  • 能修改账户密码以及退出当前账户;
  • 拥有一个主界面,并将各种功能置于菜单栏;
  • 可以对学生信息进行增删改查,其中修改信息时可直接在原有信息上双击进行编辑而不需要填写所有信息,查询时可以查询所有学生信息以及按照班级查找学生信息;
  • 执行完各种功能时有相应的提示框。
    • 在编程时,要按照公司开发一个软件的规范进行开发,进行模块化设计,将每个功能写入不同的类与文件,并按层面分类存放到不同包中。

三、软硬件设计

3.1 工程介绍

  • view 层(视图层):负责项目中的界面布局和输入、输出语句。
  • controller 层(控制层): 获取 view 层界面上的数据,将要实现的功能交给 service 层处理(向后面传值—对用户输入的信息进行封装,向后台请求)。
  • service 层(业务层): 功能的实现,与 controller 层 和 DAO 层交互,将对数据库的操作交给 DAO 数据访问层来处理(通常处理 dao 层抛出的异常)。
  • dao 层(数据访问层):用来操作数据库表的数据(JDBC 负责和数据库打交道,返回的行号 row 不要这层处理)。
  • domain 实体包: 存放 JavaBean(实体类,一个表一个类,最好创建的实体类与数据库里的表的名字和数量都一样)。
  • utils 工具包:存放项目中使用到的工具类(比如 JDBC 里的相同的部分封装成的工具类)。
  • test 测试包:存放项目功能测试的代码(main 方法)。
  • icon 包:存放所用到的图片素材。

3.2 登录界面设计(LoginView 类)

登录时要求用户选择登录状态,即系统管理员或用户,然后输入对应状态的账户和密码,系统会从数据库获取账户和密码信息与输入的账户密码进行比较,根据输入结果的不同会给出不同的提示信息,具体如下:

确认按钮事件响应部分代码:

3.3 主界面设计(PhotoMainView 类)

先使用一个类(MainView)设计出整体布局,并添加菜单栏与对应的事件响应,再用一个类(PhotoMainView)为界面添加图片背景等。

3.4 修改密码

代码实现:

3.5 添加账户

设置为仅管理员账户登录才可以修改密码,增加系统安全性和实际性。

代码实现:

3.6 退出账户

代码实现:

exitItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        mainView.dispose();
        new LoginView().setVisible(true);
    }
});

3.7 增删改查(DataControll 类)

添加账户时,在右侧输入信息,并点击确认添加即可,删除信息时,选中所要删除信息,点击删除所选行即可,修改信息时,双击要修改的信息即可进行修改,查询时,选择查询方式(查询所有人或按班级查询,若为按班级查询,则输入班级),然后点击查询。所有操作都会自动且实时保存到数据库。

点击退出退回主界面。

查询事件响应代码:

button.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        controller = new UserController();
        if (comboBox.getSelectedItem().equals("查询所有人")) {
//					System.out.println(comboBox.getSelectedItem());
            ResultSet rset = controller.select();
            try {
                dtm.setRowCount(0);
                while(rset.next()) {
                    String sno = rset.getString(1);
                    String sname = rset.getString(2);
                    String ssex = rset.getString(3);
                    String sclass = rset.getString(4);
                    String[] row = {sno,sname,ssex,sclass};
                    dtm.addRow(row);
//							System.out.println(Arrays.toString(row));
                }
            } catch (SQLException e1) {
// TODO Auto-generated catch block
                printStackTrace();
            }
        } else if (comboBox.getSelectedItem().equals("按班级查询")) {
            ResultSet rset = controller.select(textField.getText());
            try {
                dtm.setRowCount(0);
                while(rset.next()) {
                    String sno = rset.getString(1);
                    String sname = rset.getString(2);
                    String ssex = rset.getString(3);
                    String sclass = rset.getString(4);
                    String[] row = {sno,sname,ssex,sclass};
                    dtm.addRow(row);
                }
            } catch (SQLException e1) {
// TODO Auto-generated catch block
                printStackTrace();
            }
        }
    }
});

确认添加事件响应代码:

insertButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        controller = new UserController();
        int count = controller.insert(snoField.getText(), snameField.getText(), ssexField.getText(), sclassField.getText());
        if(count > 0) {
            JOptionPane.showMessageDialog(DataControll.this, "添加成功", "提示", JOptionPane.INFORMATION_MESSAGE);
            snoField.setText("");
            snameField.setText("");
            ssexField.setText("");
            sclassField.setText("");
        } else {
            JOptionPane.showMessageDialog(DataControll.this, "添加失败", "提示", JOptionPane.ERROR_MESSAGE);
        }
    }
});

删除当前行事件响应代码:

deleteButton.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        int selectedRow = table.getSelectedRow();
        Student student = new Student(table.getValueAt(selectedRow, 0).toString(), table.getValueAt(selectedRow, 1).toString(), table.getValueAt(selectedRow, 2).toString(), table.getValueAt(selectedRow, 3).toString());
        controller.delete(student.getSno(), student.getSname(), student.getSsex(), student.getSclass());
        dtm.removeRow(selectedRow);
    }
});

退回主界面事件响应代码:

exitButton.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        dataControll.dispose();
        new PhotoMainView().setVisible(true);
    }
});

3.8 数据库操纵(UserDao 类)

//登陆验证用户名或密码是否正确
public int login(String username,String password) throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "select count(*) from users where uname = ? and password = ?";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, username);
    pst.setString(2, password);
    ResultSet rs = pst.executeQuery();
    int count = 0;
    while(rs.next()) {
        count=rs.getInt(1);
    }
    return count;
}
//添加用户
public int insert(User user) throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "insert into users(uname,password) values(?,?)";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, user.getUsername());
    pst.setString(2, user.getPassword());
    int row = pst.executeUpdate();
    JDBCUtils.close(conn, pst);
    return row;
}
//修改密码
public int updatePassword(User user) throws SQLException {
    int row = 0;
    Connection conn = JDBCUtils.getcon();
    String sql = "update users set password=? where uname=? ";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, user.getPassword());
    pst.setString(2, user.getUsername());
    row = pst.executeUpdate();
    JDBCUtils.close(conn, pst);
    return row;
}
//添加学生信息
public int insert(Student student) throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "insert into student(sno,sname,ssex,sclass) values(?,?,?,?)";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, student.getSno());
    pst.setString(2, student.getSname());
    pst.setString(3, student.getSsex());
    pst.setString(4, student.getSclass());
    int row = pst.executeUpdate();
    JDBCUtils.close(conn, pst);
    return row;
}
//修改学生信息
public int update(Student student) throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "update student set sname=?,ssex=?,sclass=? where sno=? ";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, student.getSname());
    pst.setString(2, student.getSsex());
    pst.setString(3, student.getSclass());
    pst.setString(4, student.getSno());
    int row = pst.executeUpdate();
    JDBCUtils.close(conn, pst);
    return row;
}
//删除学生信息
public int delete(Student student) throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "delete from student where sno=? and sname=? and ssex=? and sclass=?";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, student.getSno());
    pst.setString(2, student.getSname());
    pst.setString(3, student.getSsex());
    pst.setString(4, student.getSclass());
    int row = pst.executeUpdate();
    JDBCUtils.close(conn, pst);
    return row;
}
//查询所有人
public ResultSet select() throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "select * from student";
    PreparedStatement pst = conn.prepareStatement(sql);
    ResultSet rs = pst.executeQuery();
    return rs;
}
//按班级查询
public ResultSet select(String sclass) throws SQLException{
    Connection conn = JDBCUtils.getcon();
    String sql = "select * from student where sclass=?";
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setString(1, sclass);
    ResultSet rs = pst.executeQuery();
    return rs;
}

3.9 数据库连接(JDBCUtils)

四、存在问题及解决方法

  • 所连接数据库为 SQL Server(已过时)。
    解决方法:本次连接 SQL Server 数据库是为了巩固 SQL Server 的知识,如果要更换比较流行的数据库,如 MySQL,只需更换数据库驱动并更改一部分代码即可,数据库操作基本没有区别,并且由于采用模块化编程,所以修改简单方便,且不会影响其它层面代码。

  • Java Swing 在工作中使用不多,界面方面多为 HTML、CSS、JS 等页面。
    解决方法:将视图层(View 层)Swing 代码改为 HTML、CSS、JS 代码即可,不会影响其他层面代码。

  • 增添用户及学生信息时,没有判断信息是否已存在或更改是否符合规则。
    解决方法:在相应的事件响应部分添加判断即可。

  • 不能删除用户。
    解决方法:在视图层(View 层)MainView 类的菜单栏上添加上删除用户菜单项,并添加相应的事件响应。

  • 不能从 Excel 导入学生信息或导出信息到 Excel。
    解决方法:在视图层(View 层)DataControll 类中添加导入导出按钮,由于数据库操纵类(UserDao 类)是通用的,所以不需要更改,然后引入 Excel 操纵包,并在按钮事件响应上添加相应代码即可完成 Excel 导入导出功能。

五、总结

​ 通过这次课程设计,巩固了 Java 和 SQL Server 数据库知识,学习了 Swing 制作图形界面,了解了开发一个项目的步骤和规范,在设计中,虽然也遇到了一些问题,但都通过思考与调试解决,通过这些问题我发现了自己的缺点与不足,如在定义变量后会忘记进行初始化等,随着以后的学习,我一定会减少错误的次数甚至避免错误。同时,我也明白了团队合作的重要性,团队分工合作能减少错误的发生,并提高开发效率。通过课程设计,我也对自己未来的学习有了一定的规划。最后感谢老师在课程设计时对我们的指导。

♻️ 资源

在这里插入图片描述
大小: 14.9MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248954

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

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

相关文章

微信开放小程序SDK,几款SDK产品对比分析

前言 这几天看到微信团队推出了一个名为 Donut 的小程序原生语法开发移动应用框架,通俗的讲就是将微信小程序的能力开放给其他的企业,第三方的 App 也能像微信一样运行小程序了。 其实不止微信,面对广阔的B端市场,阿里也早已开放…

kafka学习笔记

1. 官网 ​​​​​​​​​​​​​​​​​​​​​​​​​Apache Kafka 2. akf X轴拆分: 水平复制,就是讲单体系统多运行几个实例,做集群加负载均衡的模式,主主、主备、主从。解决单点,高可用问题 Y轴拆分: 基于不同的业务拆分 Z轴拆…

年底了,千万不要跳槽。

最近不少人在私信问我:做了几年 Java 工程师,现在很迷茫,想跳槽但是感觉底气不足,不知道如何是好。 作为一个资历不浅的 Java 开发,这几年我面试过不少人。发现大多数面试者,虽然看起来工作努力&#xff0…

FPGA 点亮LED灯

设计流程 首先对项目要有一个全局的考虑,分析项目需要几个模块构成,确定各个子模块的关系和信号之间 的相互关系,然后确定模块的端口信号有哪些;根据每个模块的功能并结合芯片、接口的时序手册画 出该模块能正常工作的时序波形图…

CSS3【垂直对齐方式、光标类型、 边框圆角 、overflow溢出部分显示效果 、元素本身隐藏】

文章目录二、装饰2.1 认识基线(了解)2.2 文字对齐问题2.3 垂直对齐方式2.4 小结2.5(拓展)项目中 vertical-align 可以解决的问题2.6 光标类型2.7 边框圆角2.8 边框圆角的常见应用2.9 小结2.10 溢出部分显示效果2.11 小结2.12 元素…

智慧医院信息化建设解决方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。 【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除! 完整资料领取见文末,部分资料内容: 远程会诊 云…

Java的设计模式

本文档是学习后的个人总结,用于备查,如果有冒犯,请联系我删除。 参考文档: 1、简单工厂模式,工厂方法模式,抽象工厂模式 2、Java中常用的设计模式 上面这个链接写的特别清楚,也有代码示例&#…

记一次云服务器EIP出现异常对外攻击的问题

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 首先祝大家圣诞快乐,Merry Christma! 中毒了 今天云主机运维人员告诉我说&#x…

【Flask框架】——26 ORM关联关系

1、表的外键关联 使用SQLAlchemy创建外键非常简单。在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段,必须和主表的主键字段类型保持一致。 这种关联只关注数据表之间的外键关联,不考虑Python对象之间…

ORB-SLAM3代码和算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中,因此在tracking中没有为imu模式设置单独的初始化函数,而IMU的初始化是在localMapping中实现的。 很有用的参考链接:https://cloud.tencent.com/developer/article/1761043 1双目…

【高阶数据结构】搜索二叉树

🌈欢迎来到数据结构专栏~~搜索二叉树 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句…

Word控件Spire.Doc 【评论】教程(2):在 C#、VB.NET 中删除和替换 Word 文档中的注释

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除! 完整资料领取见文末,部分资料内容: 国家档案局证…

MySQL主从搭建

MySQL主从搭建一 主从配置原理二 搭建步骤(基于两个docker容器)三 django实现读写分离3.1 配置数据库3.2 models中创建表3.3 数据库迁移3.4 指定要使用的数据库四 Pycharm远程连接服务器进行代码的运行与调试五 Pycharm远程链接docker开发5.1 操作 docke…

SSM图书管理系统(增强版,附源码)

前篇引入(新人必看):SSM图书管理系统(原版) 之前给大家分享过SSM图书管理系统项目的源码,热度较高,但我也发现功能并不是很全面,所以这次对系统进行了功能增强,以下是系…

新手入门搭建一个spring boot项目

1. 打开Idea,新建一个maven项目,详细情况见下图,(idea版本2021.1.2) 2.查看新建项目的maven包是否存在, 注意:maven包需要自己去下载,注意要下载与版本对应匹配的包 3.导入spring boot 相关的依…

springboot 连接不上 redis 的三种解决方案!

针对于springboot 连接不上 redis 这种情况,首先,我们最简单直接的方法就是需要确认Redis是否已经正常启动(验证方法:如果安装在Linux下的话可以使用ps-ef|grep redis来进行确认是否开启) 如果未开启,我们可…

STL-string的接口使用及模拟实现

文章目录string类的介绍string类的常用接口介绍 构造相关 无参构造字符串构造拷贝构造 容量相关的接口 sizereserveresizecapacityemptyclear 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backoperatorinserterasec_strfind npossubs…

Redis搭建主从集群

搭建集群 建集群的第一件事情我们需要一些运行在 集群模式的Redis实例。这意味这集群并不是由一些普通的Redis实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。 下面是一个最少选项的集群的配置文件…

@Builder注解在子类中使用遇到的问题

场景 在项目开发中,需要基于某个类进行一些字段的拓展,那么自然而然想到的做法是extends该类。而两个类都需要使用Builder进行构造。代码如下: Data Builder AllArgsConstructor NoArgsConstructor public class EmployeeDto {private Stri…