“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
Tool | Purpose |
---|---|
Java | Language |
Swing | GUI (Graphical User Interface) |
SQLite | Lightweight database |
JDBC | Database 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
- Run the app
- Enter student info β click Add
- Select row β edit β click Update
- 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