java-课后作业-JDBC-学生信息管理系统----

这是一个使用Java和SQLite实现的学生信息管理系统作业。系统包括登录界面和信息管理界面,支持对数据库的增删改查操作。登录界面验证用户名和密码,信息管理界面实时显示数据库记录,提供添加、修改和删除功能,对输入数据进行合法性检查。
摘要由CSDN通过智能技术生成

作业要求:

作业要求

  1. 根据以上登陆界面内容设计一个数据表, 要求用户正确的输入用户名和密码允许用户登陆, 否则输出密码或用户名不正确.
  2. 根据下面要求编写程序
    • 设计一个图形界面
    • 在数据库中建立一个表
      • 表名为学生
      • 表结构为:学号, 姓名, 性别, 年龄, JAVA语言, 数据结构, 数据库, 总分
    • 功能要求: 实现对对数据库的增, 删, 改, 查操作

界面展示与功能说明

  • 本次作业使用SQLite作为数据库系统 SQLite JDBC.

登录界面:

登录界面

  • 数据库中有三个字段, 分别为递增整数主键id, 表中唯一且可索引的可变长字符串(最长32个字符)字段username与64字节定长字节字段password(用来储存使用SHA-512进行散列的密码).
  • 数据库中初始化了用户名为admin, 散列前密码也为admin的管理员账户.
  • 当输入的用户名不存在或用户名对应的密码不一致时, 点击确定按钮将弹出一个提示框.
  • 点击取消按钮将结束程序.
  • 当输入的用户名存在且数据库中的密码散列与输入框中的密码散列后的字节串相同, 点击确定按钮将弹出一个提示框.
  • 单击确定后将隐藏登录界面并进入信息管理页面.

信息管理界面:

信息管理界面

初始状态:
  • 程序UI由左侧的显示面板与右侧的操作面板组成, 单击窗口关闭按钮将退出程序.
  • 左侧显示面板实时显示数据库对应表中所有的记录与字段, 并具有滚动条进行翻页.
  • 操作面板提供数据的增删改查功能, 并依靠业务逻辑设置按钮的活动与禁用, 以避免数据库的错误操作.
添加记录:
  • 在右侧数据编辑面板编辑需要添加字段的信息.
  • 学号必须为10位字符, 若不为10位字符, 则禁用添加, 修改与删除按钮.
  • 若学号为10位字符且在数据库中具有能够匹配相应记录(学号为唯一字段), 则更新其他输入框中的内容并激活修改与删除按钮并禁用添加按钮, 可以使用该功能通过学号查询对应学生的信息.
  • 若学号为10位字符且在数据库中没有能与其匹配的相应记录(学号为唯一字段), 则更新其他输入框中的内容并激活添加按钮并禁用修改与删除按钮.
  • 若在添加时成绩具有小数点后第三位或更小的位数, 则会对小数点后第三位进行四舍五入操作.
  • 性别下拉选项框可以在其选项中选择, 也可以通过单击选项框直接编辑.
  • 若三门课的成绩不在0~100范围内, 则在点击添加按钮 / 点击修改按钮 / 输入完成后单击回车键时弹出一个提示框.
    • 该提示框单击确定按钮后程序将不进行任何数据库操作, 直到所有数据都合理规范.
    • 若在输入完成后单击回车键时弹出该对话框, 则会清除该输入框中的不合理数据.
  • 若三门课成绩的输入框与年龄的输入框中存在非法字符, 则在点击添加按钮 / 点击修改按钮 / 输入完成后单击回车键时弹出一个提示框.
    • 若在输入完成后单击回车键时弹出该对话框, 则会清除该输入框中的不合理数据.
修改记录:
  • 在三门课程成绩的输入框中输入数据后单击回车键则会对输入框中的字符串进行处理, 若字符串可以解析为一个数字且其数值在0~100范围内, 则会保留两位小数并对小数点后第三位(若有)进行四舍五入操作.
  • 总成绩不可编辑, 由系统对三门课程的成绩自动进行求和.
  • 左侧信息显示区不能直接编辑, 但是单击对应的记录后该记录的信息将更新到右侧信息编辑区, 在编辑区便可以对数据进行修改, 修改完成后点击修改按钮则将修改后的字段同步更新至数据库, 左侧显示区也会自动刷新.
  • 左侧信息显示区中的记录将会按照学号递增的顺序排序.
  • 四个操作按钮(刷新/添加/修改/删除)响应后左侧显示区均会进行刷新.
删除记录:
  • 只有在数据库中存在对应学号的记录时删除按钮才会激活.
  • 删除后编辑区信息不会改变, 若误操作可以单击添加按钮将删除的信息重新添加进数据库.

程序源代码

package assignment.week_12;

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

import java.awt.event.*;
import java.awt.*;

import java.sql.*;

import java.util.*;

