Pertemuan 08 - Database Presensi Pegawai

Pertemuan 08 - Database Presensi Pegawai

Membuat database presensi pegawai, tabel utama, data awal, query dasar, dan koneksi Java ke MySQL.

Tujuan Praktikum

Pada pertemuan ini mahasiswa mempraktikkan pembuatan database presensi pegawai sampai aplikasi Java berhasil terhubung ke MySQL.

  1. Mahasiswa mampu membuat database db_presensi_pegawai.
  2. Mahasiswa mampu membuat tabel bagian, pegawai, users, dan presensi.
  3. Mahasiswa mampu mengisi data awal langsung melalui phpMyAdmin / MySQLFront.
  4. Mahasiswa mampu menjalankan query dasar untuk mengecek data.
  5. Mahasiswa mampu menambahkan library MySQL Connector/J ke project.
  6. Mahasiswa mampu membuat file koneksi database di Java.
  7. Mahasiswa mampu mengetes koneksi Java ke MySQL.

Persiapan

Sebelum praktik, pastikan kebutuhan berikut sudah tersedia.

text
Kebutuhan praktikum:
- NetBeans
- Apache Tomcat
- MySQL / MariaDB
- phpMyAdmin / MySQLFront
- Project Java Web
- MySQL Connector/J

File library yang digunakan:

text
mysql-connector-j-x.x.x.jar

Contoh:

text
mysql-connector-j-8.4.0.jar

Letakkan file .jar ke folder berikut:

text
web/WEB-INF/lib/

Struktur folder:

text
web/
└── WEB-INF/
    └── lib/
        └── mysql-connector-j-8.4.0.jar

Konsep Singkat

Database digunakan untuk menyimpan data aplikasi secara permanen.

Pada aplikasi presensi pegawai, data utama yang dibutuhkan adalah:

  1. Data bagian atau divisi pegawai.
  2. Data pegawai.
  3. Data user untuk login.
  4. Data presensi harian pegawai.

Relasi tabel yang digunakan:

text
bagian 1 --- * pegawai
pegawai 1 --- * presensi
pegawai 1 --- 1 users

Penjelasan singkat:

  • Satu bagian dapat memiliki banyak pegawai.
  • Satu pegawai dapat memiliki banyak data presensi.
  • Satu pegawai dapat memiliki satu akun user.
  • User admin boleh tidak terhubung ke pegawai, sehingga id_pegawai pada tabel users dibuat NULL.

Langkah 1

Buka phpMyAdmin / MySQLFront, lalu buat database baru.

sql
CREATE DATABASE db_presensi_pegawai;

USE db_presensi_pegawai;

Pastikan database db_presensi_pegawai sudah aktif sebelum membuat tabel.

Langkah 2

Buat tabel bagian.

sql
CREATE TABLE bagian (
    id_bagian INT AUTO_INCREMENT PRIMARY KEY,
    nama_bagian VARCHAR(100) NOT NULL
);

Isi data awal bagian.

sql
INSERT INTO bagian (nama_bagian) VALUES
('Keuangan'),
('IT'),
('HRD'),
('Administrasi');

Cek data bagian.

sql
SELECT * FROM bagian;

Langkah 3

Buat tabel pegawai.

sql
CREATE TABLE pegawai (
    id_pegawai INT AUTO_INCREMENT PRIMARY KEY,
    nip VARCHAR(30) NOT NULL UNIQUE,
    nama_pegawai VARCHAR(100) NOT NULL,
    jenis_kelamin ENUM('L', 'P') NOT NULL,
    no_hp VARCHAR(20),
    alamat TEXT,
    id_bagian INT NOT NULL,
    status_pegawai ENUM('Aktif', 'Nonaktif') DEFAULT 'Aktif',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (id_bagian) REFERENCES bagian(id_bagian)
);

Isi data awal pegawai.

sql
INSERT INTO pegawai 
(nip, nama_pegawai, jenis_kelamin, no_hp, alamat, id_bagian)
VALUES
('PGW001', 'Andi Saputra', 'L', '081234567890', 'Tangerang', 1),
('PGW002', 'Siti Aminah', 'P', '081234567891', 'Jakarta', 2),
('PGW003', 'Budi Santoso', 'L', '081234567892', 'Bekasi', 3);

Cek data pegawai.

sql
SELECT * FROM pegawai;

Cek data pegawai beserta nama bagian.

sql
SELECT 
    p.id_pegawai,
    p.nip,
    p.nama_pegawai,
    p.jenis_kelamin,
    p.no_hp,
    p.alamat,
    b.nama_bagian,
    p.status_pegawai
FROM pegawai p
JOIN bagian b ON p.id_bagian = b.id_bagian;

Langkah 4

Buat tabel users.

sql
CREATE TABLE users (
    id_user INT AUTO_INCREMENT PRIMARY KEY,
    id_pegawai INT NULL,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role ENUM('admin', 'pegawai') NOT NULL,
    status_user ENUM('Aktif', 'Nonaktif') DEFAULT 'Aktif',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (id_pegawai) REFERENCES pegawai(id_pegawai)
);

Isi data awal user.

sql
INSERT INTO users 
(id_pegawai, username, password, role)
VALUES
(NULL, 'admin', 'admin123', 'admin'),
(1, 'PGW001', 'pegawai123', 'pegawai'),
(2, 'PGW002', 'pegawai123', 'pegawai'),
(3, 'PGW003', 'pegawai123', 'pegawai');

Cek data user.

sql
SELECT * FROM users;

Cek user beserta data pegawai.

sql
SELECT 
    u.id_user,
    u.username,
    u.role,
    u.status_user,
    p.nip,
    p.nama_pegawai
FROM users u
LEFT JOIN pegawai p ON u.id_pegawai = p.id_pegawai;

Langkah 5

Buat tabel presensi.

sql
CREATE TABLE presensi (
    id_presensi INT AUTO_INCREMENT PRIMARY KEY,
    id_pegawai INT NOT NULL,
    tanggal DATE NOT NULL,
    jam_masuk TIME NULL,
    jam_pulang TIME NULL,
    status_presensi ENUM('Hadir', 'Izin', 'Sakit', 'Alpha') DEFAULT 'Hadir',
    keterangan TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (id_pegawai) REFERENCES pegawai(id_pegawai),

    UNIQUE KEY unique_presensi_harian (id_pegawai, tanggal)
);

Catatan penting:

text
UNIQUE KEY unique_presensi_harian (id_pegawai, tanggal)

Artinya satu pegawai hanya boleh memiliki satu data presensi pada tanggal yang sama.

Langkah 6

Simulasikan presensi masuk langsung dari query SQL.

sql
INSERT INTO presensi 
(id_pegawai, tanggal, jam_masuk, status_presensi)
VALUES
(1, CURDATE(), CURTIME(), 'Hadir');

Cek data presensi.

sql
SELECT * FROM presensi;

Langkah 7

Simulasikan presensi pulang langsung dari query SQL.

sql
UPDATE presensi
SET jam_pulang = CURTIME()
WHERE id_pegawai = 1
AND tanggal = CURDATE();

Cek hasil presensi.

sql
SELECT 
    pr.id_presensi,
    p.nip,
    p.nama_pegawai,
    pr.tanggal,
    pr.jam_masuk,
    pr.jam_pulang,
    pr.status_presensi
FROM presensi pr
JOIN pegawai p ON pr.id_pegawai = p.id_pegawai;

Langkah 8

Jalankan query laporan presensi sederhana.

sql
SELECT 
    pr.tanggal,
    p.nip,
    p.nama_pegawai,
    b.nama_bagian,
    pr.jam_masuk,
    pr.jam_pulang,
    pr.status_presensi,
    pr.keterangan
FROM presensi pr
JOIN pegawai p ON pr.id_pegawai = p.id_pegawai
JOIN bagian b ON p.id_bagian = b.id_bagian
ORDER BY pr.tanggal DESC, p.nama_pegawai ASC;

Query ini menampilkan data presensi lengkap dengan nama pegawai dan nama bagian.

Langkah 9

Tambahkan MySQL Connector/J ke project.

Langkah di NetBeans:

text
Klik kanan project
→ Properties
→ Libraries
→ Add JAR/Folder
→ pilih mysql-connector-j-x.x.x.jar
→ Apply
→ OK

Pastikan library muncul di bagian:

text
Libraries

Langkah 10

Buat package baru bernama config.

Di dalam package tersebut, buat file:

text
DBConnection.java

Isi kode berikut:

java
package config;

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

public class DBConnection {

    private static final String URL = "jdbc:mysql://localhost:3306/db_presensi_pegawai";
    private static final String USER = "root";
    private static final String PASSWORD = "";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

Sesuaikan USER dan PASSWORD dengan konfigurasi MySQL masing-masing komputer.

Langkah 11

Buat file test koneksi.

Nama file:

text
TestConnection.java

Kode:

java
package config;

import java.sql.Connection;

public class TestConnection {

    public static void main(String[] args) {
        try {
            Connection conn = DBConnection.getConnection();

            if (conn != null) {
                System.out.println("Koneksi database berhasil");
            }

            conn.close();
        } catch (Exception e) {
            System.out.println("Koneksi database gagal");
            e.printStackTrace();
        }
    }
}

Pengujian

Jalankan file TestConnection.java.

Jika koneksi berhasil, output yang muncul:

text
Koneksi database berhasil

Jika koneksi gagal, cek kembali:

text
- MySQL sudah running
- Nama database benar
- Username MySQL benar
- Password MySQL benar
- Port MySQL benar
- MySQL Connector/J sudah masuk project

Troubleshooting

MasalahPenyebabSolusi
Database tidak ditemukanDatabase belum dibuat atau nama database salahJalankan CREATE DATABASE db_presensi_pegawai; lalu pastikan URL JDBC memakai nama database yang sama
Access denied for userUsername atau password MySQL salahSesuaikan USER dan PASSWORD pada DBConnection.java
Connection refusedMySQL belum berjalan atau port salahJalankan service MySQL dan cek port yang digunakan
No suitable driver foundMySQL Connector/J belum masuk projectMasukkan file .jar ke WEB-INF/lib dan tambahkan ke Libraries
Duplicate entry pada presensiPegawai yang sama sudah presensi pada tanggal yang samaGunakan UPDATE untuk jam pulang, bukan INSERT ulang
Foreign key constraint failsData relasi belum tersediaPastikan data bagian dan pegawai sudah ada sebelum insert data terkait

Tugas Praktikum

  1. Buat database db_presensi_pegawai.
  2. Buat tabel bagian, pegawai, users, dan presensi.
  3. Isi data dummy bagian, pegawai, dan user.
  4. Jalankan query cek data pada setiap tabel.
  5. Simulasikan presensi masuk dan presensi pulang.
  6. Jalankan query laporan presensi sederhana.
  7. Tambahkan MySQL Connector/J ke project.
  8. Buat DBConnection.java dan TestConnection.java.
  9. Jalankan test koneksi sampai muncul output Koneksi database berhasil.

Kesimpulan

Pada pertemuan ini mahasiswa sudah membuat database presensi pegawai dari awal, membuat tabel utama, mengisi data awal, menjalankan query dasar, memasang MySQL Connector/J, membuat koneksi Java ke MySQL, dan mengetes koneksi database.

Output akhir yang harus sudah dimiliki:

text
Database db_presensi_pegawai
Tabel bagian
Tabel pegawai
Tabel users
Tabel presensi
Data dummy awal
Query dasar berhasil dijalankan
Library MySQL Connector/J terpasang
DBConnection.java
TestConnection.java
Koneksi Java ke MySQL berhasil