Rabu, 24 April 2013

Membuat Data Entry Part 2

Artikel ini merupakan kelanjutan dari artikel sebelumnya yaitu Membuat Program Data Entry di Netbeans (Part 1 of 3).
Pada bagian ini kita akan buat model dan DAO. Model berfungsi untuk menyimpan state objek pada saat aplikasi dijalankan. Sedangkan DAO digunakan untuk akses ke database. Dalam program ini untuk akses ke database akan digunakan Java Database Connectivity (JDBC). JDBC ini dapat dikatakan sebagai jembatan yang akan menghubungkan program kita dengan DBMS. Pada program ini DBMS yang digunakan yaitu MySQL.
Ok, langsung saja kita masuk ke langkah berikutnya.

Langkah ke-3: Buat Model

Karena di database ada 2 tabel maka kita buat 2 class model juga, UserLogin dan Mahasiswa. Karena di program ini mau pakai data binding, maka class yang dibuat harus mengikuti aturan JavaBeans. Cara  membuat model yang bisa kita gunakan untuk data binding, bisa dilihat di artikel “Beans Binding: Sinkronisasi Model dan View di Java Swing”
Berikut ini model untuk class UserLogin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.model;
 
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
 
/**
 * UserLogin.java
 * Semua atribut dan method getter/setter class ini digenerate dari netbeans lho.
 * Kalau mau tahu caranya bisa lihat http://wp.me/pSRPo-3i
 * @author Hindarwan
 */
public class UserLogin implements Serializable {
 
    private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
    private String username;
    public static final String PROP_USERNAME = "username";
    private String password;
    public static final String PROP_PASSWORD = "password";
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        String oldPassword = this.password;
        this.password = password;
        propertyChangeSupport.firePropertyChange(PROP_PASSWORD, oldPassword, password);
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        String oldUsername = this.username;
        this.username = username;
        propertyChangeSupport.firePropertyChange(PROP_USERNAME, oldUsername, username);
    }
 
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }
 
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
}
Yang ini untuk model class Mahasiswa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.model;
 
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
 
/**
 * Mahasiswa.java
 * Semua atribut dan method getter/setter class ini digenerate dari netbeans lho.
 * Kalau mau tahu caranya bisa lihat http://wp.me/pSRPo-3i
 * @author Hindarwan
 */
public class Mahasiswa implements Serializable {
 
    private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
    private String nim;
    public static final String PROP_NIM = "nim";
    private String nama;
    public static final String PROP_NAMA = "nama";
    private String jenisKelamin;
    public static final String PROP_JENISKELAMIN = "jenisKelamin";
    private String alamat;
    public static final String PROP_ALAMAT = "alamat";
    private String kelas;
    public static final String PROP_KELAS = "kelas";
    private String status;
    public static final String PROP_STATUS = "status";
 
    public String getKelas() {
        return kelas;
    }
 
    public void setKelas(String kelas) {
        String oldKelas = this.kelas;
        this.kelas = kelas;
        propertyChangeSupport.firePropertyChange(PROP_KELAS, oldKelas, kelas);
    }
 
    public String getAlamat() {
        return alamat;
    }
 
    public void setAlamat(String alamat) {
        String oldAlamat = this.alamat;
        this.alamat = alamat;
        propertyChangeSupport.firePropertyChange(PROP_ALAMAT, oldAlamat, alamat);
    }
 
    public String getJenisKelamin() {
        return jenisKelamin;
    }
 
    public void setJenisKelamin(String jenisKelamin) {
        String oldJenisKelamin = this.jenisKelamin;
        this.jenisKelamin = jenisKelamin;
        propertyChangeSupport.firePropertyChange(PROP_JENISKELAMIN, oldJenisKelamin, jenisKelamin);
    }
 
    public String getNama() {
        return nama;
    }
 
    public void setNama(String nama) {
        String oldNama = this.nama;
        this.nama = nama;
        propertyChangeSupport.firePropertyChange(PROP_NAMA, oldNama, nama);
    }
 
    public String getNim() {
        return nim;
    }
 
    public void setNim(String nim) {
        String oldNim = this.nim;
        this.nim = nim;
        propertyChangeSupport.firePropertyChange(PROP_NIM, oldNim, nim);
    }
 
    public String getStatus() {
        return status;
    }
 
    public void setStatus(String status) {
        String oldStatus = this.status;
        this.status = status;
        propertyChangeSupport.firePropertyChange(PROP_STATUS, oldStatus, status);
    }
 
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }
 
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
}
Ingat bahwa method getter setter dari class UserLogin dan Mahasiswa itu bisa digenerate lewat netbeans. Silahkan baca artikel “Beans Binding: Sinkronisasi Model dan View di Java Swing” untuk mengetahui caranya.

Langkah ke-4: Buat DAO + Implementasinya

Setelah buat model, sekarang saatnya buat Data Access Object (DAO). DAO berupa interface yang terdiri dari method-method seperti insert, update, delete, getBy, getAll, dll tergantung kebutuhan.
Berikut interface UserLoginDao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.dao;
 
/**
 * UserLoginDao.java Interface ini hanya punya satu method yaitu getUserLogin
 * yang digunakan untuk mengambil data username dan password dari database.
 *
 * @author Hindarwan
 */
public interface UserLoginDao {
 
    public boolean getUserLogin(String username, String password) throws Exception;
}
Dan ini merupakan implementasinya.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.dao.impl;
 
import com.wordpress.erenha.java.desktop.entry.dao.UserLoginDao;
import com.wordpress.erenha.java.desktop.entry.utility.DatabaseUtility;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
/**
 * UserLoginDaoImpl.java
 * Implementasi dari interface UserLoginDao
 * @author Hindarwan
 */
public class UserLoginDaoImpl implements UserLoginDao {
 
    private Connection connection;
    private final String getUserLoginQuery =
            "SELECT * FROM user_login WHERE username = ? AND password = MD5(?)";
 
    @Override
    public boolean getUserLogin(String username, String password) throws Exception {
        PreparedStatement statement = null;
        try {
            connection = DatabaseUtility.getConnection();
            connection.setAutoCommit(false);
 
            statement = connection.prepareStatement(getUserLoginQuery);
            statement.setString(1, username);
            statement.setString(2, password);
            ResultSet resultSet = statement.executeQuery();
            connection.commit();
            if (resultSet.next()) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            connection.rollback();
            throw ex;
        } finally {
            connection.setAutoCommit(true);
            if (statement != null) {
                statement.close();
            }
        }
    }
}
Interface MahasiswaDao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.dao;
 
import com.wordpress.erenha.java.desktop.entry.model.Mahasiswa;
 
/**
 * MahasiswaDao.java
 * Setidaknya ada 4 method yang dibutuhkan untuk akses tabel mahasiswa yaitu
 * insert, update, delete, dan getByNim
 * @author Hindarwan
 */
public interface MahasiswaDao {
 
    public void insert(Mahasiswa mahasiswa) throws Exception;
 
    public void update(Mahasiswa mahasiswa) throws Exception;
 
    public void delete(String nim) throws Exception;
 
    public Mahasiswa getByNim(String nim) throws Exception;
}
Implementasi MahasiswaDao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.dao.impl;
 
import com.wordpress.erenha.java.desktop.entry.dao.MahasiswaDao;
import com.wordpress.erenha.java.desktop.entry.model.Mahasiswa;
import com.wordpress.erenha.java.desktop.entry.utility.DatabaseUtility;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
/**
 * MahasiswaDaoImpl.java
 * Implementasi dari interface MahasiswaDao
 * @author Hindarwan
 */
public class MahasiswaDaoImpl implements MahasiswaDao {
 
    private Connection connection;
    private final String insertQuery =
            "INSERT INTO mahasiswa VALUES (?,?,?,?,?,?)";
    private final String updateQuery =
            "UPDATE mahasiswa SET nama = ?, jenis_kelamin = ?, "
            + "alamat = ?, kelas = ?, status = ? WHERE nim = ?";
    private final String deleteQuery =
            "DELETE from mahasiswa WHERE nim = ?";
    private final String getByNimQuery =
            "SELECT * FROM mahasiswa WHERE nim = ?";
 
    @Override
    public void insert(Mahasiswa mahasiswa) throws Exception {
        PreparedStatement statement = null;
        try {
            connection = DatabaseUtility.getConnection();
            connection.setAutoCommit(false);
 
            statement = connection.prepareStatement(insertQuery);
            statement.setString(1, mahasiswa.getNim());
            statement.setString(2, mahasiswa.getNama());
            statement.setString(3, mahasiswa.getJenisKelamin());
            statement.setString(4, mahasiswa.getAlamat());
            statement.setString(5, mahasiswa.getKelas());
            statement.setString(6, mahasiswa.getStatus());
            statement.execute();
 
            connection.commit();
 
        } catch (SQLException ex) {
            connection.rollback();
            throw ex;
        } finally {
            connection.setAutoCommit(true);
            if (statement != null) {
                statement.close();
            }
        }
    }
 
    @Override
    public void update(Mahasiswa mahasiswa) throws Exception {
        PreparedStatement statement = null;
        try {
            connection = DatabaseUtility.getConnection();
            connection.setAutoCommit(false);
 
            statement = connection.prepareStatement(updateQuery);
            statement.setString(1, mahasiswa.getNama());
            statement.setString(2, mahasiswa.getJenisKelamin());
            statement.setString(3, mahasiswa.getAlamat());
            statement.setString(4, mahasiswa.getKelas());
            statement.setString(5, mahasiswa.getStatus());
            statement.setString(6, mahasiswa.getNim());
            statement.execute();
 
            connection.commit();
 
        } catch (SQLException ex) {
            connection.rollback();
            throw ex;
        } finally {
            connection.setAutoCommit(true);
            if (statement != null) {
                statement.close();
            }
        }
    }
 
    @Override
    public void delete(String nim) throws Exception {
        PreparedStatement statement = null;
        try {
            connection = DatabaseUtility.getConnection();
            connection.setAutoCommit(false);
 
            statement = connection.prepareStatement(deleteQuery);
            statement.setString(1, nim);
            statement.execute();
 
            connection.commit();
 
        } catch (SQLException ex) {
            connection.rollback();
            throw ex;
        } finally {
            connection.setAutoCommit(true);
            if (statement != null) {
                statement.close();
            }
        }
    }
 
    @Override
    public Mahasiswa getByNim(String nim) throws Exception {
        PreparedStatement statement = null;
        try {
            connection = DatabaseUtility.getConnection();
            connection.setAutoCommit(false);
 
            statement = connection.prepareStatement(getByNimQuery);
            statement.setString(1, nim);
            ResultSet resultSet = statement.executeQuery();
            Mahasiswa mahasiswa = null;
            if (resultSet.next()) {
                mahasiswa = new Mahasiswa();
                mahasiswa.setNim(resultSet.getString("nim"));
                mahasiswa.setNama(resultSet.getString("nama"));
                mahasiswa.setJenisKelamin(resultSet.getString("jenis_kelamin"));
                mahasiswa.setAlamat(resultSet.getString("alamat"));
                mahasiswa.setKelas(resultSet.getString("kelas"));
                mahasiswa.setStatus(resultSet.getString("status"));
            }
            connection.commit();
            return mahasiswa;
        } catch (SQLException ex) {
            connection.rollback();
            throw ex;
        } finally {
            connection.setAutoCommit(true);
            if (statement != null) {
                statement.close();
            }
        }
    }
}
Ok setelah kita buat model dan DAO + implementasinya pada artikel selanjutnya kita akan buat View (User Interface) dan Controller.

Minggu, 21 April 2013

Membuat Program Data Entry Part 1

Tak dapat dipungkiri, sudah banyak tutorial-tutorial tentang pembuatan program data entry.  Di sini saya hanya akan sekedar share ilmu yang saya dapat setelah beberapa bulan yang lalu, saya dan teman saya mengerjakan project program data entry. Tulisan ini dibuat agar saya tidak lupa dan mungkin bisa bermanfaat bagi teman-teman yang nyasar ke blog ini.
Selama proses pembuatan program tersebut, kami banyak dibantu oleh berbagai pihak. Dari kakak tingkat (terima kasih atas source code program data entry tahun lalu hehe), mas eko (thanks for video Swing MVC-nya),  stackoverflow  (for the answer of how to fix error in our program), Tanya Java (utk saran data binding-nya), dan lain-lain.
Ok cukup basa-basinya. Dalam tutorial ini terdiri dari beberapa bagian yaitu,
  1. Buat Database
  2. Buat Koneksi database dgn JDBC
  3. Buat Model
  4. Buat DAO + implementasinya
  5. Buat View  + binding dengan Model
  6. Buat Controller + Test
Biar ada gambaran nantinya program jadinya seperti apa, saya kasih screenshoot-nya.
  
Jika ada yang tanya, kok cuma gitu doank sih? Ya memang gitu doank, di sini saya tidak akan membahas program data entry yg kami buat. Design GUI ini saya ambil dari latihan mata kuliah OOP praktek dengan sedikit perubahan. Aplikasi sederhana ini, hanya terdiri dari dua form, Form utk login dan form untuk entry data.

Langkah ke-1: Buat Database

Ok langsung aja kita masuk ke bagian pertama, buat database. Di sini saya akan memakai MySql sebagai DBMS. Untuk pembuatan Data Definition Language (DDL) saya akan buat di netbeans.
Sebenarnya untuk membuat database ini, bisa juga dilakukan lewat MySQL administration yang lain seperti, phpMyAdmin, MySQL Query Browser, atau langsung lewat MySQL Command Line  Client. Silahkan langsung menuju langkah ke-2 jika Anda sudah membuat database lewat tool-tool tersebut. (Saya sendiri lebih senang pakai phpMyAdmin :-) )
Jika ingin mencoba membuat database di netbeans silahkan ikuti langkah berikut ini.
Masuk ke Services Window, klik kanan Menu Databases > Register MySQL Server…
Kemudian akan muncul dialog MySQL Server Properties. Isikan sesuai dengan konfigurasi MySQL Anda. Misal: seperti di bawah ini.
Setelah muncul node MySQL Server di Service Window, klik kanan > Start untuk menjalankan mysql server.  Jika MySQL server sudah berhasil dijalankan, kita buat databasenya, Klik kanan node MySQL server> Create Database… Beri nama database “data_entry_mahasiswa” > OK.
Maka akan terbentuk database baru dengan nama “data_entry_mahasiswa”. Klik kanan pada database tersebut > Connect.
Setelah membuat databasenya, kita buat table-tabelnya. Terdapat dua table, yaitu table user_login dan mahasiswa. Berikut langkah untuk membuatnya.
Pada node connection “jdbc:mysql://localhost:3306/data_entry_mahasiswa [root on Default schema]”  Pilih database yang kita buat, Tables > Execute Command…
Isikan SQL command seperti di bawah ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- tabel user login
CREATE TABLE user_login (
     username VARCHAR(30) NOT NULL,
     password VARCHAR(32) NOT NULL,
     PRIMARY KEY (username)
)ENGINE=INNODB;
 
-- tabel mahasiswa
CREATE TABLE mahasiswa (
     nim CHAR(7) NOT NULL,
     nama VARCHAR(30) NOT NULL,
     jenis_kelamin ENUM("Laki-laki", "Perempuan"),
     alamat VARCHAR(50),
     kelas VARCHAR(4),
     status ENUM("Ikatan Dinas", "Tugas Belajar"),
     PRIMARY KEY (nim)
)ENGINE=INNODB;
 
-- asumsi: yang bisa masuk hanya admin
-- password dienkrip menggunakan MD5
INSERT INTO user_login VALUES("admin", MD5("admin"));
Klik Run SQL seperti yang ditunjukkan pada gambar di atas. Akhirnya kita telah berhasil  membuat database program data entry ini. Sekali lagi untuk membuat database ini, bisa juga dilakukan lewat MySQL administration yang lain seperti, phpMyAdmin, MySQL Query Browser, atau langsung lewat MySQL Command Line  Client.

Langkah ke-2: Buat Koneksi database dgn JDBC

Buat Project baru di Netbeans (Java Application), terserah namanya apa.
Karena kita mau pake MySQL, maka kita harus menambahkan driver MySQL JDBC ke project kita. Klik kanan > Folder Libraries > Add Library > MySQL JDBC Driver.
     
Setelah itu buat class DatabaseUtility, code-nya seperti di bawah ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
 *  For more information
 *  my email rn.hindarwan@programmer.net
 */
package com.wordpress.erenha.java.desktop.entry.utility;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
/**
 * DatabaseUtility.java
 * Class yang digunakan untuk membuat koneksi ke database
 * @author Hindarwan
 */
public class DatabaseUtility {
 
    private static Connection connection;
    //driver mysql
    private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
    //mysql url pattern = jdbc:mysql://nama_db_server:db_port/nama_db
    private static final String DB_URL = "jdbc:mysql://localhost:3306/data_entry_mahasiswa";
    //database user default 'root'
    private static final String USER = "root";
    //no password
    private static final String PASSWORD = "";
 
    /**
     * Membuat koneksi ke database sesuai dengan nilai dari
     * final atribut class ini e.g. USER = "root"
     * @return koneksi yang berhasil dibuat
     * @throws SQLException jika koneksi gagal dibuat
     */
    public static Connection getConnection() throws SQLException {
        if (connection == null) {
            try {
                //load driver
                Class.forName(DB_DRIVER).newInstance();
                //koneksi ke database
                connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
            } catch (InstantiationException ex) {
                System.out.println(ex.getMessage());
            } catch (IllegalAccessException ex) {
                System.out.println(ex.getMessage());
            } catch (ClassNotFoundException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return connection;
    }
}
Selesai sudah pembuatan database + koneksinya dengan JDBC.
bersambung ke artikel BERSAMBUNG....,