Membuat aplikasi pencarian buku dengan Javax Swing, Hibernate ORM dan Mysql DB

Membuat aplikasi pencarian buku dengan Javax Swing, Hibernate ORM dan Mysql DB

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

Did you find this article valuable?

Support Teten Nugraha by becoming a sponsor. Any amount is appreciated!