Sudah lama juga saya tidak pernah membuka blog ini lagi karena banyaknya kerjaan yang membuat kepala saya pusing.😀

Sekarang mumpung saya lagi tidak ada kerjaan, saya ingin memberikan contoh membuat aplikasi CRUD(Create Read Update Delete) sederhana dengan mengunakan JDBC. Selain itu pada contoh ini juga saya akan menggunakan konsep MVC (Model View Controller) dan DAO(Data Access Object).

MVC itu adalah sebuah pattern dalam membuat suatu aplikasi dimana business logic dan presentation code terpisah, tidak digabungkan menjadi satu. Business Logic akan diwakilkan oleh model, sisi tampilan direpresentasikan oleh view, sedangkan controller akan bertindak sebagai pengontrol aliran request dan data yang masuk.

Keuntungan utama dari konsep MVC ini adalah apabila kita ingin merubah aplikasi, perubahan yang terjadi di business logic tidak akan mempengaruhi presentation code. Begitu juga sebaliknya. Sehingga akan sangat memudahkan dalam sisi maintainance.

Sedangkan DAO (Data Acess Object) itu adalah sebuah pattern dimana setiap entitas memiliki suatu class yang menangangi proses manipulasi data yang berhubungan dengan entitas tersebut.

Bingung baca teori ? Ok sekarang langsung saja ke contoh. Misalnya sekarang saya akan membuat suatu aplikasi web sederhana yang berfungsi untuk menampilkan seluruh data orang, menambah orang baru, mengubah serta menghapus data. Aplikasi tersebut hanya terdiri dari dua halaman saja, halaman home menampilkan seluruh data person. Dimana terdapat link update dan delete untuk setiap datanya. Selain itu juga terdapat link untuk menambah data person baru. Sedangkan halaman person berfungsi untuk menambah data baru atau mengedit data person.

Maka dari deksripsi di atas kita akan membuat model Person, serta DAO untuk model person tersebut. Kemudian kita juga akan membuat 2 halaman jsp yaitu home dan person, yang murni hanya bertindak sebagi view saja. Lalu kita juga akan membuat 2 buah controller, HomeController yang berfungsi untuk menangani request yang masuk ke halaman home, serta PersonController yang bertugas untuk mengatur alur serta business logic ketika request masuk ke halaman person.

Database yang saya gunakan adalah postgresql, sehingga kita memerlukan driver dari postgresql tersebut. Untuk library dari postgresql bisa kalian download disini. Kemudian untuk struktur databasenya silahkan kalian buat sebuah table person dengan field no(int) dan  name (varchar).

Sekarang langsung saja jalankan IDE kalian (saya menggunakan netbeans), lalu buat sebuah new web application project. Jangan lupa masukkan driver postgresql ke dalam project tersebut. Pertama-tama untuk menangani koneksi ke database, buatlah sebuah class ConnectionUtil di dalam package com.maniakjava.util. Berikut ini adalah codenya :

package com.maniakjava.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionUtil
{
    public static Connection getConnection()
    {
        Connection conn = null;
        try
        {
            Class.forName( "org.postgresql.Driver" );
            String url = "jdbc:postgresql://localhost:5432/test";
            String user = "postgres";
            String pass = "1234";
            conn = DriverManager.getConnection(url, user, pass);
        }
        catch (ClassNotFoundException cnfe)
        {
            System.err.println("Class error :  " + cnfe.getMessage());
        }
        catch (SQLException se)
        {
            System.err.println("SQL error : " + se.getMessage());
        }
        catch (Exception e)
        {
            System.err.println("Error : " + e.getMessage());
        }
        return conn;
    }
}

CLass ConnectionUtil di atas berfungsi untuk melakukan koneksi ke database menggunakan JDBC. Selanjutnya buatlah sebuah package com.maniakjava.model dan buat sebuah class Person di dalam package tersebut.

package com.maniakjava.model;

public class Person
{
    private int no;
    private String name;
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }
}

Sekarang kita akan membuat DAO untuk entitas Person. Buatlah sebuah interface PersonDAO di dalam package com.maniakjava.dao

package com.maniakjava.dao;

import com.maniakjava.model.Person;
import java.util.ArrayList;

