Pengenalan Data Access Object {2} Implementasi dalam JDBC


pada posting sebelumnya saya telah bahas tentang apa itu DAO dan sedikit membahas tentang konsep penerapan DAO dalam sistem yang sedang kita buat. dan pada posting saat ini saya akan bahas tentang implementasi konsep dao pada jdbc (java database connectivity).

agar lebih afdol sebaiknya pada praktek konsep DAO kali ini, saya ambil contoh sebuah kasus, yaitu kita akan membuat sebuah sistem informasi universitas, dimana pada sistem informasi tersebut memiliki sebuah entitas yang bernama Mahasiswa, Jurusan dan Fakultas. dan sekarang tugas kita adalah menerapkan konsep DAO tersebut pada sistem informasi tersebut.

sebelum masuk ke java, kita buat dulu table Mahasiswa, Fakultas dan Jurusan. saya menggunakan MySQL sebagai database-nya, jadi seperti ini struktur tabel nya :


create database dao_jdbc;

create table table_fakultas(
	id_fakultas bigint(20) unsigned primary key auto_increment,
	nama_fakultas varchar(45) not null
)engine=innodb;

create table table_jurusan(
	id_jurusan bigint(20) unsigned primary key auto_increment,
	nama_jurusan varchar(45) not null,
	id_fakultas bigint(20) unsigned not null
)engine=innodb;

create table table_mahasiswa(
	nim varchar(8) primary key,
	nama_depan varchar(45) not null,
	nama_belakang varchar(45),
	tanggal_lahir date not null,
	id_jurusan bigint(20) unsigned
)engine=innodb;

alter table table_jurusan add constraint fk_fakultas_jurusan
foreign key (id_fakultas) references table_fakultas(id_fakultas)
on update cascade on delete restrict;

alter table table_mahasiswa add constraint fk_jurusan_mahasiswa
foreign key (id_jurusan) references table_jurusan(id_jurusan)
on update cascade on delete restrict;

sekarang kita buat kelas-kelas entity nya tersebut , tapi supaya gak terlalu panjang, saya buat entitas yang Fakultas saja, karena cara membaut entity dan DAO untuk entitas-entitas yang lain hampir sama :

package echo.khannedy.daojdbc.entity;

public class Fakultas {

    private Long id;
    private String nama;

    public Long getId() {
        return id;
    }

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

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }
}

sekarang kita sudah membuat semua kelas entitas yang telah dibutuhkan. sekarang tinggal kita terapkan konsep DAO.

dalam menerapkan konsep DAO, perlu diperhatikan bahwa biasanya DAO merupakan Interface setelah itu diimplementasi menjadi DAOImpl (Dao Implement). kenapa harus interface? kenapa tidak langsung menggunakan kelas?

alasan pertama adalah agar seluruh kode DAO bersifat HIDDEN. maksudnya? jika menggunakan interface, artinya seluruh metode dibuat tanpa adanya deklarasi secara langsung pada interface tersebut. sehingga user yang tidak berwenang tidak bisa melihat kode cara memanipulasi entitas.

lantas kalo DAO nya interface bagaimana cara membuat object dari DAO tersebut? caranya menggunakan Dependency Injection lewat Factory Method.

????????

hehehehe, jadi seperti ini cara membuatnya :

SampleDao dao = DaoFactory.getSampleDao();

bukan :

SampleDap dao = new SampleDaoImpl();

jadi harus kita buat juga sebuah kelas DaoFactory atau terserah anda ingin menamakan apa kelas tersebut ๐Ÿ˜€

sekarang kita buat interface-interface DAO nya :

package echo.khannedy.daojdbc.dao;

import echo.khannedy.daojdbc.entity.Fakultas;
import echo.khannedy.daojdbc.entity.Jurusan;
import java.sql.SQLException;
import java.util.List;

public interface FakultasDao {

    void insert(Fakultas fakultas) throws SQLException;

    void update(Fakultas fakultas) throws SQLException;

    void delete(Fakultas fakultas) throws SQLException;

    Fakultas getById(Long id) throws SQLException;

    Fakultas getByJurusan(Jurusan jurusan) throws SQLException;

    List<Fakultas> getAll() throws SQLException;
}

setelah selesai membuat interface-interface DAO, saatnya kita buat implementasi dari tiap interface-interface tersebut ๐Ÿ˜€

package echo.khannedy.daojdbc.dao.impl;

import echo.khannedy.daojdbc.dao.FakultasDao;
import echo.khannedy.daojdbc.entity.Fakultas;
import echo.khannedy.daojdbc.entity.Jurusan;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

public class FakultasDaoImpl implements FakultasDao {

    private final String SQL_INSERT = "insert into table_fakultas (id_fakultas, nama_fakultas) values (?,?)";
    private final String SQL_UPDATE = "update table_fakultas set nama_fakultas = ? where id_fakultas = ?";
    private final String SQL_DELETE = "delete from table_fakultas where id_fakultas = ?";
    private final String SQL_GETBYID = "select * from table_fakultas where id_fakultas = ?";
    private final String SQL_GETBYJURUSAN = "select fakultas.id_jurusan, fakultas.nama_jurusan from table_jurusan fakultas join table_jurusan jurusan on (fakultas.id_fakultas = jurusan.id_fakultas) where jurusan.id_jurusan = ?";
    private final String SQL_GETALL = "select * from table_fakultas";
    private Connection connection;

    public FakultasDaoImpl(Connection connection) {
        this.connection = connection;
    }

    public void insert(Fakultas fakultas) throws SQLException {
        PreparedStatement statement = null;
        ResultSet result = null;
        try {
            connection.setAutoCommit(false);

            statement = connection.prepareStatement(SQL_INSERT);
            statement.setNull(1, Types.BIGINT);
            statement.setString(2, fakultas.getNama());
            statement.executeUpdate();

            result = statement.getGeneratedKeys();
            if (result.next()) {
                fakultas.setId(result.getLong(1));
            }

            connection.commit();
        } catch (SQLException exception) {
            connection.rollback();
            throw exception;
        } finally {
            try {
                connection.setAutoCommit(true);
                if (result != null) {
                    result.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException exception) {
                throw exception;
            }
        }
    }

    public void update(Fakultas fakultas) throws SQLException {
        PreparedStatement statement = null;
        try {
            connection.setAutoCommit(false);

            statement = connection.prepareStatement(SQL_UPDATE);
            statement.setString(1, fakultas.getNama());
            statement.setLong(2, fakultas.getId());
            statement.executeUpdate();

            connection.commit();
        } catch (SQLException exception) {
            throw exception;
        } finally {
            try {
                connection.setAutoCommit(true);
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException exception) {
                throw exception;
            }
        }
    }

    public void delete(Fakultas fakultas) throws SQLException {
        PreparedStatement statement = null;
        try {
            connection.setAutoCommit(false);

            statement = connection.prepareStatement(SQL_DELETE);
            statement.setLong(1, fakultas.getId());
            statement.executeUpdate();

            connection.commit();
        } catch (SQLException exception) {
            throw exception;
        } finally {
            try {
                connection.setAutoCommit(true);
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException exception) {
                throw exception;
            }
        }
    }

    public Fakultas getById(Long id) throws SQLException {
        PreparedStatement statement = null;
        ResultSet result = null;
        try {
            connection.setAutoCommit(false);

            statement = connection.prepareStatement(SQL_GETBYID);
            statement.setLong(1, id);

            result = statement.executeQuery();

            Fakultas fakultas = null;
            if (result.next()) {
                fakultas = new Fakultas();
                fakultas.setId(result.getLong("id_fakultas"));
                fakultas.setNama(result.getString("nama_fakultas"));
            }

            connection.commit();
            return fakultas;
        } catch (SQLException exception) {
            throw exception;
        } finally {
            try {
                connection.setAutoCommit(true);
                if (result != null) {
                    result.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException exception) {
                throw exception;
            }
        }
    }

    public Fakultas getByJurusan(Jurusan jurusan) throws SQLException {
        PreparedStatement statement = null;
        ResultSet result = null;
        try {
            connection.setAutoCommit(false);

            statement = connection.prepareStatement(SQL_GETBYJURUSAN);
            statement.setLong(1, jurusan.getId());

            result = statement.executeQuery();
            Fakultas fakultas = null;
            if (result.next()) {
                fakultas = new Fakultas();
                fakultas.setId(result.getLong("id_fakultas"));
                fakultas.setNama(result.getString("nama_fakultas"));
            }

            connection.commit();
            return fakultas;
        } catch (SQLException exception) {
            throw exception;
        } finally {
            try {
                connection.setAutoCommit(true);
                if (result != null) {
                    result.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException exception) {
                throw exception;
            }
        }
    }

    public List<Fakultas> getAll() throws SQLException {
        PreparedStatement statement = null;
        ResultSet result = null;
        try {
            connection.setAutoCommit(false);

            statement = connection.prepareStatement(SQL_GETALL);

            result = statement.executeQuery();
            List<Fakultas> list = new ArrayList<Fakultas>();
            while (result.next()) {
                Fakultas fakultas = new Fakultas();
                fakultas.setId(result.getLong("id_fakultas"));
                fakultas.setNama(result.getString("nama_fakultas"));
                list.add(fakultas);
            }

            connection.commit();
            return list;
        } catch (SQLException exception) {
            throw exception;
        } finally {
            try {
                connection.setAutoCommit(true);
                if (result != null) {
                    result.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException exception) {
                throw exception;
            }
        }
    }
}

setelah itu kita buat kelas DaoFactory untuk dijadikan kelas factory method untuk membaut DAO fakultas

package echo.khannedy.daojdbc.factory;

import com.mysql.jdbc.Driver;
import echo.khannedy.daojdbc.dao.FakultasDao;
import echo.khannedy.daojdbc.dao.impl.FakultasDaoImpl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DaoFactory {

    private static Connection connection;
    private static FakultasDao fakultasDao;

    private static Connection getConnection() throws SQLException {
        if (connection == null) {
            DriverManager.registerDriver(new Driver());
            String url = "jdbc:mysql://localhost:3306/dao_jdbc";
            String user = "user";
            String password = "password";
            connection = DriverManager.getConnection(url, user, password);
        }
        return connection;
    }

    public static FakultasDao getFakultasDao() throws SQLException {
        if (fakultasDao == null) {
            fakultasDao = new FakultasDaoImpl(getConnection());
        }
        return fakultasDao;
    }
}

sekarang kita telah selesai menerapkan konsep DAO pada sistem yang kita buat, nah bagaimana cara menggunakan DAO tersebut ?, dibawah ini adalah contoh sintak penggunaan DAO

package echo.khannedy.daojdbc;

import echo.khannedy.daojdbc.dao.FakultasDao;
import echo.khannedy.daojdbc.entity.Fakultas;
import echo.khannedy.daojdbc.factory.DaoFactory;
import java.sql.SQLException;

public class Main {

    public static void main(String[] args) throws SQLException {

        // membuat fakultas baru
        Fakultas fakultas = new Fakultas();
        fakultas.setNama("Teknik dan Ilmu Komputer");

        // membuat fakultas dao
        FakultasDao dao = DaoFactory.getFakultasDao();

        // insert Fakultas
        dao.insert(fakultas);

        // mendapatkan id
        Long id = fakultas.getId();

        // load fakultas dari database
        fakultas = dao.getById(id);

        // mengubah data fakultas
        fakultas.setNama("Bahasa");

        // menyimpan data yang telah berubah
        dao.update(fakultas);

        // menghapus fakultas
        dao.delete(fakultas);
    }
}

pada artikel selanjutnya saya akan bahas tentang implementasi DAO pada JPA (Java Persistence API)

see you ๐Ÿ˜€

Iklan

23 pemikiran pada “Pengenalan Data Access Object {2} Implementasi dalam JDBC

  1. bisa jelasin bagian ini ga,, maksudnya ap

    di class DaoFactory
    fakultasDao = new FakultasDaoImpl(getConnection());
    itu sama aja ky ginikan

    FakultasDao fakultasDao = new FakultasDaoImpl(getConnection());

    pengetahuan java saya kurang ni maklum ๐Ÿ˜€
    tolong ya

    • betul… coba lihat brs ke 13 dsitu objek-nya sudah diinstantiasi

      private static FakultasDao fakultasDao

      klo belum bs pake cara yg ky dsebut mas faisal

      (sama2 br belajar java) ๐Ÿ™‚

  2. mas eko saya sudah coba konsep dao nya tapi ada eror di sql nya kira kira apa yah mas?? mohon bantuannya,
    ini pesan erornya:

    Exception in thread “main” java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
    at com.mysql.jdbc.StatementImpl.getGeneratedKeys(StatementImpl.java:1857)
    at Dao.Jdbc.dao.impl.FakultasDaoImpl.insert(FakultasDaoImpl.java:48)
    at Dao.Jdbc.main.main(main.java:34)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 1 second)

    ———————————————————————————————————————–
    dan ini potongan kode yang berhubungan dengan erornya , di netbeans saya connection minta di casting sehingga saat di lempar ke result nya generatekeys nya tidak terbaca itu analisa saya mungkin mas eko punya pendapat lain?

    public void insert(Fakultas fakultas) throws SQLException {
    PreparedStatement statement = null;
    ResultSet result= null;
    try{
    connection.setAutoCommit(false);
    //casting object??
    statement= (PreparedStatement) connection.prepareStatement(SQL_INSERT);

    statement.setNull(1,Types.BIGINT);
    statement.setString(2, fakultas.getNama());
    statement.executeUpdate();
    result = statement.getGeneratedKeys();

  3. saya sudah berhasil memecahkan eror nya ternyata harus di tambah kode seperti berikut,
    public void insert(Fakultas fakultas) throws SQLException {
    PreparedStatement statement = null;
    ResultSet result=null;

    try{
    connection.setAutoCommit(false);
    statement=(PreparedStatement) connection.prepareStatement(SQL_INSERT,PreparedStatement.RETURN_GENERATED_KEYS);
    /*pada bagian ini harus di tambah PreparedStatement.RETURN_GENERATED_KEYS saya
    kurang mengerti mungkin bug di mysql atau mungkin versi dari jdbc..
    */
    statement.setNull(1,Types.BIGINT);
    statement.setString(2, fakultas.getNama());
    statement.executeUpdate();

    trimkasih atas tutorialnya…

  4. mas bisa kasi contoh program yang ada gui nya dengan konep DAO JDBC,.,.soalx aq bingung mw buat dengan gui nya.,.,tlng mas aq newbiei.

  5. maaf mas, itu dao getByJurusan kok ga di terapin,.?
    saya masih belum bisa nih, kebetulan lagi mengalami kasus dao JOIN..
    mohon bantuan sangat, daripada saya harus utak-atik database lagi nih,.
    terima kasih

  6. Mas, makasih tutorialnya.

    Mau tanya, standart pengembangan aplikasi basis java swing+databse+oop itu yang ideal itu seperti apa? Search ke google, banyak versinya, bindung dewe. Nah klo refer ke tutorial sini, terlepas dari yang umum(ky class koneksi) :D, idealnya harus ada:
    1. Entitas dan POJOnya.
    2. Dao-nya.

    Nah klo dibandingkan dengan konsep MVC spt tutorial lain yg ada di web ini, manakah yg lebih baik?

    oya mas, ada beberapa tutorial yg pembahasan yg tulisannya kepotong. Eman sakjane mas, apik soale. Contoh pembahasan di atas.. ๐Ÿ˜€

    Suwun nggeh..

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s