Introduction
Pada project kita kali ini, kita akan membuat sebuah aplikasi pencari buku dengan menggunakan stack berikut :
Javax Swing
Hibernate ORM
MySQL DB
aplikasi ini hanya ada satu fitur yang mencari buku berdasarkan judul buku, jika data yang dicari ada maka akan ditampilkan ke dalam tabel namun bila data yang dicari tidak ada maka akan muncul popup message.
Prerequisite
JDK minimal Versi 17 LTS
Disini saya menggunakan Java Development Kit Versi 17 (LTS) Kalian bisa mendownload pada link berikut https://www.azul.com/downloads/#zulu
Maven Build Tools
Karena dalam artikel ini saya menggunakan maven dan ada beberapa dependencies yang menggunakan maven, maka pastikan di laptop kalian sudah terinstall Maven. Untuk memastikan maven sudah siap digunakan kalian bisa ketikan perintah berikut
mvn -v
jika output nya seperti ini maka maven sudah bisa digunakan
Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
Maven home: /Applications/maven
Java version: 17.0.4.1, vendor: Azul Systems, Inc., runtime: /Users/teten.nugraha/.sdkman/candidates/java/17.0.4.1-zulu/zulu-17.jdk/Contents/Home
Default locale: en_ID, platform encoding: UTF-8
OS name: "mac os x", version: "13.5", arch: "x86_64", family: "mac"
MySQL DB
Untuk penyimpanan data, saya menggunakan MySQL Versi 8. Pastikan kalian mengetahui username dan password dari mysql yang sudah distall, kemudian buat sebuah database dengan nama book-db. Didalam itu buatlah sebuah tabel baru
-- `book-db`.book definition
CREATE TABLE `book` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;
INSERT INTO `book-db`.book (title) VALUES('Java Programming');
INSERT INTO `book-db`.book (title) VALUES('Kotlin Programming');
INSERT INTO `book-db`.book (title) VALUES('Ruby Learn');
INSERT INTO `book-db`.book (title) VALUES('PHP Programming');
INSERT INTO `book-db`.book (title) VALUES('NodeJS');
INSERT INTO `book-db`.book (title) VALUES('Go Language');
INSERT INTO `book-db`.book (title) VALUES('ReactJS');
Development
Prepare Project
Buka Netbeans IDE dan buatlah sebuah Java Application Project with Maven
pada bagian project-name kemudian isi projek ini dengan nama belajar-hibernate.
Buat class Book Model
Seperti yang telah kita lakukan pada part prepare database tabel Book ini akan kita buatkan sebuah class Java nya, fungsinya yaitu class Book ini akan sebagai representasi tabel Book yang ada dalam database nantinya.
package id.ten.belajar.hibernate.models;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author teten.nugraha
*/
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String title;
public Book() {
}
public Book(long id, String title) {
this.id = id;
this.title = title;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Book{" + "id=" + id + ", title=" + title + '}';
}
}
terlihat pada potongan kode diatas kita juga membuat empty constructor, filled constructor ,getter/setter dan toString.
Buat class HibernateConfig
Setelah kita membuat representasi tabel Book ada class Book lalu buatlah sebuah class dengan nama HibernateConfiguration yang berfungsi sebagai jembatan komunikasi antara database MySQL dan Hibernate ORM.
package id.ten.belajar.hibernate.conf;
import id.ten.belajar.hibernate.models.Book;
import java.util.Properties;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
public class HibernateConfiguration {
private static SessionFactory factory;
private HibernateConfiguration() {}
public static SessionFactory getFactory() {
if(factory == null) {
Configuration configuration = new Configuration();
Properties settings = new Properties();
settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
settings.put(Environment.URL, "jdbc:mysql://localhost:3306/book-db");
settings.put(Environment.USER, "root");
settings.put(Environment.PASS, "password");
settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL8Dialect");
settings.put(Environment.SHOW_SQL, "false");
settings.put(Environment.HBM2DDL_AUTO, "update");
configuration.setProperties(settings);
configuration.addAnnotatedClass(Book.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
factory = configuration.buildSessionFactory(serviceRegistry);
}
return factory;
}
}
Dalam class tersebut kita masukan username, password, host port dari MySQL yang sudah terinstall dilaptop. Disamping itu jangan lupa masukan configurasi untuk class Book yang sudah kita buat tadi pada potongan kode configuration.addAnnotatedClass(Book.class);
Membuat Book Data Access Object
Dalam layer DAO (Data Access Object). DAO ini yang nantinya akan menyediakan data sesuai dengan keinginan kita. Kembali lagi pada fitur awal bahwa aplikasi ini hanya memfunyai satu fitur yaitu mencari data Book berdasarkan title.
Untuk itu buatlah sebuah interface dengan nama BookDao dan masukan satu method getAllBooksByTitle()
package id.ten.belajar.hibernate.dao;
import id.ten.belajar.hibernate.models.Book;
import java.util.List;
/**
*
* @author teten.nugraha
*/
public interface BookDao {
List<Book> getAllBooksByTitle(String title);
}
Kemudian buat class implementsai dari BookDao diatas dengan nama BookDaoImpl
import id.ten.belajar.hibernate.conf.HibernateConfiguration;
import id.ten.belajar.hibernate.models.Book;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
/**
*
* @author teten.nugraha
*/
public class BookDaoImpl implements BookDao{
private SessionFactory factory = HibernateConfiguration.getFactory();
@Override
public List<Book> getAllBooksByTitle(String title) {
Transaction transaction = null;
List<Book> books = null;
Session session = null;
try {
session = factory.openSession();
transaction = session.beginTransaction();
Query query = session.createQuery("select p from Book p where p.title like :title");
query.setParameter("title", "%" + title + "%");
books = query.getResultList();
transaction.commit();
} catch (Exception e) {
if(transaction != null)
transaction.rollback();
}finally{
session.close();
}
return books;
}
}
Terlihat dalam class diatas kita menggunakan class HibernateConfiguration yang telah dibuat sebelumnya. Untuk expressi SQL nya disini menggunakan JPQL yaitu sintak SQL based Java.
Jika transaksi berhasil maka akan dicommit, namun jika gagal transaksi akan dirollback. Dan setelah itu session akan diclose.
Membuat Book Presenter
pada layer presenter, saya meletakan UI atau class-class yang menampilkan aplikasi pencarian buku ini. Untuk itu buatlah sebuah tampilan seperti berikut dengan nama BookPresenter
gantilah nama variabel dari komponen-komponen diatas menjadi :
txtTitle
btnCari
tblBooks
pastikan nama kolom nya adalah ID dan Judul, kalian bisa mengatur ini dalam model dalam class Tabel tersebut
Masuk ke bagian source, buatlah sebuah object variable dari BookDao
kemudian buat sebuah method baru dengan nama fillTabel() yang kita gunakan untuk mencari data berdasarkan title yang kita input pada txtTitle()
private void fillTabel(String title) {
List<Book> datas = bookDao.getAllBooksByTitle(title);
if(datas.isEmpty()) {
JOptionPane.showMessageDialog(this, "Data Buku yang dicari tidak ada ");
}
DefaultTableModel model = (DefaultTableModel) tblBooks.getModel();
// remove data sebelumnya
model.getDataVector().removeAllElements();
Object rowData[] = new Object[2];
for(int i=0; i < datas.size(); i++) {
rowData[0] = datas.get(i).getId();
rowData[1] = datas.get(i).getTitle();
model.addRow(rowData);
}
}
pada method tersebut kita mendapatkan data dari dao yang sudah kita buat kemudian kita mengecek jika tidaka da data maka popup kan muncul
Lalu tambahkan sebuah action dari btnCari yang kita gunakan untuk mendapatkan nilai dari title yang dicari yang nantinya akan diberikan ke method fillTabel()
private void btnCariActionPerformed(java.awt.event.ActionEvent evt) {
String textCari = txtTitle.getText();
fillTabel(textCari);
}
berikut potongan kode dari BookPresenter
package id.ten.belajar.hibernate.presenter;
import id.ten.belajar.hibernate.dao.BookDao;
import id.ten.belajar.hibernate.models.Book;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
public class BookPresenter extends javax.swing.JFrame {
private BookDao bookDao;
/**
* Creates new form BookPresenter
*/
public BookPresenter(BookDao bookDao) {
initComponents();
this.bookDao = bookDao;
}
private void btnCariActionPerformed(java.awt.event.ActionEvent evt) {
String textCari = txtTitle.getText();
fillTabel(textCari);
}
// Variables declaration - do not modify
private javax.swing.JButton btnCari;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable tblBooks;
private javax.swing.JTextField txtTitle;
// End of variables declaration
private void fillTabel(String title) {
List<Book> datas = bookDao.getAllBooksByTitle(title);
if(datas.isEmpty()) {
JOptionPane.showMessageDialog(this, "Data Buku yang dicari tidak ada ");
}
DefaultTableModel model = (DefaultTableModel) tblBooks.getModel();
// remove data sebelumnya
model.getDataVector().removeAllElements();
Object rowData[] = new Object[2];
for(int i=0; i < datas.size(); i++) {
rowData[0] = datas.get(i).getId();
rowData[1] = datas.get(i).getTitle();
model.addRow(rowData);
}
}
}
Update Main Class
Pada main class ini kita buat sebuah object variable dari BookDaoImpl dan berikan ke oject BookPresenter.
package id.ten.belajar.hibernate;
import id.ten.belajar.hibernate.dao.BookDao;
import id.ten.belajar.hibernate.dao.BookDaoImpl;
import id.ten.belajar.hibernate.models.Book;
import id.ten.belajar.hibernate.presenter.BookPresenter;
import java.util.List;
/**
*
* @author teten.nugraha
*/
public class BelajarHibernate {
public static void main(String[] args) {
BookDao bookDao = new BookDaoImpl();
BookPresenter bookPresenter = new BookPresenter(bookDao);
bookPresenter.setVisible(true);
}
}
Testing
Saatnya kita mengetest aplikasi yang sudah dibuat, jalankan aplikasi dan masukan judul buku yang ingin dicari.
Kesimpulan
Pada checkpoint ini, kita sudah berhasil mengintegrasikan antara Java Swing, Hibernate ORM dan MySQL. Yang mana ketika kita menggunakan Hibernate ORM kita tidak perlu lagi membuat sintak sql native pada aplikasi langsung, dan bisa dengan gampang mengolah data dari database.Untuk lebih jelasnya kalian bisa melihat source code aplikasi diatas pada link berikut https://github.com/teten-nugraha/aplikasi-pencarian-buku/tree/main