public interface PersonDAO
{
    public Person prepareFormInsert();
    public ArrayList<Person> getListAllPerson();
    public void deletePerson(int no);
    public void insertPerson(Person person);
    public Person prepareFormEdit(int no);
    public Person  findPerson(int no);
    public void editPerson(Person person);
}

PersonDAO akan menangani seluruh operasi yang berhubungan dengan entitas Person saja. Karena PersonDAO berupa interface maka sekarang kita buat sebuah class PersonDAOImpl yang akan mengimplementasi interface PersonDAO. Buatlah di dalam package com.maniakjava.dao.impl

package com.maniakjava.dao.impl;

import com.maniakjava.dao.PersonDAO;
import com.maniakjava.model.Person;
import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PersonDAOImpl implements PersonDAO
{

    private Connection connection;

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

    // berfungsi untuk mengambil seluruh data person yang ada di database.
    public ArrayList<Person> getListAllPerson()
    {
        ArrayList<Person> result = new ArrayList<Person>();
        Statement stmt=null;
        ResultSet rs=null;
        try
        {
            stmt = connection.createStatement();
            rs = stmt.executeQuery("select * from person");
            while(rs.next())
            {
                Person person = new Person();
                person.setNo(rs.getInt("no"));
                person.setName(rs.getString("name"));
                result.add(person);
            }
        }
        catch (SQLException ex)
        {
            Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            if(connection!=null) try {
                connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(stmt!=null) try {
                stmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(rs!=null) try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return result;
    }

    //befungsi untuk mengapus data person berdasarkan nomor tertentu
    @Override
    public void deletePerson(int no)
    {
        Statement stmt=null;
        try
        {
            stmt = connection.createStatement();
            stmt.executeUpdate("delete from person where no="+no);
            connection.commit();
        }
        catch(SQLException ex)
        {
            Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            if(connection!=null) try {
                connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(stmt!=null) try {
                stmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    //befungsi untuk mendapatkan nomor terakhir di database, dan ditambah dengan 1 untuk menjadi
    //nomor yang akan diinsert ke  field no untuk data baru.
    private int getLastNo()
    {
        Statement stmt = null;
        ResultSet rs =null;
        int result = 0;
        try
        {
            stmt = connection.createStatement();
            rs = stmt.executeQuery("select no from person order by no desc limit 1");
            if(rs.next())
            {
                result = rs.getInt("no");
                result+=1;
            }
            else
            {
                result=1;
            }
        }
        catch(SQLException ex)
        {
            Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            if(connection!=null) try {
                connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(stmt!=null) try {
                stmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(rs!=null) try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return result;
    }

    //berfungsi untuk melakukan insert data person ke database
    @Override
    public void insertPerson(Person person)
    {
        PreparedStatement ps = null;
        try
        {
            ps = connection.prepareStatement("insert into person(no, name) values(?,?)");
            ps.setInt(1, person.getNo());
            ps.setString(2, person.getName());
            ps.executeUpdate();
            connection.commit();
        }
        catch(SQLException ex)
        {
            Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            if(connection!=null) try {
                connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(ps!=null) try {
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    //berfungsi untuk mempersiapkan data person saat hendak menambah data baru.
    @Override
    public Person prepareFormInsert()
    {
        Person person = new Person();
        person.setNo(getLastNo());
        person.setType("insert");
        person.setName("");
        return person;
    }

    //berfungsi untuk mempersiapkan data person saat hendak mengubah data
    @Override
    public Person prepareFormEdit(int no)
    {
        Person person = findPerson(no);
        return person;
    }

    //berfungsi untuk mencari data person di database
    @Override
    public Person findPerson(int no)
    {
        PreparedStatement ps = null;
        ResultSet rs = null;
        Person person = new Person();
        try
        {
            ps = connection.prepareStatement("select name from person where no=?");
            ps.setInt(1, no);
            rs = ps.executeQuery();
            if(rs.next())
            {
                person.setNo(no);
                person.setName(rs.getString("name"));
                person.setType("edit");
            }
        }
        catch(SQLException ex)
        {
            Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            if(connection!=null) try {
                connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(ps!=null) try {
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(rs!=null) try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return person;

    }

    //berfungsi untuk mengedit data person di database
    @Override
    public void editPerson(Person person) {
        PreparedStatement ps = null;
        try
        {
            ps = connection.prepareStatement("update person set name=? where no=?");
            ps.setString(1, person.getName());
            ps.setInt(2, person.getNo());
            ps.executeUpdate();
            connection.commit();
        }
        catch(SQLException ex)
        {
            Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            if(connection!=null) try {
                connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(ps!=null) try {
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(PersonDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

Sekarang kita akan membuat HomeDAO di dalam package com.maniakjava.dao

package com.maniakjava.dao;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface HomeDAO
{
public void prepareHome(HttpServletRequest request, HttpServletResponse response);
}

Lalu buat sebuah class HomeDAOImpl di dalam package com.maniakjava.daoimpl

package com.maniakjava.dao.impl;

import com.maniakjava.dao.HomeDAO;
import com.maniakjava.dao.PersonDAO;
import com.maniakjava.util.ConnectionUtil;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HomeDAOImpl implements HomeDAO
{

    @Override
    public void prepareHome(HttpServletRequest request, HttpServletResponse response)
    {
        try {
            PersonDAO personService = new PersonDAOImpl(ConnectionUtil.getConnection());
            request.setAttribute("listPerson", personService.getListAllPerson());
            RequestDispatcher rd = request.getRequestDispatcher("home.jsp");
            rd.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(HomeDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(HomeDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

Sekarang kita akan membuat class HomeController di dalam package com.maniakjava.controller

package com.maniakjava.controller;

import com.maniakjava.dao.HomeDAO;
import com.maniakjava.dao.impl.HomeDAOImpl;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HomeController extends HttpServlet
{
     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
        HomeDAO homeService = new HomeDAOImpl();
        homeService.prepareHome(request, response);
     }
}

Lalu buat sebuah class PersonController di package yang sama

package com.maniakjava.controller;

import com.maniakjava.dao.HomeDAO;
import com.maniakjava.dao.PersonDAO;
import com.maniakjava.dao.impl.HomeDAOImpl;
import com.maniakjava.dao.impl.PersonDAOImpl;
import com.maniakjava.model.Person;
import com.maniakjava.util.ConnectionUtil;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PersonController extends HttpServlet
{

     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
         PersonDAO personService = new PersonDAOImpl(ConnectionUtil.getConnection());
         String act = request.getParameter("act");
         String no = request.getParameter("no");
         if(act.equals("insert"))
         {
             Person person = personService.prepareFormInsert();
             request.setAttribute("person", person);
             RequestDispatcher rd = request.getRequestDispatcher("person.jsp");
             rd.forward(request, response);
         }
         if(act.equals("edit"))
         {
             Person person = personService.prepareFormEdit(Integer.parseInt(no));
             request.setAttribute("person", person);
             RequestDispatcher rd = request.getRequestDispatcher("person.jsp");
             rd.forward(request, response);
         }
         if(act.equals("delete")) 
         {
             personService.deletePerson(Integer.parseInt(no));
             HomeDAO homeService = new HomeDAOImpl();
             homeService.prepareHome(request, response);
         }
        
     }

     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         PersonDAO personService = new PersonDAOImpl(ConnectionUtil.getConnection());
         String type = request.getParameter("type");
         String no = request.getParameter("no");
         String name = request.getParameter("name");
         Person person = new Person();
         person.setNo(Integer.parseInt(no));
         person.setName(name);
         if(type.equals("insert")) personService.insertPerson(person);
         else if(type.equals("edit")) personService.editPerson(person);

         HomeDAO homeService = new HomeDAOImpl();
         homeService.prepareHome(request, response);
     }

}

Sekarang kita akan halaman view home.jsp.

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList" %>
<%@page import="com.maniakjava.model.Person" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <a href="personAction.do?act=insert">Add New Person </a>

        <br/><br/>
        Data Person : <br/>
        <table border="1">
            <tr>
                <td>No</td>
                <td>Name</td>
                <td></td>
                <td></td>
            </tr>
            <%
                ArrayList<Person> listPerson = (ArrayList<Person>) request.getAttribute("listPerson");
                for(int i=0;i<listPerson.size(); i++)
                {

            %>
            <tr>
                <td><%= listPerson.get(i).getNo() %></td>
                <td><%= listPerson.get(i).getName() %></td>
                <td><a href="personAction.do?act=edit&no=<%= listPerson.get(i).getNo() %>">Edit</a></td>
                <td><a href="personAction.do?act=delete&no=<%= listPerson.get(i).getNo() %>">Delete</a></td>
            </tr>
            <%
                }
            %>
        </table>
    </body>
</html>

Berikutnya halaman person.jsp :

<%@page import="com.maniakjava.model.Person"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form method="post" action="personAction.do">
            <table>
                <tr>
                    <td>No.</td>
                    <td>Name</td>
                </tr>
                <tr>
                    <%
                        Person person = (Person) request.getAttribute("person");
                    %>
                <input type="hidden" name="type" id="type" value="<%= person.getType() %>" >
                    <td><input type="text" name="no" id="no" value="<%= person.getNo() %>" readonly="true"></td>
                    <td><input type="text" name="name" id="name" value="<%= person.getName() %>"></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <input type="submit">
                    </td>
                </tr>
            </table>
        </form>
    </body>
</html>

Langkah terakhir, ubahlah web.xml kalian menjadi seperti ini

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
        <servlet-name>HomeServlet</servlet-name>
        <servlet-class>com.maniakjava.controller.HomeController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HomeServlet</servlet-name>
        <url-pattern>/doHome.do</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>PersonServlet</servlet-name>
        <servlet-class>com.maniakjava.controller.PersonController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PersonServlet</servlet-name>
        <url-pattern>/personAction.do</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>doHome.do</welcome-file>
    </welcome-file-list>
</web-app>

Comments
  1. plekur says:

    om,mau nanya dong.
    kenapa array listperson nya ga bisa ya?
    jadi data yang di database nya ga mau ikut tampil jg.
    mohon pencerahan nya.thanks^^

  2. tutorial yang sangat teramat keren……

    tpi masih ada yang bingung nih…..
    trutama pas bgian ‘web.xml’

    doHome.do itu mksdnya apa??kok dganti home.jsp malah error…

    help me please
    thx🙂

  3. Firdaus says:

    mau tanya nih gan,kalo web xml cara buat di netbeannya dmn?

    • ManiakJava says:

      kalo pake netbeans, pas mau bikin project baru kan pilih new Web Application gan, itu uda otomatis dibuatin sama netbeansnya..
      letaknya ada di folder Web Pages/ WEB-INF.
      kalo mau bikin sendiri file .xml juga bisa, tinggal klik kanan, pilih New -> XML Document

  4. makasih tutorialnya om,,

    tapi aku dapet error kaya mas yang nanya pertama,,ada error di listperson om. errornya kya gni:


    HTTP Status 500 – An exception occurred processing JSP page /home.jsp at line 24

    type Exception report

    message An exception occurred processing JSP page /home.jsp at line 24

    description The server encountered an internal error that prevented it from fulfilling this request.

    exception

    org.apache.jasper.JasperException: An exception occurred processing JSP page /home.jsp at line 24

    21:
    22: <%
    23: ArrayList listPerson = (ArrayList) request.getAttribute(“listPerson”);
    24: for(int i=0;i

    Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

    root cause

    java.lang.NullPointerException
    org.apache.jsp.home_jsp._jspService(home_jsp.java:88)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

    mohon bantuannya om,,ada tugas kuliah ni..hehehhe

    thx b4

  5. Om, sori mau ganggu lagi..ehehehhe🙂

    gini om, kenapa ya ketika saya masukan url home.jsp pertama kali data yg ada di database tidak langsung muncul, saya harus lakukan insert data dulu, setelah berhasil baru data nya muncul semua..

    ditunggu jawabanya om..
    thx b4..

    • ManiakJava says:

      sorry baru bales om..
      itu manggilnya gmn om ? langsung /home.jsp ya ?
      kalau iya, memang tidak akan muncul om..
      karena data2 yg di database dipanggil di HomeController, dan untuk membuat HomeController, manggilnya harus /doHome.do om (sesuai settingan di xml nya)

  6. ChristianWahyu says:

    om, mau tanya nih..
    itu yg class HomeController buatnya pake servlet apa class java biasa?

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