Skip to content

🚨 Build a Student Grade Manager in Java That’ll Blow Your Mind! (No Frameworks Needed!) πŸš€

“Think Java is boring? Wait till you build a full-blown Student Grade Management System with just Swing and JDBC. No Spring, No JavaFX β€” just pure power!”


πŸ§‘β€πŸŽ“ What Are We Building?

A desktop application that lets you:

βœ… Add new students
βœ… Update existing grades
βœ… Delete student records
βœ… View all data in a table

All using Java Swing and SQLite (JDBC) β€” no third-party libraries.


πŸ”§ Technologies Used

ToolPurpose
JavaLanguage
SwingGUI (Graphical User Interface)
SQLiteLightweight database
JDBCDatabase connectivity

πŸ—οΈ Project Structure





StudentGradeApp/
β”œβ”€β”€ Student.java          # Model class
β”œβ”€β”€ DatabaseHelper.java   # Database utility
β”œβ”€β”€ StudentDAO.java       # Data Access Object
β”œβ”€β”€ StudentApp.java       # GUI (main class)
└── students.db           # SQLite database

πŸ“„ 1. Student.java – The Model

public class Student {
    private int id;
    private String name;
    private double grade;

    public Student(int id, String name, double grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    // Getters and setters
    public int getId() { return id; }
    public String getName() { return name; }
    public double getGrade() { return grade; }

    public void setId(int id) { this.id = id; }
    public void setName(String name) { this.name = name; }
    public void setGrade(double grade) { this.grade = grade; }
}

πŸ” Explanation:
This class holds student data. It’s a simple POJO (Plain Old Java Object) with fields, a constructor, and getters/setters.


πŸ”Œ 2. DatabaseHelper.java – SQLite Connector

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseHelper {
    private static final String URL = "jdbc:sqlite:students.db";

    public static Connection connect() throws SQLException {
        return DriverManager.getConnection(URL);
    }
}

πŸ” Explanation:
This class holds student data. It’s a simple POJO (Plain Old Java Object) with fields, a constructor, and getters/setters.


πŸ”Œ 2. DatabaseHelper.java – SQLite Connector

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseHelper {
    private static final String URL = "jdbc:sqlite:students.db";

    public static Connection connect() throws SQLException {
        return DriverManager.getConnection(URL);
    }
}

πŸ” Explanation:
This static utility returns a database connection using JDBC.


πŸ’Ύ 3. StudentDAO.java – All DB Operations

import java.sql.*;
import java.util.*;

public class StudentDAO {

    public static void createTable() {
        String sql = "CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY, name TEXT, grade REAL)";
        try (Connection conn = DatabaseHelper.connect(); Statement stmt = conn.createStatement()) {
            stmt.execute(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void insertStudent(Student student) {
        String sql = "INSERT INTO students(id, name, grade) VALUES(?, ?, ?)";
        try (Connection conn = DatabaseHelper.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, student.getId());
            pstmt.setString(2, student.getName());
            pstmt.setDouble(3, student.getGrade());
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static List<Student> getAllStudents() {
        List<Student> list = new ArrayList<>();
        String sql = "SELECT * FROM students";
        try (Connection conn = DatabaseHelper.connect(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                list.add(new Student(rs.getInt("id"), rs.getString("name"), rs.getDouble("grade")));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    public static void updateStudent(Student student) {
        String sql = "UPDATE students SET name = ?, grade = ? WHERE id = ?";
        try (Connection conn = DatabaseHelper.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, student.getName());
            pstmt.setDouble(2, student.getGrade());
            pstmt.setInt(3, student.getId());
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void deleteStudent(int id) {
        String sql = "DELETE FROM students WHERE id = ?";
        try (Connection conn = DatabaseHelper.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, id);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

πŸ” Explanation:

  • createTable() creates the table if it doesn’t exist.
  • insertStudent() adds a new student.
  • getAllStudents() fetches all records.
  • updateStudent() updates name and grade.
  • deleteStudent() removes by ID.

πŸ–ΌοΈ 4. StudentApp.java – GUI Logic





import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import java.util.List;

public class StudentApp extends JFrame {
    private JTextField idField, nameField, gradeField;
    private JTable table;
    private DefaultTableModel model;

    public StudentApp() {
        super("Student Grade Manager");

        // Input Form
        JPanel form = new JPanel(new GridLayout(4, 2));
        idField = new JTextField();
        nameField = new JTextField();
        gradeField = new JTextField();

        form.add(new JLabel("ID:"));
        form.add(idField);
        form.add(new JLabel("Name:"));
        form.add(nameField);
        form.add(new JLabel("Grade:"));
        form.add(gradeField);

        JButton addBtn = new JButton("Add");
        JButton updateBtn = new JButton("Update");
        JButton deleteBtn = new JButton("Delete");

        form.add(addBtn);
        form.add(updateBtn);

        // Table
        model = new DefaultTableModel(new String[]{"ID", "Name", "Grade"}, 0);
        table = new JTable(model);
        JScrollPane tablePane = new JScrollPane(table);

        // Layout setup
        setLayout(new BorderLayout());
        add(form, BorderLayout.NORTH);
        add(tablePane, BorderLayout.CENTER);
        add(deleteBtn, BorderLayout.SOUTH);

        // Button Actions
        addBtn.addActionListener(e -> addStudent());
        updateBtn.addActionListener(e -> updateStudent());
        deleteBtn.addActionListener(e -> deleteStudent());

        table.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                int row = table.getSelectedRow();
                idField.setText(model.getValueAt(row, 0).toString());
                nameField.setText(model.getValueAt(row, 1).toString());
                gradeField.setText(model.getValueAt(row, 2).toString());
            }
        });

        loadTable();

        setSize(500, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void loadTable() {
        model.setRowCount(0);
        List<Student> students = StudentDAO.getAllStudents();
        for (Student s : students) {
            model.addRow(new Object[]{s.getId(), s.getName(), s.getGrade()});
        }
    }

    private void addStudent() {
        try {
            int id = Integer.parseInt(idField.getText());
            String name = nameField.getText();
            double grade = Double.parseDouble(gradeField.getText());
            StudentDAO.insertStudent(new Student(id, name, grade));
            loadTable();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Invalid input.");
        }
    }

    private void updateStudent() {
        try {
            int id = Integer.parseInt(idField.getText());
            String name = nameField.getText();
            double grade = Double.parseDouble(gradeField.getText());
            StudentDAO.updateStudent(new Student(id, name, grade));
            loadTable();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Invalid input.");
        }
    }

    private void deleteStudent() {
        try {
            int id = Integer.parseInt(idField.getText());
            StudentDAO.deleteStudent(id);
            loadTable();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Invalid input.");
        }
    }

    public static void main(String[] args) {
        StudentDAO.createTable();
        new StudentApp();
    }
}

πŸ” Explanation:

  • GUI has 3 fields: ID, Name, Grade.
  • Buttons trigger add, update, delete actions.
  • Table reflects live changes.
  • Click on a table row to load data into the form.

πŸ§ͺ Sample Workflow

  1. Run the app
  2. Enter student info β†’ click Add
  3. Select row β†’ edit β†’ click Update
  4. Click Delete to remove a record

βœ… All actions instantly reflect in the table.


🎁 Bonus Ideas

  • Add a search box to filter students
  • Add input validation (e.g., name must be letters)
  • Export data to CSV or Excel
  • Use JavaFX for a modern UI

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *