Membuat Database di MySQL

Pada tutorial kali ini kita menggunakan JPA, jadi sebenarnya databasenya gak harus MySQL, tinggal kita sesuaikan dengan yang kita gunakan. Tapi dikarenakan saya menggunakan MySQL, jadi pada artikel ini saya sebutkan databasenya adalah MySQL. Dan sebelum membuat aplikasi, terlebih dahulu kita harus memiliki sebuah database, caranya dengan perintah :

create database crud_mvc;

Artinya kita telah memiliki database dengan nama crud_mvc di mysql.

Membuat Project di NetBeans

Karena kita akan membuat aplikasi berbasis Java Swing yang artinya aplikasi kita berbasis Desktop, maka project yang perlu dibuat adalah project Java Application. File -> New Project, setelah itu pada bagian Categories pilih Java dan pada bagian Types pilih Java Application. Setelah itu next, dan beri nama project yang dibuat dengan nama yang anda inginkan :D dan jangan lupa untuk otomatis membuat kelas Main-nya :


Membuat Persistence Unit

Karena kita menggunakan JPA, jadi pertama kali kita harus membuat Persistence Unit, dimana ini merupakan file konfigurasi untuk JPA yang kita gunakan. Cara membuatnya lewat menu File -> New File, setelah itu pada bagian Categories pilih Persistence dan pada bagian Types pilih Persistence Unit. Setelah itu masukan nama persistence unit yang akan digunakan. Dan jangan lupa menambahkan Database Connection ke database yang sebelumnya dibuat :

Membuat Entity Class

Setelah membuat persistence unit, saatnya membuat Entity Class dimana entityclassnya ini kita anggap sebagai Model, yaitu class yang merepresentasikan tabel dalam database. Cara membuatnya lewat menu File -> New File, setelah itu pada bagian Categories pilih Persistence dan pada bagian lainnya pilih Entity Class.

Beri nama kelas entitas tersebut sesuai dengan nama entitas yang kita inginkan, misal pada artikel ini saya akan membuat entitas Person, dimana Person akan memiliki id, nama depan dan nama belakang :

package khannedy.crudmvc.entity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author echo
 */
@Entity
@Table(name = "table_person")
public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "first_name", length = 45, nullable = false)
    private String firstName;

    @Column(name = "last_name", length = 45)
    private String lastName;

    public String getFirstName() {
	return firstName;
    }

    public void setFirstName(String firstName) {
	this.firstName = firstName;
    }

    public String getLastName() {
	return lastName;
    }

    public void setLastName(String lastName) {
	this.lastName = lastName;
    }

    public Long getId() {
	return id;
    }

    public void setId(Long id) {
	this.id = id;
    }

    @Override
    public int hashCode() {
	int hash = 0;
	hash += (id != null ? id.hashCode() : 0);
	return hash;
    }

    @Override
    public boolean equals(Object object) {
	// TODO: Warning - this method won't work in the case the id fields are not set
	if (!(object instanceof Person)) {
	    return false;
	}
	Person other = (Person) object;
	if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
	    return false;
	}
	return true;
    }

    @Override
    public String toString() {
	return "khannedy.crudmvc.entity.Person[id=" + id + "]";
    }
}

Membuat TableModel

Setelah membuat entitas, kita buatkan tablemodelnya sebagai model di JTable nanti :

package khannedy.crudmvc.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author echo
 */
public class TableModelPerson extends AbstractTableModel {

    private static final long serialVersionUID = 1L;

    private List list = new ArrayList();

    public void updateAll(Collection
 persons) {
	list.clear();
	list.addAll(persons);
	fireTableDataChanged();
    }

    public void insert(Person person) {
	list.add(person);
	fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1);
    }

    public void delete(int index) {
	list.remove(index);
	fireTableRowsDeleted(index, index);
    }

    public void update(int index, Person person) {
	list.set(index, person);
	fireTableRowsUpdated(index, index);
    }

    public Person select(int index) {
	return list.get(index);
    }

    public int getRowCount() {
	return list.size();
    }

    public int getColumnCount() {
	return 3;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
	switch (columnIndex) {
	    case 0:
		return list.get(rowIndex).getId();
	    case 1:
		return list.get(rowIndex).getFirstName();
	    case 2:
		return list.get(rowIndex).getLastName();
	    default:
		return null;
	}
    }

    @Override
    public String getColumnName(int column) {
	switch (column) {
	    case 0:
		return "Id";
	    case 1:
		return "First Name";
	    case 2:
		return "Last Name";
	    default:
		return null;
	}
    }
}

Membuat PersistenceHelper

Setelah membuat kelas entitas, saatnya membuat kelas yang digunakan sebagai utilitas untuk membuat koneksi JPA atau bernama EntityManagerFactory. Karena kelas ini bertugas sebagai kelas bantuan, jadi kita namakan kelas ini dengan PersistenceHelper. Jadi ini bisa dibilang salah satu kelas-kelas helper dalam konsep MVC Ruby on Rails :

package khannedy.crudmvc.helper;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author echo
 */
public class PersistenceHelper {

    private static final EntityManagerFactory factory;

    static {
	factory = Persistence.createEntityManagerFactory("crud-mvcPU");
    }

    public static EntityManagerFactory getFactory() {
	return factory;
    }
}

Jangan lupa untuk menggunakan nama persistence unit yang tadi sebelumnya dibuat saat memanggil metode Persistence#createEntityManagerFactory(nama).

Membuat Tampilan Aplikasi (View)

Setelah membuat Helper dan Model (Entity), sekarang saatnya membuat View nya, yaitu tampilan aplikasi yang digunakan untuk menampilkan data person, misal saya buat seperti yang terlihat dibawah ini :

Dan nama-nama variabel komponennya seperti yang terlihat pada gambar inspector dibawah ini :

Setelah itu, tambahkan TableModelperson yang tadi kita buat ke View ini, sehingga konstruktornya akan berubah seperti pada gambar dibawah ini :

public class PersonView extends javax.swing.JFrame {

    private TableModelPerson tableModelPerson;

    /** Creates new form PersonView */
    public PersonView() {
        initComponents();

	tableModelPerson = new TableModelPerson();
	tablePerson.setModel(tableModelPerson);
    }

Setelah itu jangan lupa untuk menambahkan Getter untuk setiap komponen yang memang diperlukan dalam proses bisnis logicnya, disini yang diperlukan adalah textFirstName, textLastName, tablePerson dan tableModelPerson.

Dimana dibutuhkannya? Jawabannya adalah di Controller. Nanti Anda akan tau kenapa perlu metode Getter di View setelah anda membuat Controller :D

public class PersonView extends javax.swing.JFrame {

    private TableModelPerson tableModelPerson;

    /** Creates new form PersonView */
    public PersonView() {
	initComponents();

	tableModelPerson = new TableModelPerson();
	tablePerson.setModel(tableModelPerson);
    }

    public JButton getButtonDelete() {
	return buttonDelete;
    }

    public JButton getButtonInsert() {
	return buttonInsert;
    }

    public JButton getButtonUpdate() {
	return buttonUpdate;
    }

    public TableModelPerson getTableModelPerson() {
	return tableModelPerson;
    }

    public JTable getTablePerson() {
	return tablePerson;
    }

    public JTextField getTextFirstName() {
	return textFirstName;
    }

    public JTextField getTextLastName() {
	return textLastName;
    }

Sekarang tinggal kita beri interaksi terhadap View nya, namun sebelum memberi interaksinya, kita buat dulu Controller nya :D

Membuat Controller

Sebelum membuat Controller, perlu diperhatikan, bahwa Controller ini yang bertugas melakukan proses, baik itu proses manipulasi data, pengubahan data atau apapun yang memang tidak harus terlihat. Biasanya dalam controller ini berisikan proses manipulasi database jika memang aplikasinya berbasiskan database.

Biasanya Controller menyesuaikan dengan View, misal disini View memiliki tombol INSERT, UPDATE dan DELETE, artinya Controller harus dapat menangani masalah INSERT, UPDATE dan DELETE tersebut. Apa hanya itu? TIDAK! Terdapat sebuah tabel pada VIew yang sebelumnya kita buat, dan yang jadi pertanyaan bagaimana data yang ada dalam database bisa terlihat di table? Artinya kita harus membuat si Controller dapat menangani proses SELECT.

Dari sini kita dapat kesimpulan jika Controller harus dapat melakukan proses INSERT, UPDATE, DELETE dan SELECT :D

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package khannedy.crudmvc.controller;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import khannedy.crudmvc.helper.PersistenceHelper;
import khannedy.crudmvc.model.Person;
import khannedy.crudmvc.view.PersonView;

/**
 *
 * @author echo
 */
public class PersonController {

    private PersonView view;

    public PersonController(PersonView view) {
	this.view = view;
    }

    public void insert() {
	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	manager.getTransaction().begin();
	try {

	    // buat person
	    Person person = new Person();
	    // ubah data person
	    person.setFirstName(view.getTextFirstName().getText());
	    person.setLastName(view.getTextLastName().getText());
	    // simpan ke database
	    manager.persist(person);
	    // simpah ke tablemodel
	    view.getTableModelPerson().insert(person);

	    manager.getTransaction().commit();
	} catch (Throwable t) {
	    t.printStackTrace();
	    manager.getTransaction().rollback();
	} finally {
	    manager.close();
	}
    }

    public void update() {

	// dapatkan baris yang terseleksi
	int index = view.getTablePerson().getSelectedRow();
	// jika tidak ada
	if (index == -1) {
	    // maka proses dibatalkan
	    return;
	}

	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	manager.getTransaction().begin();
	try {

	    // mendapatkan person dari tablemodel
	    Person person = view.getTableModelPerson().select(index);
	    // ubah data person
	    person.setFirstName(view.getTextFirstName().getText());
	    person.setLastName(view.getTextLastName().getText());
	    // update person ke database
	    manager.merge(person);
	    // update person ke tablemodel
	    view.getTableModelPerson().update(index, person);

	    manager.getTransaction().commit();
	} catch (Throwable t) {
	    t.printStackTrace();
	    manager.getTransaction().rollback();
	} finally {
	    manager.close();
	}
    }

    public void delete() {

	// dapatkan baris yang terseleksi
	int index = view.getTablePerson().getSelectedRow();
	// jika tidak ada
	if (index == -1) {
	    // maka proses dibatalkan
	    return;
	}

	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	manager.getTransaction().begin();
	try {

	    // mendapatkan person dari tablemodel
	    Person person = view.getTableModelPerson().select(index);
	    // menghapus person dari database
	    manager.remove(manager.merge(person));
	    // menghapus person dari tablemodel
	    view.getTableModelPerson().delete(index);

	    manager.getTransaction().commit();
	} catch (Throwable t) {
	    t.printStackTrace();
	    manager.getTransaction().rollback();
	} finally {
	    manager.close();
	}
    }

    public void select() {
	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	try {
	    @SuppressWarnings("unchecked")
	    List
 list = manager.createQuery("select a from Person a").getResultList();
	    view.getTableModelPerson().updateAll(list);
	} finally {
	    manager.close();
	}
    }
}

Setelah membuat Controller, saatnya mengintegrasikan antara View dan Controller :D

Integrasi View dan Controller

Setelah membuat Controller sekarang saatnya menambahkan COntroller ke View, jadi konstruktornya berubah lagi menjadi seperti dibawah ini :

public class PersonView extends javax.swing.JFrame {

    private TableModelPerson tableModelPerson;

    private PersonController controller;

