Anda di halaman 1dari 17

MATERI 14

GUI & DATABASE

Buatlah sebuah file properties dengan nama .config.properties . File properties ini
digunakan untuk menyimpan informasi konfigurasi akses database.

Format isi yang terdapat pada file .config.properties dapat dilihat pada bagian
berikut.

server=localhost database=
username= password=

Sesuaikan nilai setelah tanda = dengan konfigurasi database mysql server anda

Kemudian bukalah mysql client (contoh: phpmyadmin) dan buatlah sebuah


database baru dengan nama todo

Pada database tersebut buatlah dua tabel users dan todos dengan schema
seperti berikut.
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT ' ',
`username` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `todos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,

45
`todo` varchar(255) NOT NULL,
`done` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_todo_users_idx` (`user_id`),
CONSTRAINT `fk_todo_users` FOREIGN KEY (`user_id`)
REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO
ACT
);

Bukalah IDE netbeans, kemudian buatlah new project. Tetapi pada saat dialog

new project muncul, pilihlah maven seperti pada gambar berikut.

Pada modul ini digunakan project maven ditujukan untuk mempermudah penambahan
external library. Jika anda kesulitan menggunakan maven, anda dapat menggunakan cara
pada modul sebelumnya.

Masukkan nama project (pada modul ini digunakan nama Todo). Untuk kolom
isian yang lainnya silahkan isi dengan default, kecuali untuk package sebaiknya
menggunakan identifier nama pembuat.

46
[Opsional] Sebagai catatan karena pada maven terdapat proses indexing yang memakan
kuota yang cukup besar, jika anda mempunyai keterbatasan akses internet sebaiknya
untuk mematikan fitur ini. Silahkan masuk ke dalam Options kemudian cari menu
seperti pada gambar dan centang Completely disable indexing

47
Pada menu Projects yang terletak di sebelah kiri ketika pembuatan project baru telah
selesai, perhatikan susunan direktorinya.

Pada direktori Dependencies, pilih kemudian lakukan klik kanan dan pilih

Add Dependency

48
Akan muncul dialog, yang berisikan informasi external library yang ingin ditambahkan
pada project. Tambahkan informasi seperti yang terdapat pada gambar berikut, untuk
menambahkan library jdbc untuk mysql.

Jika proses berhasil, maka akan muncul list dependencies library dalam sebuah project.
Jika anda perhatikan akan muncul dua buah file baru.
Maven akan secara otomatis menambahkan dependency yang menjadi dependency
external library yang akan digunakan.

49
Ulangi langkah penambahan dependency kembali untuk menambahkan library dbcp
(Database Connection Pooling). Library ini digunakan untuk membantu mengatur koneksi
database dengan konsep pooling. Dengan pendekatan ini, koneksi database akan
otomatis ditutup jika tidak ada aktifitas pada periode tertentu.
Jika semua external library sudah terinstall, lanjutkan dengan pembuatan package-
package sesuai dengan fungsionalitasnya, menjadi entities , dao dan lib .

Pada package entities tambahkan dua class User dan Todo . Dua file ini merupakan
representasi data pada database pada Object Java.

50
public class User { private Integer id;
private String username; private
String password;
public User() {}
public User(String username, String password) {
this(null, username, password);
public User(Integer id, String username, String password) {
this.id = id; this.username =
username; this.password = password;
}
}
public class Todo { private
Integer id; private User user;
private String todo; private
boolean done;
public Todo() {}
public Todo(Integer id, User user, String todo, boolean done)
this.id = id; this.user = user;
this.todo = todo; this.done =
done;
}
}

Silahkan gunakan fitur dari IDE Netbeans untuk me-generate getter dan setter serta toString()

51
Buatlah class ConnectionFactory pada package lib , class ini bertanggung jawab untuk
melakukan akses database sesuai dengan konfigurasi yang ada pada file properties.

public class ConnectionFactory {

private static final BasicDataSource DATASOURCE = new BasicDat

static {

InputStream input = null; try {


String home = System.getProperty("user.home");
String config = String.format("%s/.config.properties", ho input = new
FileInputStream(config);
Properties properties = new Properties(); properties.load(input);
String server = properties.getProperty("server"); String database =
properties.getProperty("database"); String username =
properties.getProperty("username");
String password = properties.getProperty("password"); String url =
String.format("jdbc:mysql://%s/%s", server, d DATASOURCE.setUrl(url);
DATASOURCE.setUsername(username);
DATASOURCE.setPassword(password);
DATASOURCE.setMinIdle(5);
DATASOURCE.setMaxIdle(10);
DATASOURCE.setMaxOpenPreparedStatements(100);
} catch (FileNotFoundException ex) {
Logger.getLogger(ConnectionFactory.class.getName()).log(Le
} catch (IOException ex) {
Logger.getLogger(ConnectionFactory.class.getName()).log(Le
} finally {
if (input != null) {
try { input.close();
} catch (IOException ex)
{ Logger.getLogger(ConnectionFactory.class.getName()).lo

52
}
}
}
}

private ConnectionFactory() {}

public static Connection getConnection() throws SQLException {

return DATASOURCE.getConnection();

Jika kita perhatikan pada operasi database, terdapat empat operasi utama yaitu select ,
insert , update , delete yang dapat digeneralisir menjadi sebuah class. Class ini
bertanggung jawab untuk mengabstraksi operasi-operasi database, yang lebih dikenal
dengan konsep Data Access Object.

Buatlah sebuah abstract class pada package dao dengan nama

BaseDao .

public class BaseDao<E> {

Simbol <E> menandakan generic, class ini menangani data sesuai dengan jenis
data yang didefinisikan. Contoh implementasi generic yang umum, bisa anda
lihat pada class java.util.Lis

Pada class tersebut, definisikan abstract-abstract method berikut.

protected abstract String getTableName(); protected


abstract String getId(); protected abstract String
getPrimaryKey();

53
protected abstract void setAttributes(Map<String, Object> attrs,

protected abstract E getItem(List<E>items, ResultSet resultset)

Tambahkan sebuah method getJoinedTables() yang berisi informasi tabel yang


berrelasi dengan data tersebut. Default implementasi sama dengan getTableName()
jika tidak ada tabel yang berrelasi.

protected String getJoinedTables() {

return getTableName();

Dikarenakan pada class BaseDao banyak dilakukan manipulasi string, tambahkan


beberapa method berikut yang digunakan untuk membantu me-generate sintaks sql.

private static String join(Collection<String> values, String del

return join(values, "", delimiter);

private static String join(Collection<String> values, String o StringBuilder sb = new


StringBuilder();

String loopDelimiter = "";

for (String o : values) {

sb.append(loopDelimiter); sb.append(o).append(optional);
loopDelimiter = delimiter;

return sb.toString();

54
private String questionMarks(int length) { StringBuilder sb = new
StringBuilder(); String loopDelimiter = "";

for (int i = 0; i < length; i++)


{ sb.append(loopDelimiter);
sb.append("?"); loopDelimiter = ",";

return sb.toString();

Tambahkan method search yang digunakan untuk melakukan pencarian data berdasarkan
suatu kondisi.

public List<E> search(Map<String, Object> conditions) {

return search(conditions, false);

public List<E> search(Map<String, Object> conditions, boolean

Kondisi pencarian terkadang menggunakan syarat yang sama persis atau menyerupai,
dalam operasi sql dapat diterapkan dengan = atau like . Tambahkan blok kode berikut.

List<E> items = null; try {

String operator = (useLike) ? " like ? " : " = ? "; String where = (conditions !
= null) ?

55
join(conditions.keySet(), operator, "and") : "1";

String sql = String.format("select * from %s where %s", getJoi Connection


connection = ConnectionFactory.getConnection(); PreparedStatement statement =
connection.prepareStatement(sql) if (conditions != null) {

Collection<Object> values = conditions.values();

int i = 1;

for (Object o : values)


{ statement.setObject(i, o); i++;

ResultSet resultset = statement.executeQuery(); items = new


ArrayList<>(); while(resultset.next()) {

E item = getItem(items, resultset); items.add(item);

} catch (SQLException ex)


{ Logger.getLogger(BaseDao.class.getName()).log(Level.SEVERE, nu

return items;

Implementasi kode di atas berisi tentang operasi dasar pada jdbc bagaimana
mendapatkan data yang ditampung dalam ResultSet . Tetapi jika anda perhatikan, tidak
ada proses pengaksesan kolom pada ResultSet . Implementasi proses ini akan
didefinisikan pada subclass DAO melalui getItem.

56
Pada package dao tambahkan class UserDao yang menangani manipulasi data pada
User

public class UserDao extends BaseDao<User> {

Implementasikan semua abstract method pada class tersebut.

@Override

protected String getTableName() {

return "users";

@Override

protected String getId() {

return "id";

@Override

protected String getPrimaryKey() {

return "getId";

@Override

57
protected void setAttributes(Map<String, Object> attrs, User i attrs.put("id",
item.getId());

attrs.put("username", item.getUsername()); attrs.put("password",


item.getPassword());

@Override

protected User getItem(List<User> items, ResultSet resultset) User user = new


User(); user.setId(resultset.getInt("id"));
user.setUsername(resultset.getString("username"));
user.setPassword(resultset.getString("password")); return user;

Buatlah sebuah class baru dengan nama SearchUserTest yang berisi fungsi main()
untuk menguji coba fitur pencarian dari Data Access Object yang telah
diimplementasikan.

public class SearchUsersTest

public static void main(String[] args) { UserDao dao =


new UserDao();

Map<String, Object> conditions = new HashMap<>(); conditions.put("username",


"admin%");

List<User> users = dao.search(conditions, true); for (User user :


users) {

System.out.println(user);

58
}

Dikarenakan data pada tabel users masih kosong, maka tidak ada hasil yang
ditampilkan. Tambahkan beberapa data untuk menguji fungsional fitur pencarian
tersebut sehingga muncul data yang diinginkan.

this.tableModel = new ListTableModel<>(users, headers); initComponents();

Pada mode design, klik kanan pada component JTable. Pilih menu Customize
Code, ubah default code menjadi custom property, dengan kode berikut.

usersTable.setModel(tableModel);

Tambahkan event pada tombol add, masukkan kode berikut.

SaveUserDialog dialog = new SaveUserDialog(this, true); int result =


dialog.showDialog(null);

// update konten jika ada perubahan

if (result > 0) { tableModel.setItems(dao.all());

Tambahkan event pada tombol edit, masukkan kode berikut.

int row = usersTable.getSelectedRow();

59
if (row >= 0) {

User user = tableModel.getItem(row);

SaveUserDialog dialog = new SaveUserDialog(this, true); int result =


dialog.showDialog(user);

if (result > 0) { tableModel.setItems(dao.all());

Pertanyaan

1. Implementasikan aksi hapus user! Anda dapat menggunakan opsi confirm dari
JOptionPane.
2. Tambahkan fitur filter data berdasarkan username yang dimasukkan!

60
61

Anda mungkin juga menyukai