题目学生管理系统
一、摘要
在当今互联网行业,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