import java.security.*;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class StudentManage implements ActionListener
{
   
    private JLabel              label_username;
    private JLabel              label_password;
    private JTextField          field_username;
    private JPasswordField      field_password;
    private Button              button_login;
    private Button              button_exit;
    private JFrame              frame_login;

    private Connection          connection;

    private StudentInfoManage   student_info_manage;

    private static final String username = "admin";
    private static final String password = "admin";

    private static final String JDriver  = "org.sqlite.JDBC";
    private static final String conURL   = "jdbc:sqlite:assignment\\assignment.db";

    public static void main(String arg[])
    {
   
        // UserLogin.init();
        // StudentInfoManage.init();
        new StudentManage().run();
    }

    public static void init()
    {
   
        try {
   
            Class.forName(JDriver); // 加载JDBC驱动程序
        } catch (java.lang.ClassNotFoundException e) {
   
            System.out.println("ForName: " + e.getMessage());
        }
        try {
   
            Connection connection = DriverManager.getConnection(conURL); // 连接数据库URL

            Statement statement = connection.createStatement(); // 建立Statement类对象
            String query = "CREATE TABLE USER(" // 表名USER
                    + "id INTEGER NOT NULL UNIQUE PRIMARY KEY AUTOINCREMENT," // 自增长ID, 设为主键, 唯一
                    + "username VARCHAR(32) NOT NULL UNIQUE," // 用户名最大32字符, 唯一
                    + "password BINARY(64) NOT NULL" // 密码使用SHA-512散列算法, 长度位64字节
                    + ");";
            query += "CREATE UNIQUE INDEX index_user ON USER (id, username);"; // 为id与username创建唯一索引
            statement.executeUpdate(query); // 执行SQL命令
            statement.close(); // 释放Statement所连接的数据库及JDBC资源

            PreparedStatement p_statement = connection.prepareStatement("INSERT INTO USER(username, password) values(?, ?);");
            p_statement.setString(1, StudentManage.username);
            p_statement.setBytes(2, getHashBiteString(StudentManage.password));
            p_statement.executeUpdate(); // 执行SQL命令, 建立管理员账户(用户名:admin 密码:admin)
            p_statement.close();

            connection.close(); // 关闭与数据库的连线
        } catch (SQLException e) {
   
            JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
        }
    }

    public StudentManage()
    {
   
        try {
   
            Class.forName(JDriver); // 加载JDBC驱动程序
            this.connection = DriverManager.getConnection(conURL); // 连接数据库URL
        } catch (java.lang.ClassNotFoundException e) {
   
            JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        } catch (SQLException e) {
   
            JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
    }

    protected void finalize()
    {
   
        try {
   
            this.connection.close();
        } catch (SQLException e) {
   
            JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
    }

    public void run()
    {
   
        this.frame_login = new JFrame("登录");
        frame_login.setSize(300, 200);
        frame_login.setLocation(500, 300);
        frame_login.setBackground(Color.lightGray);
        frame_login.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame_login.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.CENTER; // 组件在显示区域居中对齐
        gbc.fill = GridBagConstraints.BOTH; // 设置组件填充区域
        gbc.insets = new Insets(10, 5, 10, 5); // 设置与显示区域边缘的位置

        this.label_username = new JLabel("用户名", JLabel.LEFT);
        this.label_password = new JLabel("密码", JLabel.LEFT);
        this.field_username = new JTextField(20);
        this.field_password = new JPasswordField(20);
        this.button_login = new Button("确定");
        this.button_exit = new Button("取消");

        Container frame_contain = frame_login.getContentPane(); // 获取窗口的内容窗格
        addComponent(label_username, frame_contain, gbc, 0, 0, 1, 1, 1, 1);
        addComponent(field_username, frame_contain, gbc, 0, 1, 3, 1, 3, 1);
        addComponent(label_password, frame_contain, gbc, 1, 0, 1, 1, 1, 1);
        addComponent(field_password, frame_contain, gbc, 1, 1, 3, 1, 3, 1);
        addComponent(button_login, frame_contain, gbc, 2, 1, 1, 1, 1, 1);
        addComponent(button_exit, frame_contain, gbc, 2, 3, 1, 1, 1, 1);

        this.button_login.addActionListener(this);
        this.button_exit.addActionListener(this);
        frame_login.setVisible(true);
    }

    private void addComponent(Component c, Container contain, GridBagConstraints gbc, int row, int column, int width, int height, int weightx, int weighty)
    {
   
        gbc.gridy = row; // 第几行的格子
        gbc.gridx = column; // 第几列的格子
        gbc.gridwidth = width; // 占用几列格子
        gbc.gridheight = height; // 占用几行格子
        gbc.weightx = weightx; // 行方向分配的权重
        gbc.weighty = weighty; // 列方向分配的权重
        gbc.ipadx = 2; // 左右边缘的空白距离
        gbc.ipady = 2; // 上下边缘的空白距离
        contain.add(c, gbc); // 将组件c按照约束条件gbc添加到容器contain中
    }

    // 获得字符串的摘要
    private static byte[] getHashBiteString(String str)
    {
   
        try {
   
            MessageDigest digest = MessageDigest.getInstance("SHA-512");
            // digest.update(String.valueOf(str).getBytes());
            // return new ByteArrayInputStream(digest.digest());
            return digest.digest(str.getBytes());
        } catch (NoSuchAlgorithmException e) {
   
            JOptionPane.showMessageDialog(null, String.format("异常信息:\n%s\n%s", e.toString(), e.getStackTrace()), "运行时异常", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
        return null;
    }

    public void actionPerformed(ActionEvent event)
    
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值