    /** Creates new form PersonView */
    public PersonView() {
	initComponents();

	tableModelPerson = new TableModelPerson();
	tablePerson.setModel(tableModelPerson);

	controller = new PersonController(this);
    }

Setelah itu berikan aksi untuk tombol INSERT, UPDATE dan DELETE. Caranya dengan mengklik kanan tombol tersebut lalu pilih Events -> Action -> actionPerformed, maka akan otomatis dibuatkan metode untuk aktinya. Untuk tombol INSERT isi metodenya seperti pada kode dibawah ini :

    private void buttonInsertActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	controller.insert();
    }

Dan untuk aksi tombol UPDATE :

    private void buttonUpdateActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	controller.update();
    }

Terakhir untuk aksi tombol DELETE :

    private void buttonDeleteActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	controller.delete();
    }

Trus kapan memanggil aksi SELECT di Controller? Pastinya saat aplikasi muncul, jadi perintah controller.select() itu dipanggil di konstruktor View, sehingga konstruktornya seperti yang terlihat dibawah ini :

public class PersonView extends javax.swing.JFrame {

    private TableModelPerson tableModelPerson;

    private PersonController controller;

    /** Creates new form PersonView */
    public PersonView() {
	initComponents();

	tableModelPerson = new TableModelPerson();
	tablePerson.setModel(tableModelPerson);

	controller = new PersonController(this);
	controller.select();
    }

Mengubah Main Class

Setelah semuanya selesai, sekarang saatnya mengubah Main classnya. Ubah agar main class tersebut menjalankan aplikasi PersonView yang kita buat :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package khannedy.crudmvc;

import javax.swing.SwingUtilities;
import khannedy.crudmvc.view.PersonView;

/**
 *
 * @author echo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

	    public void run() {
		new PersonView().setVisible(true);
	    }
	});
    }

}

Sekarang selesai semuanya :D

Menjalankan Aplikasi

Sekarang coba jalankan aplikasi, caranya klik kanan projectnya terus pilih Run.

Tapi kok error?

run:
[EL Info]: 2010-04-11 06:24:29.076--ServerSession(6530849)--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
[EL Severe]: 2010-04-11 06:24:29.095--ServerSession(6530849)--Local Exception Stack:
Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:397)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
EntityManagerFactoryProvider.java:228)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at khannedy.crudmvc.controller.PersonController.select(PersonController.java:115)
        at khannedy.crudmvc.controller.PersonController.select(PersonController.java:115)
        at khannedy.crudmvc.view.PersonView.(PersonView.java:37)
        at khannedy.crudmvc.view.PersonView.(PersonView.java:37)
        at khannedy.crudmvc.Main$1.run(Main.java:24)
        at khannedy.crudmvc.Main$1.run(Main.java:24)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        ... 14 more
BUILD STOPPED (total time: 9 seconds)

Tenang, tenang, tidak usah khawatir :D kesalahan seperti biasa, cuma driver MySQL nya belum dimasukkan ke project. Tinggal masukan aja ke library Project, dan selesai masalahnya :D

Dan saat di-running kembali maka aplikasinya akan seperti dibawah ini :

Kekurangan Fitur

Selesai,,,, Tapi sebenarnya ada beberapa fitur yang kurang. “itu sih menurut saya”, yaitu :

  1. Harusnya saat di klik INSERT, setelah data sukses dimasukkan ke database dan tabel, harusnya data di form jadi clear.
  2. Harusnya saat baris tabel terseleksi, data langsung ada di form, jadi kalo mau Update gampang :D

So, gimana cara bikinnya? Kita lanjutkan di artikel berikutnya :D

Download SourceCode

Silahkan download sourcecodenya –> disini <–

source : eecchhoo.wordpress.com

About Saiful Anwar

Simple, ga mau sesuatu yang berlebihan.. Cukup nikmati saja tentang diri sendiri apa adanya

Posted on 19 April 2010, in Java NetBeans. Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: