Users  

   

Hobi  

   

Statistik  

Visitors
232
Articles
59
Articles View Hits
394886
   

User Online  

We have 21 guests and no members online

   

Membuat Generic DAO di Java

Details

Membuat Generic DAO

 

Pada article ini saya akan membahas tentang pembuatan Generic DAO, tetapi sebelum ke inti pembahasan saya akan jelaskan mengapa harus Generic DAO.

Apabila anda sudah terbiasa membuat suatu DAO (Data Akses Objek), pasti anda sangat terbiasa dengan ini, jika suatu entity class yang di dalamnya mewakili sebuah table di database maka untuk memisahkan proses akses ke database di perlukan sebuah DAO untuk setiap entity class. Menurut analisa saya, apa yang terjadi jika anda membuat suatu project besar yang memiliki banyak module yang di dalam nya memiliki banyak entity class. Tentunya si programmer dengan rajin dan sabar membuat satu persatu DAO tersebut untuk kebutuhan bisnis proses dari aplikasi. Nah disinilah Generic DAO diperlukan agar sang programmer tidak perlu melakukan pemborosan tersebut.

Sebetulnya dalam pembelajaran Generic DAO ini, saya sebelumnya melihat hanya ada satu Base DAO yang isinya implemenntasi dari method - method untuk proses akses ke database dan class Base DAO ini merupakan class generic. Akan tetapi masih di perlukan setiap class DAO untuk masing entity tersebut, hanya bedanya dengan adanya Generic DAO tersebut si programmer tidak perlu melakukan implementasi method untuk masing - masing DAO tersebut, jadi hanya tinggal seperti ini :

public class [Entity]Dao extends BaseDao<[Entity]>

Melihat dari contoh kode di atas, class tersebut merupakan kosong tanpa isi. Sebab implmentasinya sudah di tangani oleh class BaseDAO. Tapi menurut saya kode seperti itu masih tetap saja merepotkan, kemudian saya mencoba memodifikasinya kode tersebut, agar setiap transaksi menggunakan class yang sama seperti Persistence Managernya Cimande,  Nah sekarang kita langsung saja ke contoh kode.

Yang harus pertama di buat adalah class BaseDao.java

  1: public class BaseDaoHibernate<T> {
  2: 
  3:     @SuppressWarnings("unchecked")
  4:     protected Class domainClass;
  5: 
  6:     @Autowired protected SessionFactory sessionFactory;
  7: 
  8:     @SuppressWarnings("unchecked")
  9:     public BaseDaoHibernate() {
 10:         this.domainClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
 11:     }
 12: 
 13: 
 14:     public T save(T domain) {
 15:         sessionFactory.getCurrentSession().saveOrUpdate(domain);
 16:         return domain;
 17:     }
 18: 
 19:     public void delete(T domain) {
 20:         sessionFactory.getCurrentSession().delete(domain);
 21:     }
 22: 
 23:     @SuppressWarnings("unchecked")
 24:     public T findById(Object id) {
 25:         if(id == null) return null;
 26:         final T domain = (T) sessionFactory.getCurrentSession().get(domainClass, (Serializable) id);
 27:         return domain;
 28:     }
 29: 
 30: 
 31:     @SuppressWarnings("unchecked")
 32:     public List<T> findList(String query) {
 33:      return sessionFactory.getCurrentSession().createQuery(query).list();
 34:     }
 35: }
 36: 

setelah itu class yang harus di buat adalah GeneralDao.java

  1: @Repository
  2: public class GeneralDao extends BaseDaoHibernate<Object>{
  3: 
  4: }

jika class di atas sudah di buat, selanjut adalah pembuat interface dan class service yang di gunakan untuk setiap transaksi. Nah yang pertama di buat adalah Interface Manager.java

  1: 
  2: public interface Manager {
  3: 
  4:     void save (Object save);
  5:     void delete (Object delete);
  6:     Object findById (Object id);
  7:     List findList(String query);
  8: }
  9: 

setelah interface di buat, sekarang ke pembuatan class implmentasi dari interfacenya yaitu ManagerImplement.java

  1: @Service("manager")
  2: @Transactional(readOnly=true)
  3: public class ManagerImplement implements Manager {
  4: 
  5:     @Autowired GeneralDao generalDao;
  6:     
  7:     @Transactional
  8:     public void save(Object xclass) {
  9:         generalDao.save(xclass);
 10:     }
 11: 
 12:     @Transactional
 13:     public void delete(Object xclass) {
 14:         generalDao.delete(xclass);
 15:     }
 16: 
 17:     public Object findById(Object id) {
 18:         return generalDao.findById(id);
 19:     }
 20: 
 21:     public List findList(String query) {
 22:         return generalDao.findList(query);
 23:     }
 24: 
 25: }

setelah semuanya dibuat programmer bisa santai bertransaksi ke database tanpa harus membuat dao satu persatu. Nah untuk cara pakainya, bisa mengikuti contoh di bawah ini :

  1: public class Tester {
  2:  @Autowired private Manager manager;
  3:  
  4:  public static void main(String args[]) {
  5:   // Untuk Save
  6:   manager.save([Object]);
  7:  }
  8: }
  9: 

Fuihh, akhirnya articlenya selesai juga. Semoga bermanfaat bagi para pembaca yang membaca article ini, mohon maaf bila ada yang kurang atau ada yang salah dengan article ini.

Terima Kasih

Sumber

Contoh Penggunaan Framework Java Spring Hibernate

Details

Seperti biasa, masih mengenai java, tutorial kali ini tentang framework di java, spring dan hibernate.

Disini saya akan membagikan sedikit contoh penerapan keduanya. Disini saya memang bukan master spring maupun hibernate, namun contoh ini merupakan dasar apabila anda ingin menggunakan keduanya. Jadi tinggal anda kembangkan saja dari dasar contoh ini.

Penerapan pada contoh ini adalah memasukan data ke dalam database yg memakai MySQL server dan memakai swing untuk memasukannya. Saya menggunakan IDE NetBeans 6.7.1 untuk membuatnya. Karena kata sebagian para ahli java, IDE ini yang paling gampang digunakan untuk para pemula, karena penggunaannya yang relatif simple.

Kumpulkan semua library yang akan digunakan (tentu saja, hehe..). Untuk connect ke database MySQL saya menggunakan mysql-connector-java-5.0.6-bin.jar. Dan pada project tambahkan library Hibernate dan Spring.

Tidak panjang lebar, langsung ke code-nya saja..

 

Buat file ApplicationContextProvider.java karena memakai Spring

 

01 package com.contoh.provider;
02 import org.springframework.context.ApplicationContext;
03 import org.springframework.context.support.ClassPathXmlApplicationContext;
04 public class ApplicationContextProvider {
05      private ApplicationContext applicationContext;
06      private static ApplicationContextProvider provider;
07      private ApplicationContextProvider() throws ExceptionInInitializerError {
08           try {
09                this.applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
10           } catch (Throwable ex) {
11                System.err.println("Initial ApplicationContext creation failed -- " + ex);
12                throw new ExceptionInInitializerError(ex);
13           }
14      }
15      public synchronized static ApplicationContextProvider getInstance() throws ExceptionInInitializerError {
16      ApplicationContextProvider tempProvider = null;
17      if (provider == null) {
18           provider = new ApplicationContextProvider();
19           tempProvider = provider;
20      } else if (provider.getApplicationContext() == null) {
21           provider = new ApplicationContextProvider();
22           tempProvider = provider;
23      } else {
24           tempProvider = provider;
25      }
26      return tempProvider;
27 }
28 /* getter - setter.. */

 

Buat class model Peminjam.java dan Peminjaman.java ini juga disebut pojo. Class ini digunakan untuk memodelkan rancangan tabel di database. Karena menggunakan Hibernate, kita tidak perlu membuat tabel di database dan relasinya, kita bisa membuatnya melalui class dengan memakai anotasi (@). Di MySQL cukup dengan membuat database kosong saja dengan nama contoh_db misalnya yang saya gunakan disini.

 

01 package com.contoh.model;
02 import java.io.Serializable;
03 import javax.persistence.Column;
04 import javax.persistence.Entity;
05 import javax.persistence.Id;
06 import javax.persistence.Table;
07  
08 @Entity
09 @Table(name = "peminjam")
10 public class Peminjam implements Serializable {
11      @Id
12      @Column(name = "idpeminjam", length = 3, nullable = false, unique = true)
13      private String idPeminjam;
14      @Column(name = "nama", length = 20, nullable = false)
15      private String nama;
16      @Column(name = "alamat", length = 30, nullable = false)
17      private String alamat;
18      @Column(name = "telepon", length = 20, nullable = false)
19      private String telepon;
20      /*constructor - getter - setter*/

 

01 package com.contoh.model;
02 import java.io.Serializable;
03 import java.sql.Date;
04 import javax.persistence.Column;
05 import javax.persistence.Entity;
06 import javax.persistence.Id;
07 import javax.persistence.JoinColumn;
08 import javax.persistence.ManyToOne;
09 import javax.persistence.Table;
10  
11 @Entity
12 @Table(name = "Peminjaman")
13 public class Peminjaman implements Serializable {
14  
15     @Id
16     @Column(name = "kodepeminjaman", length = 5, nullable = false, unique = true)
17     private String kodePeminjaman;
18     @ManyToOne
19     @JoinColumn(name = "idpeminjam", nullable = false)
20     private Peminjam idPeminjam;
21     @Column(name = "tgl_pjm")
22     private Date tglPinjam;

 

Buat class interface DAO.. dari kedua class model diatas..

 

1 package com.contoh.dao.iface;
2 import com.contoh.model.Peminjam;
3 import org.springframework.dao.DataAccessException;
4 public interface PeminjamDAOInterface {
5      public void insert(Peminjam peminjam) throws DataAccessException;
6 }

 

1 package com.contoh.dao.iface;
2 public interface PeminjamanDAOInterface {
3      public void insert(Peminjaman peminjaman) throws DataAccessException;
4 }

 

Buat class DAO yang mengimplementasi interface DAO diatas..

 

01 package com.contoh.dao.impl;
02 import com.contoh.dao.iface.PeminjamDAOInterface;
03 import com.contoh.model.Peminjam;
04 import org.hibernate.SessionFactory;
05 import org.springframework.beans.factory.annotation.Autowired;
06 import org.springframework.dao.DataAccessException;
07 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
08  
09 public class PeminjamDAO extends HibernateDaoSupport implements PeminjamDAOInterface {
10  
11      @Autowired
12      public void setSuperSessionFactory(SessionFactory sessionFactory) {
13           super.setSessionFactory(sessionFactory);
14      }
15  
16      public void insert(Peminjam peminjam) throws DataAccessException {
17           getHibernateTemplate().save(peminjam);
18      }
19 }

 

01 @Repository
02 public class PeminjamanDAO extends HibernateDaoSupport implements PeminjamanDAOInterface {
03  
04      @Autowired
05      public void setSuperSessionFactory(SessionFactory sessionFactory) {
06           super.setSessionFactory(sessionFactory);
07      }
08  
09      public void insert(Peminjaman peminjaman) throws DataAccessException {
10           getHibernateTemplate().save(peminjaman);
11      }
12 }

 

Bikin file xml dengan nama applicationContext.xml

 

11 <context:component-scan base-package="com.contoh.dao.impl"/>
12 <tx:annotation-driven transaction-manager="transactionManager"/>
13      <bean id="propertyConfigurer"
14           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
15           p:location="classpath:jdbc.properties"/>
16      <bean id="dataSource"
17           class="org.springframework.jdbc.datasource.DriverManagerDataSource"
18           p:driverClassName="${jdbc.driver}"
19           p:url="${jdbc.url}"
20           p:username="${jdbc.username}"
21           p:password="${jdbc.password}"/>
22      <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
23           <property name="dataSource" ref="dataSource"/>
24           <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
25      </bean>
26      <bean id="transactionManager"
27           class="org.springframework.orm.hibernate3.HibernateTransactionManager"
28           p:sessionFactory-ref="sessionFactory"/>
29      <bean id="peminjamDAO"
30           class="com.contoh.dao.impl.PeminjamDAO"
31           p:sessionFactory-ref="sessionFactory" />
32      <bean id="peminjamanDAO"
33           class="com.contoh.dao.impl.PeminjamanDAO"
34           p:sessionFactory-ref="sessionFactory" />
35 </beans>

 

Bikin file xml untuk konfigurasi hibernate dengan nama hibernate.cfg.xml

 

01 <?xml version="1.0" encoding="UTF-8"?>
02 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
04 <hibernate-configuration>
05      <session-factory>
06           <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
07           <property name="hibernate.hbm2ddl.auto">update</property>
08           <mapping class="com.contoh.model.Peminjam"/>
09           <mapping class="com.contoh.model.Peminjaman"/>
10      </session-factory>
11 </hibernate-configuration>

 

Buat file properties dengan nama jdbc.properties

 

1 jdbc.driver=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/contoh_db
3 jdbc.username=root --> tergantung username di MySQL anda
4 jdbc.password=admin --> tergantung password yg anda gunakan

 

Ketiga file diatas saya letakkan di default package, jika anda akan meletakkannya di package lain, jangan ubah settingan di file-file xml-nya..

 

Buat GUI dengan swing dengan tampilan seperti dibawah ini..untuk mencoba memasukkan data ke dalam database contoh_db

 

 

kemudian isikan code berikut pada button insertPeminjamButtonActionPerformed

 

01 if (JOptionPane.showConfirmDialog(this, "Yakin simpan data?", "KONFIRMASI", JOptionPane.YES_NO_OPTION) == 0) {
02      try {
03           Peminjam peminjam = new Peminjam();
04           peminjam.setIdPeminjam(idPeminjamTextField.getText());
05           peminjam.setNama(namaTextField.getText());
06           peminjam.setAlamat(alamatTextField.getText());
07           peminjam.setTelepon(teleponTextField.getText());
08           ApplicationContext ac = ApplicationContextProvider.getInstance().getApplicationContext();
09  
10      PeminjamDAOInterface odao = (PeminjamDAOInterface) ac.getBean("peminjamDAO",               PeminjamDAOInterface.class);
11      odao.insert(peminjam);
12      JOptionPane.showMessageDialog(this, "Data telah tersimpan");
13      } catch (DataAccessException ex) {
14              JOptionPane.showMessageDialog(this, "Gagal Simpan Data!");
15              JOptionPane.showMessageDialog(this, "Error " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
16      }
17 }

 

Dan isikan juga pada button insertPeminjamanButtonActionPerformed

 

01 if (JOptionPane.showConfirmDialog(this, "Yakin simpan data?", "KONFIRMASI", JOptionPane.YES_NO_OPTION) == 0) {
02      try {
03           Peminjam p = new Peminjam();
04           p.setIdPeminjam(idPeminjam2TextField.getText());
05           Date tglPinjam = Date.valueOf(tanggalTextField.getText());
06           Peminjaman peminjaman = new Peminjaman();
07           peminjaman.setKodePeminjaman(kodePeminjamanTextField.getText());
08           peminjaman.setIdPeminjam(p);
09           peminjaman.setTglPinjam(tglPinjam);
10           ApplicationContext ac = ApplicationContextProvider.getInstance().getApplicationContext();
11           PeminjamanDAOInterface odao = (PeminjamanDAOInterface) ac.getBean("peminjamanDAO", PeminjamanDAOInterface.class);
12           odao.insert(peminjaman);
13           JOptionPane.showMessageDialog(this, "Data telah tersimpan");
14      } catch (DataAccessException ex) {
15           JOptionPane.showMessageDialog(this, "Gagal Simpan Data!");
16           JOptionPane.showMessageDialog(this, "Error " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
17      }
18 }

 

Buat koneksi ke database melalui NetBeans, untuk memudahkan melihat isi data atau buka MySQL Query Browser. Kemudian jalankan project ini, setelah keluar inputan swing seperti dibawah ini masukan data peminjam ke textfield yang ada pada sebelah kiri, karena hanya akan mencoba memasukan data ke tabel Peminjam, kemudian klik button Insert Peminjam

 

 

Setelah data berhasil masuk ke tabel maka keluar tampilan seperti dibawah ini, masukan beberapa data peminjam untuk mencoba primary key-nya juga.

 

 

Selanjutnya masukan data peminjaman dengan memasukan ID Peminjam yang sudah berhasil masuk ke tabel tadi (diingat-ingat..hehe..). Klik button Insert Peminjaman

 

 

Yap, akan keluar pesan seperti dibawah ini jika data telah berhasil disimpan ke dalam tabel.

 

 

Eureka..!

 

Buka MySQL Query Browser atau melalui NetBeans untuk melihat isi tabel, dan secara ajaib, database yang  tadi kosong dan tidak berisi tabel, setelah program ini dijalankan tabel-tabel tersebut beserta relasinya telah dibuatkan oleh Hibernate..

How Amazing about that..! hehe.. :D

sumber : http://ivano46.wordpress.com/

Membuat Aplikasi Web Launcher Di Android

Details

Seperti biasa, masih mengenai java, dari pada gak ada kerjaan (sebenarnya kerjaan banyak, apalagi ditambah sama ketua HMTI buat jadi panitia TO, jadi makin banyak & repot) lebih baik saya buat tutorial. Ditutorial kali ini saya akan membuat aplikasi android seperti judul diatas, Web Launcher. Apa itu web launcher, web launcher itu sebuah aplikasi kecil untuk masuk ke halaman web/blog kita tanpa perlu membuka web browser dan mengetikan URL. Aplikasi web launcher ada 2 macam, cara pertama cukup mudah, tinggal buat project lalu memasang WebView dengan width dan height diset fill-parent dan mengatur agar webView langsung load halaman web yang dimaksud saat pertama jalan. Selesai sudah..!! Tapi… dimana seninya, kalau cuma yang standar-standar gitu?

Ditutorial kali ini saya akan membuat web launcher yang bisa meload halaman berikutnya tetap di dalam launcher (tidak membuat web browser), bisa menampilkan progress bar, dan punya feature zoom-in/out, mirip seperti aplikasi facebook,dll. jadi baca sampai habis..!!

Berhubung web HMTI belum tersedia versi mobile, jadi mungkin halaman aplikasi kita kurang sempurna karena tampilannya, tapi tidak apa-apa, saya buat aplikasi ini untuk bahan belajar siapa tau ada yang perlu membuat web launcher untuk web/blog nya sekaligus memperkenalkan web resmi HMTI, agar siapa yang pakai aplikasi ini pasti tau HMTI (yayalah, la wong aplikasinya langsung masuk ke web HMTI), terima kasih untuk sesepuh HMTI sudah diberi izin untuk membuat web launcher nya, semoga amal ibadahmu diterima disisinya... hehee

Seperti biasa, kita buat project baru di IDE kesayangan kita (Eclipse), tak usah menerangkan bagaimana cara membuat project baru di eclipse untuk membuat aplikasi android, karena sangat melelahkan, sebaiknya cari tau sendiri saja :) . Lalu beri nama project tsb HMTI, setelah project selesai dibuat, sekarang saatnya kita rubah isi dari main.xml yang terletak di folder res/layout, hapus semua source code xml tsb dan rubah seperti berikut

<?xml version="1.0" encoding="utf-8"?>
<WebView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>


Setelah selesai, sekarang kita buat file xml lagi, kita beri nama about.xml dan simpan satu folder bersama main.xml yaitu di folder res/layout. isi
about.xml dengan source code berikut

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:padding="10dip">
   <TextView
      android:id="@+id/about_content"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/about_text" />
</ScrollView>


Kalau sudah jadi, akan nampak seperti ini

Selesai membuat semua file xml, sekarang kita rubah icon-icon default milik android, agar aplikasi kita mempunyai icon sesuai keinginan kita. Hapus dulu folder drawable-hdpi, drawable-mdpi dandrawable-ldpi yang ada di folder res. lalu download kumpulan icon berikut disini, extract dan masukan difolder res. lihat gambar

Setelah selesai, sekarang waktunya kita coding java....

Sekarang buka file hmti.java atau activity nya yang ada di folder src dan kita rubah seperti seperti ini

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class hmti extends Activity {

    public static final int ABOUT = Menu.FIRST+1;
    public static final int EXIT = Menu.FIRST+2;
//membuat option menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu
        .add(Menu.NONE, ABOUT, Menu.NONE, "About")
        .setIcon(R.drawable.hmti_about);
    menu
        .add(Menu.NONE, EXIT, Menu.NONE, "Exit")
        .setIcon(R.drawable.hmti_exit);
        return super.onCreateOptionsMenu(menu);
    }
//aksi untuk option menu yg terpilih
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch (item.getItemId()) {
        case ABOUT:
            startActivity(new Intent(this, About.class));
            return(true);
        case EXIT:
            finish();
            return(true);
        }
        return(super.onOptionsItemSelected(item));
    }

    /** Called when the activity is first created. */
    final Activity activity = this;
//aplikasi
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                activity.setTitle("Loading coy...");
                activity.setProgress(newProgress * 100);
                if (newProgress == 100) {
                    activity.setTheme(R.string.app_name);
                    activity.setTitle("HMTI");
                }
            }
        });
        webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        webView.loadUrl("http://www.hmtibansal.org");

    }
}


Setelah selesai, masih difolder yang sama, di src , kita buat file java baru bernama about.java , file ini berfungsi untuk option menu, aplikasi kalau tidak ada option menu rasanya kurang lengkap.


 Setelah selesai membuat file, sekarang isi about.java  dengan source code berikut

package com.hmti.main;

import android.app.Activity;
import android.os.Bundle;

public class About extends Activity {
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);
    }
}

Setelah selesai coding java nya, sekarang kembali ke xml, kita rubah lagi file AndroidManifest.xml sekaligus menambahkan permission internet agar aplikasi kita diperbolehkan membuka halaman web juga menambahkan akses activity untuk menu option, rubah source codenya seperti berikut

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hmti.main" android:versionCode="1" android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".hmti" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name="About"
            android:theme="@android:style/Theme.Dialog" android:label="@string/about_title"></activity>
    </application>
    <uses-sdk android:minSdkVersion="4" />

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

</manifest>

 

Langkah terkahir sekarang kita ubah file strings.xml yang ada di folder res/values seperti berikut

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">HMTI</string>
    <string name="about_label">About</string>
    <string name="about_title">HMTI Launcher</string>
    <string name="about_text">software by : <b>Umbara</b>
    </string>
<string name="main_title">HMTI</string>
</resources>

Sekarang selesai sudah pembuatan aplikasinya, saat kita compile dan jalankan, kalau tidak ada error aplikasi akan berjalan seperti ini

Sampai disini kita telah sukses membuat aplikasi android, sesuatu banget yach...... :)


Sebenarnya ada cara mudah untuk membuat web launcher, kita tinggal masuk ke website http://www.appsgeyser.com/ lalu tinggal klik "create" next-next-next, jadi.!! tapi cara tsb tidak mencerminkan mahasiswa IT, kita tidak mau disebut "yang bisanya cuma klik-klik-klik & finish", lagi pula kalau kita coding sendiri bisa lebih leluasa untuk membuat aplikasi, juga sekaligus bahan belajar....

Sekian dari saya, apabila ada salah mohon dibenarkan, maklum newbie... :)

Ditutorial selanjutnya insya Allah saya akan buat web launcher versi Blackberry, tapi nanti kalau saya sudah pakai Blackberry, Percuma sekarang buat kalau gak bisa make.. wkwkwkwkwkwk

Bagi yang ingin mengembangkan Aplikasi ini, project bisa didownload disini

dan untuk aplikasi HMTI.apk yang ingin langsung diinstall di hp android, bisa didownload disini

Terima Kasih....

aplikasi CRUD sederhana menggunakan framework hibernate

Details

Pada artikel ini akan membahas tentang dasar membuat proses Create, Read, Update dan Delete menggunakan Hibernate sebagai Framework dan Netbean sebagai IDE-nya, biasanya configurasii Hibernate selalu tidak pernah lepas dengan configurasi Spring, tapi pada kesempatan ini saya akan menguraikan tentang Hibernate tanpa Spring, dengan tujuan jika ingin membuat aplikasi desktop maka configurasi Spring tidak diperlukan.

Sebelum memulai ada baiknya kita mengetahui class-library apa saja yang diperlukan untuk membangun aplikasi jika akan menggunakan Hibernate Annotations.

Pertama yang perlu dipersiapkan adalah database nya, saya disini menggunakan database MySql, buat sebuah database bernama "coba", database ini yang nantinya akan digunakan untuk menyimpan data kita.

Sekarang bagaimana caranya memasukan library – library tersebut kedalam project properties yang akan kita buat? Cukup kita ikuti langkah – langkahnya sebagai berikut; dari Toolbar pilih Tools diklik, terus akan keluar dropdown menu, kemudian pilih Libraries maka akan keluar window box dengan title ”Library Manager”, kemudian tekan tombol “New Library…”, maka akan keluar lagi window box dengan title “New Library”, isikan kata Hibernate pada textbox Library Name, terus pilih “Class Libraries” combobox Library Type, kemudian tekan OK, setelah itu pilih file jar library hibernate seperti yang telah tertera diatas ke folder yang telah kita tentukan sebelumnya dengan cara tekan tombol “Add Jar/Folder…” pada tab “Classpath”, seperti gambar berikut :

Setelah itu tekan tombol “OK”, sekarang pembahasan akan dilanjutkan dengan membuat project baru dalam IDE Netbean. Setelah membuat project baru, baik itu web project atau desktop project.

Setelah seluruh library yang diperlukan disiapkan dalam folder library, sekarang waktunya membahas membuat CRUD menggunakan Hibernate, sebelum mulai coding dengan java class perlu kita ketahui terlebih dahulu basic konfigurasi yang wajib dipenuhi, supaya Hibernate dapat berfungsi dengan baik, konfigurasi ini melibatkan file xml yang akan diletakkan di folder root dari folder “Source Packages”, file ini harus diberi nama “hibernate.cfg.xml” dan isi dari file tersebut akan seperti berikut:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/coba</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping class="xxx.TabelMahasiswa"/>
    </session-factory>
</hibernate-configuration>

 

Dari source xml konfigurasi diatas terdapat beberapa properties yang harus ada untuk membangun aplikasi berbasis framework hibernate, berikut daftar beserta keterangan dari properties diatas, untuk lebih lengkapnya dapat dilihat pada link berikut:

 

http://www.hibernate.org/hib_docs/reference/en/html/session-configuration.html

 

 

- connection.driver.class,  property  ini  digunakan sebagai penentu driver database apa yang akan digunakan untuk tersambung ke database.

 

-connection.url, property ini digunakan untuk menentukan tujuan url database yang akan terpakai sebagai connection terhadap database.

 

-connection.username,  property  user  name  yang dipakai untuk mengakses database.

 

- connection.password,   property    password   yang    dipakai    untuk mengakses database.

 

- connection.pool.size, property yang digunakan sebagai batasan berapa koneksi maksimum yang boleh digunakan untuk tersambung ke database.

 

- dialect,  property  yang menentukan jenis dialect yang akan digunakan, disesuaikan dengan jenis database yang dipakai.

 

-current_session_context_class,  property  yang  digunakan  untuk memperlakukan session context, pilihan properties-nya berupa; jta | thread | managed | custom.Class.

 

- cache.provider_class, property untuk menentukan class yang digunakan untuk custom CacheProvide.

 

-show_sql, property untuk memperlihat perintah sql yang di eksekusi pilihannya bisa true atau false

 

-hbm2ddl.auto, property untuk otomasi validasi atau export schema terhadap database disaat SessionFactory dibuat, atau dengan property create-drop schema akan langsung di drop ketika SessionFactory ditutup. Adapun property diatas menggunakan update berarti akan menggenerate tabel secara otomatis jika tabel tidak tersedia, tapi jika tabel tersedia, hanya akan dirubah saja jika ada perubahan

 

Sedangkan untuk baris kode “<mapping class=”xxx.TabelMahasiswa”/>” merupakan perintah untuk mapping suatu class Model Annotation supaya dapat terbaca oleh file hibernate.cfg.xml, jumlah mapping ini akan banyak atau sedikit tergantung dari banyaknya class Model yang dibuat untuk menunjang aplikasi yang hendak dibangun tersebut.

 

Setelah selesai dengan konfigurasi sekarang waktunya membuat class Model yang mewakili sebuah tabel pada database. Sebagai contoh kita akan membuat class “TabelMahasiswa” yang akan disimpan dalam package “xxx”, berikut kode-nya:

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

@Entity
@Table(name = "tbl_mahasiswa")
public class TabelSiswa implements Serializable{
    @Id
    @GeneratedValue
    private int id;
  
    @Column(name="no_induk", nullable=false,length=10)
    private String nomorInduk;
  
    @Column(name="nama", nullable=false,length=30)
    private String nama;
  
    @Column(name="alamat", nullable=false,length=45)
    private String alamat;

    public int getId() {
        return id;
    }

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

    public String getNomorInduk() {
        return nomorInduk;
    }

    public void setNomorInduk(String nomorInduk) {
        this.nomorInduk = nomorInduk;
    }

    public String getNama() {
        return nama;
    }

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

    public String getAlamat() {
        return alamat;
    }

    public void setAlamat(String alamat) {
        this.alamat = alamat;
    }
}

Kode diatas mewakili sebuah table dalam database MySQL yang bernama “tbl_mahasiswa” dengan nama field yang tertera dalam properties @Column diatas, jadi disini kita tidak perlu membuat tabel lagi didatabase,dari source kode “TabelMahasiswa” diatas dapat kita lihat beberapa syntax code yang diawali dengan tanda “@”, inilah yang disebut Annotations sekilas akan dijelas arti dari masing – masing perintah diatas sebagai berikut, namun untuk lebih jelasnya dapat dilihat pada link berikut http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html (this link written in English, so please read it carefully):

 

-@Entity, berfungsi untuk mendefinisikan sebuah class Model adalah sebuah Entity bean yang dihubungkan dengan POJO persistence.

 

-@Table, berfungsi untuk menghubungkan suatu class Entity terhadap sebuah table dalam sebuah schema database.

 

-@Id, berfungsi untuk mendefinisikan salah satu propery field dari entity bean yang akan berperan sebagai identifier.

 

-@GeneratedValue, berfungsi untuk mendefinisikan type generator yang digunakan untuk memperoleh nilai dari identifier @Id.

 

-@Column, berfungsi sebagai property field mapping terhadap field yang berada di table di database.

 

Kemudian buatlah file java class yang diberi nama HibernateUtility.java yang digunakan sebagai Session Factory, yang menghubungkan suatu proses transaction yang dibuat secara programmatic dengan system konfigurasi hibernate yang telah ditentukan sebelumnya. Adapun source kode dari HibernateUtility akan seperti berikut:


import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; public class HibernateUtil { private static final SessionFactory sessionFactory; static{ try{ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); }catch(Throwable th){ System.err.println("Initial SessionFactory creation failed"+th); throw new ExceptionInInitializerError(th); } } public static SessionFactory getSessionFactory(){ return sessionFactory; } }

Setelah selesai membuat HibernateUtility.java sekarang mulai membahas pada proses Create, Read, Update dan Delete, yang akan disimpan dalam package “xxx.client” berikut source kode “CreateData.java” yang berisi contoh perintah untuk menginsert data:

import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import xxx.HibernateUtil; import xxx.TabelMahasiswa; public class CreateData { public static void main(String[] args) throws Exception { SessionFactory sessFact = HibernateUtil.getSessionFactory(); Session sess = sessFact.getCurrentSession(); Transaction tr = sess.beginTransaction(); TabelMahasiswa stu = new Tabelmahasiswa(); stu.setNama("Renna"); stu.setNomorInduk("123456"); stu.setAlamat("Jl. Sukajadi No. 10"); sess.save(stu); tr.commit(); System.out.println("Successfully inserted"); sessFact.close(); } }

Membahas apa yang tertulis pada source kode pada baris pertama sampai ketiga dalam method “main” tertulis perintah untuk inisialisasi Session Hibernate dan Transaction, kemudian dilanjutkan dengan inisialisasi “TabelMahasiswa” yang menghubungkan langsung dengan tabel “tabel_mahasiswa” di database, dengan mengisikan nilai variable terhadapa method – method “set” kemudian dimasukan ke method “save” yang berada di bawah inisialisasi Session, hal tersebut sudah merupakan proses “insert into” terhadap tabel di database. Kemudian perintah di tutup dengan perintah “commit” untuk eksekusi insert data terhadap tabel dan perintah “close” untuk mengakhiri inisialisasi Session. Dilanjutkan dengan “ReadData.java” berikut source kode-nya:


import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import xxx.HibernateUtil; import xxx.TabelMahasiswa; public class ReadData { public static void main(String[] args) throws Exception { SessionFactory sessFact = HibernateUtil.getSessionFactory(); Session sess = sessFact.getCurrentSession(); Transaction tr = sess.beginTransaction(); Query query = sess.createQuery("from TabelMahasiswa"); List result = query.list(); Iterator it = result.iterator(); System.out.println("id sname sroll scourse"); while(it.hasNext()){ TabelMahasiswa st = (TabelMahasiswa)it.next(); System.out.print(st.getId()); System.out.print(" "+st.getNomorInduk()); System.out.print(" "+st.getNama()); System.out.print(" "+st.getAlamat()); System.out.println(); } sessFact.close(); } }


Sedikit berbeda dengan source kode sebelumnya, perintah diatas adalah untuk menampilkan data dari tabel atau sama dengan perintah “select” pada query, tetapi jika menggunakan Hibernate cukup dengan perintah “createQuery” dan sebutkan nama instant mapping tabel tersebut sudah cukup untuk mengambil data, kebutuhan pengambilan data dapat di rubah where clause-nya sesuai kebutuhan. Selain itu juga diperlukan class List dan Iterator untuk mengurai class yang ter-enkapsulasi menjadi object – object yang terkecil. Dilanjutkan dengan “UpdateData.java” berikut source kode-nya:

import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import xxx.HibernateUtil; import xxx.TabelMahasiswa; public class UpdateData { public static void main(String[] args) throws Exception{ SessionFactory sessFact = HibernateUtil.getSessionFactory(); Session sess = sessFact.getCurrentSession(); Transaction tr = sess.beginTransaction(); TabelMahasiswa st = (TabelMahasiswa)sess.load(TabelMahasiswa.class,4); st.setAlamat("Jl. Lodaya No. 125"); tr.commit(); System.out.println("Update Successfully"); sessFact.close(); } }

Untuk source kode UpdateData proses yang terjadi tidak jauh berbeda dengan yang terjadi pada proses CreateData, hal kecil yang membedakan hanya pada baris “TabelMahasiswa st = (TabelMahasiswa)sess.load(TabelMahasiswa.class,4);” yang digunakan untuk mengambil data yang akan diedit ke database dengan entity model “TabelMahasiswa” kemudian lakukan perubahan, setelah itu lakukan commit. Dan yang terakhir adalah proses delete yang disimpan dalam file “DeleteData.java” yang source codenya sebagai berikut:

import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import xxx.HibernateUtil; import xxx.TabelMahasiswa; public class DeleteData { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub SessionFactory sessFact = HibernateUtil.getSessionFactory(); Session sess = sessFact.getCurrentSession(); Transaction tr = sess.beginTransaction(); TabelMahasiswa st = (TabelMahasiswa)sess.load(TabelMahasiswa.class,4); sess.delete(st); System.out.println("Deleted Successfully"); tr.commit(); sessFact.close(); } }

Untuk source kode DeleteData proses yang terjadi tidak jauh berbeda dengan yang terjadi pada proses UpdateData, hal kecil yang membedakan hanya pada baris “sess.delete(st);” yang digunakan untuk mengambil data yang akan dihapus dari database dengan entity model “TabelMahasiswa”, setelah itu lakukan commit.

 

Okeh dech selamat mencoba! Mungkin saat ini hanya sekian ilmu yang bisa dibagi dengan pembaca, silahkan disimak, dipelajari, dishare DAN semoga bermanfaat, jika ada kekurangan atau masukan yang dapat meningkatkan kemampuan jangan sungkan untuk memberikan komentar....

written by : mee

BAB IV.1

Details

Variabel dan Memory Management
Di bagian ini kita akan banyak membahas tipe-tipe data yang bisa berada dalam JVM dan
bagaimana JVM meletakkannya dalam memory. Bagian terakhir akan membahas bagaimana
Garbage Collector bekerja membersihkan JVM dari data yang sudah tidak digunakan lagi.


Variabel
Setelah belajar dasar-dasar bagaimana membuat kode java, kita akan membahas dasar-dasar
bahasa java mulai dari bab ini. Hal pertama yang akan kita pelajari adalah memory
management di java, untuk memahami bagaimana variabel disimpan dalam memory oleh JVM
kita akan belajar tentang stack dan heap. Program java akan berada dalam stack atau heap
selama daur hidupnya, instance variabel dan object selalu berada di heap sedangkan local
variabel berada di dalam stack.
Mari kita lihat kode java di bawah ini, dan bagaimana bagian-bagian itu disimpan dalam heap
atau stack:


public class Person{
private Long id; //instance variable
private String nama; //instance variable
public static void main(String[] args){
Person ifnu; //local variable/reference variabel ifnu
ifnu = new Person(); //object Person diinstansiasi
ifnu.setId(17l);
ifnu.setNama("ifnu bima");
Person klonenganIfnu = ifnu; //local variable yang menunjuk ke object
klonenganIfnu.setNama("klonengan ifnu); // yang sama
}
public void setId(Long aId){ //local variable aId
this.id = aId;
}
public Long getId(){
return this.id;
}
public void setNama(Long aNama){ //local variable aNama
this.nama = aNama;
}
public String getNama(){
return this.nama;
}
}

Local variabel adalah variabel yang berada di dalam method, variabel ini hanya hidup selama
method dieksekusi, begitu program keluar dari method maka variabel ini akan diserahkan ke
garbage collector untuk dibersihkan. Variabel di dalam parameter method adalah salah satu
contoh local variabel. Reference variabel adalah variabel yang menunjuk ke object, seperti ifnu
dan klonenganIfnu, keduanya juga merupakan local variabel karena di diklarasikan di dalam
method main. id dan nama adalah instance variabel, keduanya dideklarasikan di dalam class
Person.
Reference variabel ifnu dan klonenganIfnu menunjuk ke object yang sama, maka ketika
klonenganIfnu mengganti nilai nama maka object yang dipegang oleh variabel ifnu juga akan ikut
terganti namanya. Analoginya misalnya begini, reference variabel itu adalah alamat, sedangkan
object adalah sebuah rumah. Misalnya sebuah rumah mempunyai dua alamat, yang satu alamat
menggunakan nama jalan satu lagi alamat menggunakan PO BOX. Kita bayangkan misalnya pak
pos mengirim barang ke alamat PO BOX ataupun alamat jalan, maka barang akan sampai ke
rumah yang sama. Begitu juga dengan instance variable ifnu dan klonganenganIfnu, jika satu
dirubah maka yang lain ikut berubah karena keduanya menunjuk ke alamat object yang sama.
Konsep reference ini penting untuk selalu diingat ketika bekerja dengan object, banyak sekali
masalah yang bisa dipecahkan hanya dengan menggunakan pemahaman tentang yang baik
tentang reference ini.
Berikut ini adalah gambar yang memvisualisasikan keadaan heap setelah kode di atas selesai
dieksekusi :

Setelah mengetahui bagaimana reference variabel bekerja, kita akan membahas bagaimana
perilaku reference variabel ini jika digunakan sebagai parameter dalam method.

Passing by value dan Passing by reference
Method dalam java bisa mempunyai parameter, setiap parameter pada dasarnya adalah local
variabel, tipe dari variabel itu bisa berupa reference (object) atau bisa juga berupa tipe data
bawaan dari java. Kedua jenis variabel ini akan diperlakukan berbeda oleh java, jika kita
menggunakan tipe variabel dengan tipe data bawaan java maka yang terjadi adalah passing by
value, artinya data yang dilempar dari kode pemanggil ke dalam method, yang dibawa adalah
nilai dari variabelnya, jika nilai variabel di dalam method berubah maka nilai variabel di
pemanggil tidak ikut berubah. Mari kita lihat contoh kodenya :

public class PassByValue{
public static void ubahNama(String nama){
nama = "dian";
System.out.println("nama baru di dalam method: " + nama);
}
public static void main(String[] arg){
String nama = "ifnu";
System.out.println("nama lama dari method main: " + nama);
ubahNama(nama);
System.out.println("nama lama dari method main: " + nama);
}
}


Terdapat variabel nama di dalam method main yang dilempar ke method ubahNama, karena
tipe datanya String (tipe data bawaan dari java), maka ketika variabel nama diubah di dalam
method ubahNama maka tidak akan mempengaruhi nilai variabel nama di dalam method main.
Kalau kita compile dan jalankan kodenya akan keluar output seperti di bawah ini :

$ javac PassByValue.java
$ java PassByValue
nama lama dari method main: ifnu
nama baru di dalam method: dian
nama lama dari method main: ifnu

Variabel dengan tipe reference seperti : object atau tipe data array, jika digunakan sebagai
parameter dalam method maka akan terjadi prosess passing by reference. Artinya data yang
dilempar dari kode pemanggil ke dalam method, yang dibawa adalah reference (alamat) dari variabel di dalam method berubah maka nilai variabel di pemanggil juga ikut
berubah. Mari kita modifkasi sedikit kode di atas dengan mengganti tipe data nama dari String
menjadi array String.

public class PassByReference{
public static void ubahNama(String[] nama){
nama[0] = "dian";
System.out.println("nama baru di dalam method: " + nama[0]);
}
public static void main(String[] arg){
String[] nama = new String[1];
nama[0] = "ifnu";
System.out.println("nilai lama dari method main: " + nama[0]);
ubahNama(nama);
System.out.println("nilai lama dari method main: " + nama[0]);
}
}

Setelah kita ganti variabel nama dari tipe data String menjadi String[], maka method ubahNama
akan menggunakan pass by reference, sehingga kalau nilai di dalam variabel nama diubah
didalam method ubahNama maka variabel yang sama di dalam method main juga ikut berubah.
Eksekusi kode di atas akan menghasilkan output seperti di bawah ini :

$ javac PassByReference.java
$ java PassByReference

nilai lama dari method main: ifnu
nama baru di dalam method: dian
nilai lama dari method main: dian
$

Kita sudah membahas apa itu pass by value dan apa itu pass by reference, di dalam penjelasan di
atas disebutkan tentang “tipe data bawaan java”, nah tipe data jenis ini ada dua, tipe data primitif
dan wrapper class. Kita akan bahas kedua jenis tipe data ini di bagian selanjutnya.

BAB III.2

Details

Classpath
Classpath adalah cara  java untuk menemukan di  mana  fle  jar  yang berisi   library class yang
digunakan dalam aplikasi.  Kalau class yang digunakan tidak ditemukan dalam classpath,  maka
java akan mengeluarkan ClassNotFoundException. Kesalahan ini sering kali terjadi dan kita bisa
langsung menyimpulkan bahwa class yang diperlukan tidak berada dalam classpath.
Newbie   sering  kebingungan   dengan   error   ini,  maka   saya  merasa   perlu   untuk  menerangkan konsep classpath dengan  sedikit  panjang  lebar  agar   tidak  terjadi  kebingungan.  Newbie yang belajar  membuat   aplikasi  dari   awal  menggunakan  IDE  seperti  NetBeans   sering kebingungan ketika akan menginstall aplikasi, biasanya pertanyaan yang muncul adalah bagaimana membuat versi  exe dari  aplikasi   java yang sudah dibuat.??

Saya bisa menjamin bahwa membuat  exe dari program   java   yang   sudah   dibuat   adalah tindakan   sia   sia,   pertama   karena   malah   akan menghilangkan   feature  utama   java   :   run   anywhere,   ingat   exe   tidak   bisa   jalan   di  OS  selain windows.

Kedua karena convert java ke exe tidak gampang, perlu tools yang mahal harganya dan tidak ada jaminan bahwa hasil convert ke exe akan bisa jalan mulus seperti aslinya.


Nah kalau tidak diconvert ke dalam exe bagaimana cara membuat launcher agar user tinggal klik dua kali dan aplikasi jalan? Jawabanya adalah dengan membuat fle bat di windows atau fle sh di selain  windows.  Di   dalam  fle   bat   /   sh   tersebut   terdapat   command   line   untuk  menjalankan aplikasinya. Untuk membuatnya diperlukan sedikit pengetahuan tentang classpath ini.
Di  bagian sebelumnya kita sudah belajar membuat sebuah fle jar yang berisi  dua buah class : 
Person dan PersonDao, nah kita sekarang akan membuat sebuah class lagi yang akan mengimport 
class Person dan mempunyai main method agar bisa dijalankan. Namakan saja classnya adalah
ClasspathExercise, kemudian simpan class ini di folder yang berbeda dengan folder sebelumnya.
Misalnya folder sebelumnya ada di c:\sample-code, buat lagi sebuah folder kosong di c:\sample-
code-classpath.


import com.googlecode.projecttemplate.hmti.model.Person;
public class  ClasspathExercise{
  public void main(String[] args){
    Person p = new Person();
    p.setName("ini nama person");
    System.out.println(p.getName());
  }
}


Compile class di atas menggunakan javac


$ javac  ClasspathExercise.java


kalau   class   di   atas   dijalankan   seperti   di   bawah   ini   tanpa   classpath   maka   akan   keluar


ClassNotFoundException :
$ java ClasspathExercise
Exception in thread "main" java.lang.NoClassDefFoundError:
com/googlecode/projecttemplate/hmti/model/Person
        at ClasspathExercise.main(ClasspathExercise.java:4)
Caused by: java.lang.ClassNotFoundException:
com.googlecode.projecttemplate.hmti.model.Person
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 1 more


Classpath seperti yang sudah kita bahas di atas, digunakan untuk memberitahu java di mana
bisa menemukan class-class yang dibutuhkan.  Nah kalau cara menjalankan kodenya diganti 
dengan seperti di bawah ini :


$ java -cp c:\sample-code\hmti.jar;. ClasspathExercise
ini nama person
$


Perhatikan command  line di  atas,  terdapat argumen  -cp yang menandakan bahwa kita akan
mendefnisikan daftar classpath. File jar dan folder bisa dimasukkan sebagai daftar classpath, 
seperti contoh di atas kita mendaftarkan fle jar c:\sample-code\hmti.jar dan folder yang sedang
aktif,  diwakili dengan tanda titik (.).
Kalau anda bekerja di linux / unix terdapat perbedaan di tanda pemisah antar classpath, kalau
windows menggunakan titik koma(;), OS selainya menggunakan titik dua(:) seperti di bawah ini


$ java -cp /Users/ifnu/sample-code/pos.jar:. ClasspathExercise
ini nama person
$


Kita  juga bisa menggunakan relative path supaya tidak terjadi  error kalau  flenya dipindah-
pindah ke folder lain :


$ java -cp ../sample-code/hmti.jar:. ClasspathExercise
ini nama person
$


Nah   kembali   lagi   ke  masalah   fle   bat   /   sh  yang   sudah  kita   bahas   sebelumnya.  Kita   bisa meletakkan perintah di atas ke dalam fle ini dan mengeksekusi kedua fle tersebut layaknya
executable fle.
Setelah java 6 terdapat feature wildcard di classpath, dimana kita bisa menginclude semua fle
jar yang ada dalam sebuah folder. Sebelum feature ini ada, kita harus mendaftarkan semua fle
jar satu per satu ke dalam classpath. Perintah di atas bisa sedikit diubah menjadi seperti  di
bawah ini :


$ java -cp ../sample-code/*.jar:. ClasspathExercise
ini nama person
$


Sampai   di   sini   kita   sudah   belajar   hal-hal   dasar   tentang   class,   package,   import,   jar   dan classpath. Berikutnya kita akan belajar lebih banyak tentang bahasa java dan OOP.


sumber : ifnu bima

BAB II.2

Details

Class vs Object
Object  adalah  instansiasi  dari   sebuah Class.  Kalau kita analogikan,  class   itu  sebuah cetakan
sedangkan   object   itu   adalah   barang   dari   hasil   cetakan.   Class   juga   bisa   dikatakan   sebagai  kategori, sedangkan object adalah sesuatu yang memenuhi syarat-syarat yang harus dipenihi agar  masuk dalam kategori   tersebut.   Jadi  bisa dibilang  satu  class  bisa mempunyai  banyak object, setiap object mempunyai sifat yang sama persis seperti yang didefnisikan dalam class tersebut.
Kita ambil contoh adalah class Person, kemudian kita buat sebuah instance dari class Person yaitu
ifnu. Kalimat di atas kalau diwujudkan dalam kode menjadi seperti di bawah ini :
Person ifnu = new Person();
Dua kata paling kiri  adalah proses  deklarasi  sebuah object  dengan  tipe Person,  kemudian di
sebelah   kanan   tanda   sama   dengan   (=)   terjadi   proses   instansiasi   object   dari   class   Person  menggunakan keyword new.  Setiap kali  kita bertemu keyword new artinya hanya satu,  yaitu  instansiasi object dari sebuah class. Keyword new secara detail dalam level yang paling bawah,   menyebabkan JVM akan membuat object di dalam memory.


Method
Method adalah sekumpulan kode yang diberi nama, untuk merujuk ke sekumpulan kode tersebut 
digunakan   sebuah  nama   yang   disebut   dengan  nama  method.  Method mempunyai parameter  sebagai   input  dan nilai  kembalian  sebagai  output.  Kita bisa  juga membayangkan method  itu  adalah sebuah mesin, ada input yang dibutuhkan dan output yang dihasilkan.
Deklarasai  method  terdiri  dari  beberapa bagian,  bagian pertama adalah access  modifer  dari
method, apakah public, private, protected atau default. Bagian berikutnya adalah tipe kembalian
dari  method,  kalau method tidak mengembalikan apa-apa maka keyword void yang digunakan. 
Bagian ketiga adalah nama method,  sesuai  dengan aturan  java code convention,  nama method
diawali dengan huruf kecil dan setiap kata setelahnya diawali dengan huruf besar (camel case).
Setelah nama method ada parameter.  Sebuah method bisa  juga  tidak mempunyai  parameter, 
punya satu, dua dan seterusnya. Setelah java 5 ada feature yang disebut dengan varargs, feature
ini  memungkinkan method untuk mempunyai   jumlah parameter yang bervariasi.  Varargs akan
kita bahas di bab tentang Java 5 Language enhancement, jadi tidak akan dibahas dalam bab ini.
Bagian   terakhir   dari   method   adalah   deklarasi   throws   exception,   dimana   kita   bisa
mendeklarasikan tipe exception yang akan dithrows oleh method.  Bab  tentang exception akan
membahas lebih lanjut tentang throws exception.
Nama method dan parameter adalah pembeda antara satu method dengan method yang lainya. 
Kalau dua method namanya beda ya pasti dianggap dua buah method berbeda. Kalau dua method
namanya sama dianggap sebagai  method yang berbeda kalau parameternya berbeda,  method
dengan nama sama dan parameter berbeda ini disebut dengan overloading dalam konsep OOP.
Kalau method mempunyai  nama yang sama dan parameter yang sama  tetapi   tipe return atau
throws exceptionya berbeda maka akan menyebabkan error  pada waktu kompilasi.   Jadi  kalau
mendefnisikan method baru,  pastikan bahwa namanya  tidak  sama  dengan method  lain  atau
setidaknya parameternya berbeda baik dari sisi jumlahnya, tipe parameter atau posisi parameter.
Dari penjelasan di atas, struktur method seperti di bawah ini adalah benar:


public void main(String[] args){ }
public String methodReturnString(){ return "ini string"; }
private void methodBerparameter(String parameter1, Integer parameter2) {}
public void methodThrowsException() throws IOException {}
protected String protectedMethod(Sting parameter1, Integer parameter2)
  throws IOException { return "ini string"; }
public void methodBerbeda() {}
public void methodBerbeda(String parameter1) {}
public void methodBerbeda(String parameter1, Integer parameter2) {}
public void methodBerbeda(Integer parameter1, String parameter2) {}                              public void methodBerbeda(Double parameter1, Double parameter2) {}


Ada beberapa keyword yang bisa ditambahkan dalam deklarasi method. Keyword yang paling
sering digunakan adalah static.  Bagian kode Java yang dideklarasikan dengan menggunakan
static akan menjadi  anggota dari  class,  bukan anggota dari  object,  silahkan kembali  ke bab
berikutnya kalau masih belum bisa membedakan mana class dan mana object.
Karena  method   yang   ditandai   dengan   static   adalah   bagian   dari   class,  maka   bisa   diakses langsung dari nama Class itu sendiri, tidak perlu membuat object. Method static hanya bisa
memanggil  method  lain dalam satu class yang juga ditandai  static.  Method main yang biasa
kita gunakan untuk menjalankan aplikasi java juga ditandai dengan static, misalnya kita akan
memanggil method lain dari method static, maka method lainya ini juga harus ditandai dengan
static. Kita lihat contoh berikutnya :


public class StaticTest {
  public static void main(String[] args) {
     //static method memanggil static method lain dalam class yang sama
     contohMethodStatic();
     //method static juga bisa dipanggil dari nama classnya
     StaticTest.contohMethodStatic();
  }
  public static void contohMethodStatic() {
    System.out.println("method static dipanggil");
  }
}
Kalau kode di atas dicompile, kemudian dijalankan maka hasilnya seperti di bawah ini :
$ javac StaticTest.java
$ java StaticTest
method static dipanggil
method static dipanggil
$
terlihat bahwa method  contoh Method Static dipanggil dua kali, baik menggunakan nama class
maupun tidak.
Keyword lain yang bisa digunakan oleh method adalah final, synchronize dan native.  Keyword
final akan menyebabkan method tidak bisa dioverride, kita bahas topik ini di bab OOP. Keyword
synchronize akan menyebabkan hanya satu thread yang bisa mengeksekusi method ini dalam
satu waktu,  kalau ada thread  lain maka harus mengantri  sampai  thread sebelumnya selesai 
menjalankan   method   tersebut.   Keyword   native   menandai   implementasi   method   akan
diletakkan dalam kode native, misalnya ditulis menggunakan C/C++, kemudian menggunakan
Java Native Interface (JNI) untuk mengakses implementasi method tersebut. Topik mengenai 
JNI dan native tidak kita bahas di dalam tutorial ini dan diserahkan kepada anda, pembaca tutorial
ini, untuk mempelajari topik advace ini dari sumber lain.


Constructor
Constructor adalah method yang spesial, karena mempunyai aturan-aturan sebagai berikut:
• mempunyai nama yang sama persis dengan nama class
• tidak mempunyai tipe return
• digunakan untuk menginstansiasi object
• hanya mempunyai access modifer, tidak ada keyword lain yang diletakkan sebelum nama
method pada deklarasi constructor.
Seperti   halnya   method   pada   umumnya,   constructor   bisa   mempunyai   parameter   serta
melempar (throws) exception.  Constructor yang tidak mempunyai  parameter disebut dengan
default  constructor.  Setiap class pasti  mempunyai  setidaknya satu constructor,  kalau dalam
deklarasi class tidak ada constructor sama sekali, Java secara default akan mempunyai default
constructor ini. Kalau ada satu saja constructor dengan parameter, maka default constructor
tidak akan dibuat, kalau masih mau ada default constructor maka harus dideklarasikan secara eksplisit. Mari kita lihat contoh kodenya :


public ConstructorTest {
  public void methodSederhana(){
    System.out.println("method sederhana dipanggil");
  }
  public static void main(String[] args){
    ConstructorTest test = new  ConstructorTest();
    test.methodSederhana();
  }
}


Kode di atas memperlihatkan bahwa class ConstructorTest tidak mendefnisikan constructor sama
sekali,   tetapi  constructor  new   ConstructorTest()  dapat  dipanggil   tanpa menyebabkan adanya error.  Hal   ini  disebabkan karena  Java akan membuatkan default  constructor kalau class  tidak mendefnisikan  cosnstructor sama sekali.


public class ConstructorNonDefaultTest {
  public ConstructorNonDefaultTest(String text) {
    methodSederhana(text);
  }
  public void methodSederhana(String text){
    System.out.println("method sederhana dipanggil dengan text : " + text);
  }
  public static void main(String[] args){
    //error pada waktu compile karena ada constructor yang dideklarasikan
    //sehingga default constructor menjadi wajib dideklarasikan
    ConstructorNonDefaultTest test = new  ConstructorNonDefaultTest();
   
    //constructor non default dengan satu parameter bertipe string
    ConstructorNonDefaultTest test1 =
      new  ConstructorNonDefaultTest("ini test");
  }
}


kalau kode di atas coba dicompile maka terdapat satu buah error seperti di bawah ini :


$ javac ConstructorNonDefaultTest.java
ConstructorNonDefaultTest.java:11: cannot find symbol
symbol  : constructor ConstructorNonDefaultTest()
location: class ConstructorNonDefaultTest
    ConstructorNonDefaultTest test = new  ConstructorNonDefaultTest();
                                     ^
1 error
$


Constructor  dapat  memanggil  constructor  lain dalam class yang sama menggunakan keyword
this. Kode untuk memanggil constructor lain ini  harus berada di baris pertama dari constructor,
kalau tidak maka akan ada error pada waktu kompilasi. Berikut ini contohnya :
public class ConstructorCallConstructorTest {
  public ConstructorCallConstructor(){
    this("constructor memanggil constructor");
    //kode lain di sini, tidak bisa diletakkan di atas keyword this
  }
  public ConstructorCallConstructor(String text) {
    methodSederhana(text);
  }
  public void methodSederhana(String text){
    System.out.println("method sederhana dipanggil dengan text : " + text);
  }
  public static void main(String[] args){    ConstructorCallConstructorTest test = new  ConstructorCallConstructorTest();
   
    ConstructorCallConstructorTest test =
      new  ConstructorCallConstructorTest torTest("ini test");
  }
}


Constructor  mana  yang dipanggil  pada waktu menggunakan keyword  this  ditentukan dari 
parameternya.


Property
Property adalah variabel yang dideklarasikan di dalam class sejajar dengan method. Variabel 
yang berada di dalam method bukan merupakan property, tetapi disebut sebagai local variabel. 
Layaknya variabel  yang  lain,  property mempunyai   tipe data dan nama.  Berdasarkan aturan
java bean,  property akan dibuatkan method getter dan setter untuk membungkus property. 
Secara umum, disarankan untuk memberikan access modifer private kepada semua property,
kalau ingin mengakses property tersebut maka buatlah method getter dan setter.
Deklarasi  property diawali  dengan access  modifer  kemudian diikuti  dengan  tipe data dan
akhirnya adalah nama dari property. Property bisa langsung diinisialisasi nilainya atau tidak, 
kalau   tidak   diberi   nilai,  maka   nilai   default   yang   akan   diset   sebagai   nilai   awal   property. 
Contohnya seperti di bawah ini :
private String stringProperty;
Beberapa keyword lain juga bisa digunakan untuk mendeklarasikan property. Keyword static
bisa digunakan untuk mendeklarasikan property, static akan membuat property menjadi milik
class bukan milik object. Property static bisa diakses dari nama classnya dan tidak perlu ada
object  yang diinstansiasi.  Karena property static menjadi  milik class,  maka kalau property
static ini diganti isinya maka semua kode yang mengakses property static ini akan melihat nilai 
yang sama. Contohnya seperti di bawah ini :


public class PropertyStaticTest {
  public static String nilaiStatic;
  public static void main(String[] args) {
    //property static dipanggil menggunakan nama class
    PropertyStaticTest.nilaiStatic =  "nilai dari main";
    //property static juga bisa dipanggil tanpa nama class dari class yang sama
    System.out.println(nilaiStatic);
    //method main adalah method static, hanya bisa memanggil method static juga
    methodUbahPropertyStatic();
    //nilai property static berubah setelah method  methodUbahPropertyStatic
    //dipanggil
    System.out.println(nilaiStatic);
  }
  public static void methodUbahPropertyStatic() {
      PropertyStaticTest.nilaiStatic = "nilai dari methodUbahPropertyStatic";
  }
}
Kalau class di atas dicompile dan dijalankan, hasilnya adalah seperti di bawah ini :
$ javac PropertyStaticTest.java
$ java PropertyStaticTest
nilai dari main
nilai dari methodUbahPropertyStatic
$


variabel   static   bisa  sangat   berguna untuk memudahkan mengakses   suatu  variabel   karena
tinggal menggunakan nama class saja, jadi tidak perlu membawa-bawa nilai variabel ke dalam
object   yang   memerlukanya.   Tetapi   pada   skenario   berbeda   property   static   ini   malah
merepotkan,   terutama di   lingkungan aplikasi  web yang berjalan dalam cluster.  Antara satu
cluster   satu dan  cluster   yang  lain nilai   static   ini  bisa berbeda dan menyebabkan  aplikasi  menjadi tidak konsisten. Karena dalam buku ini kita tidak bekerja dalam lingkungan cluster, kita
bisa menganggap property static sebagai praktek yang aman. Nantinya di dalam aplikasi contoh, 
kita akan cukup banyak menggunakan property static untuk menyederhanakan kode.
Keyword berikutnya yang bisa diletakkan dalam property static adalah fnal. Adanya keyword fnal 
dalam deklarasi property menyebabkan property hanya bisa diinisialisasi (diberi nilai) sekali saja,
setelah  itu nilainya  tidak bisa dirubah,  perilaku  ini  biasa kita sebut  dengan konstanta:  sekali 
diberi nilai tidak bisa berubah nilainya. Kalau kita memaksa merubah nilainya maka akan terjadi
error pada waktu kompilasi  atau kalau java compiler tidak sanggup menentukan errornya akan
terjadi pada waktu aplikasi berjalan.
Contohnya   kita   akan   merubah   property   nilaiStatic   di   contoh   kode   sebelumnya   dengan  menambahkan keyword fnal, seperti di bawah ini :


public class PropertyStaticFinalTest {
  public static final String nilaiStatic;
  public static void main(String[] args) {
    PropertyStaticFinalTest.nilaiStatic =  "nilai dari main";
    System.out.println(nilaiStatic);
    methodUbahPropertyStatic();
    System.out.println(nilaiStatic);
  }
  public static void methodUbahPropertyStatic() {
    PropertyStaticFinalTest.nilaiStatic =
      "nilai dari methodUbahPropertyStatic";
  }
}


Ketika kode dikompilasi maka akan terjadi error yang menerangkan bahwa “tidak bisa mengubah
nilai variabel yang ditandai dengan fnal”. Outputnya seperti di bawah ini :

$ javac PropertyStaticFinalTest.java
PropertyStaticFinalTest.java:4: cannot assign a value to final variable nilaiStatic
    PropertyStaticFinalTest.nilaiStatic =  "nilai dari main";
                           ^
PropertyStaticFinalTest.java:10: cannot assign a value to final variable
nilaiStatic
    PropertyStaticFinalTest.nilaiStatic =
                           ^
2 errors
$


Jadi   kalau   begitu   kapan   property   yang   ditandai   dengan   fnal   bisa   diberi   nilai?   Pada  waktu mendeklarasikan property. Contoh di bawah ini adalah cara yang benar menginisialisasi nilai ke property yang ditandai dengan final :


public class PropertyFinalTest {
  public final String nilaiFinal="inisialisasi";
  public static void main(String[] args) {
   PropertyFinalTest finalTest = new PropertyFinalTest();
   System.out.println(finalTest.nilaiFinal);
  }
}


Perhatikan kode di atas, property nilai Final   langsung diberi  nilai  pada waktu deklarasi.  Karena
sekarang property nilaiFinal kita harus membuat object dari  class   PropertyFinalTest agar bisa
mengakses property nilaiFinal,  berbeda dengan property yang ditandai  static dimana kita bisa
langsung mengaksesnya tanpa membuat object.
Masih ada keyword lain yang bisa kita letakkan dalam deklarasi property, yaitu volatile. Keyword
ini  menyebabkan property  tidak akan  ikut  disimpan ketika object  diserialize.  Proses   serialize
adalah proses mengubah object ke dalam bentuk yang bisa ditransfer lewat media I/O, misalnya
object  ini disimpan ke hardisk atau dikirim ke komputer  lain  lewat  jaringan.  Proses sebaliknya
adalah deserialize dimana dari bentuk ini diubah lagi menjadi bentuk object di dalam JVM. Topik serialize dan deserialize akan sedikit kita bahas nanti pada waktu membahas arsitektur three
tier. 


Konstanta
Java mempunyai keyword const yang bisa digunakan untuk mendeklarasikan konstanta. Tetapi 
dalam prakteknya,  dan ini adalah praktek yang disarankan oleh Sun Microsystem,  konstanta
sebaiknya dideklarasikan menggunakan gabungan keyword static dan  fnal.  Lebih baik  lagi, 
kalau konstanta diletakkan di dalam interface, karena semua property dalam interface secara
default   akan   bersifat   public   static   fnal,   walaupun   dideklarasikan   tanpa   ketiga   keyword tersebut.
Konstanta dalam  java  juga mempunyai  aturan penamaan yang diterangkan dalam Java Code
Convention.  Nama konstanta semuanya huruf  besar  dan dipisahkan dengan underscore  (_)
kalau terdiri dari dua kata atau lebih. Contoh pembuatan konstanta yang baik adalah seperti 
berikut ini :


public interface Constants{
  Integer MAX_USER =  10;
  String APPLICATION_NAME = "POS";
  Stiring LAKI_LAKI = "L";
  String PEREMPUAN = "P";
}


Perhatikan kode di atas menggunakan interface, bukan class. Kemudian semua property tidak
perlu dideklarasikan sebagai  public static fnal  karena secara default semua property dalam
interface sudah mempunyai ketiga keyword tersebut. Kalau kita deklarasikan Constants di atas
sebagai class maka ketiga keyword tersebut harus disertakan agar property dianggap sebagai 
konstanta. 


public class Constants{
  public static final Integer MAX_USER =  10;
  public static final String APPLICATION_NAME = "POS";
  public static final Stiring LAKI_LAKI = "L";
  public static final String PEREMPUAN = "P";
}


Sampai  di  sini  kita sudah belajar tentang perbedaan class dan object,  kemudian bagaimana
anatomi   dari   class   java.   Berikutnya   kita   akan   belajar   mengenai   struktur   aplikasi   java,  bagaimana kode diorganisasi dalam package, kemudian bagaimana mengimport class lain yang
berada dalam package yang berbeda. Kemudian kita juga membahas apa itu jar (java archive)
dan bagaimana membuatnya,   sekaligus  belajar  bagaimana  konsep classpath bekerja untuk
menemukan class yang dibutuhkan aplikasi.

sumber : ifnu bima

BAB III.1

Details

Struktur Aplikasi Java
Dalam bab ini  kita akan mempelajari  struktur aplikasi  java,  di dalam aplikasi   java kita akan
menggunakan package untuk mengorganisasi class-class dalam package agar rapi dan dipisah-
pisahkan   berdasarkan   fungsinya.   Import   digunakan   untuk  mengimport   class   yang   berada dalam package yang berbeda. Class-class dalam modul yang sama biasanya diletakkan dalam
satu jar agar mudah didistribusikan, class-class dalam jar ini biasa juga disebut sebagai library. 
Kalau aplikasi  memerlukan class dari   jar  lain,  kita harus meletakkan  jar  tersebut  di  dalam
classpath agar bisa ditemukan oleh JVM.
Semua konsep package,   import,   jar  dan classpath sangat  penting untuk mengatur  struktur
aplikasi   Java.   Dengan   pengaturan   yang   rapi   aplikasi   bisa   mudah   dipelihara   dan   tidak
memerlukan waktu yang  lama untuk mempelajari  kodenya.  Kita akan bahas   satu per   satu
konsep-konsep tersebut di bab berikutnya.


Package
Pakcage   dalam  java   adalah   sebuah  mekanisme   untuk  mengorganisasi   penamaan   class   ke dalam modul-modul.  Class yang mempunyai fungsionalitas serupa dan kemiripan cukup tinggi 
biasanya diletakkan dalam satu package yang sama. Kalau ingin menggunakan class lain yang berada   dalam  package   yang  berbeda  harus   diimport   terlebih   dahulu  menggunakan   keyword import.  Class-class dalam package agar mudah didistribusikan biasanya diletakkan dalam satu buah jar yang pada dasarnya adalah sebuah fle zip saja.
Paragraf  di  atas  menerangkan hubungan antara package,   import  dan  jar dalam aplikasi   java. 
Selanjutnya kita akan belajar bagaimana membuat package dan mengimport class dari package
lain, kemudian membuat fle jar dari class yang sudah dicompile.
Selain   bertujuan   untuk  mengorganisasi   class,   package   juga   digunakan   untuk  menghindari  penamaan class yang bisa bertubrukan dalam aplikasi   Java.  Kalau kita membuat  sebuah class dengan nama yang sangat umum, misalnya class User,  kemungkinan besar developer lain akan membuat class dengan nama yang sama, nah bagaimana kalau kita menggunakan  library yang didalamnya terdapat nama class yang sama dengan class yang kita buat? class manakah yang
akan dipilih oleh Java? masalah penamaan ini dipecahkan dengan menggunakan package.
Package  dimana  sebuah class  berada  akan menjadi  bagian dari  nama  lengkap  sebuah class,
misalnya class String sebenarnya nama  lengkapnya adalah  java.lang.String karena class String
berada dalam package lang.util. Untuk menghindari penamaan class yang sama, setiap developer
disarankan untuk menggunakan package yang unique untuk aplikasi  yang digunakan.  Misalnya
ada 2 buah class dengan nama ClassA, yang satu berada di dalam package a.b.c sehingga nama
lengkapnya adalah a.b.c.ClassA sendangkan satu  lagi  berada di  dalam package d.e.f  sehingga
nama classnya adalah d.e.f.ClassA.
Bagaimana menjamin nama package yang unique? gunakan nama domain website institusi anda, 
maka anda akan mendapatkan nama package yang unique. Ada sebuah aturan tidak tertulis dari 
Sun untuk menggunakan nama domain  institusi  yang dibalik untuk digunakan sebagai  package
diikuti dengan nama aplikasi.
Misalnya   kita   bekerja   untuk   perusahaan   PT   coding   sejahtera   yang   mempunyai   website codings.com,  kemudian kita membuat aplikasi  keuangan yang disingkat dengan AKCS (aplikasi  keuangan   coding   sejahtera)   maka   kita   akan   membuat   package   dengan   com.codings.akcs. 
Bagaimana   kalau  kita  membuat   aplikasi   opensource?   gunakan  nama   domain   dimana   project tersebut  dihosting.  Misalnya untuk class-class yang digunakan di  tutorial  ini  akan menggunakan package com.googlecode.projecttemplate.hmti,  hal   ini  karena kode dalam turorial ini  dihosting di project-template.googlecode.com dan nama aplikasinya adalah hmti (himpunan mahasiswa tekhnik informatika).
Package pada dasarnya adalah struktur folder untuk meletakkan kode fle java, tetapi tidak bisa
sembarangan menyusun struktur folder ini, hal ini dimaksudkan agar kode lebih rapi, teratur dan
tidak bercampur campur.
Untuk membuat package kita akan menggunakan contoh kode class Person di  atas,  tetapi  kita
letakkan di  dalam package   com.googlecode.projecttemplate.pos.model.  Langkah pertama kita
buat struktur folder  com\googlecode\projecttemplate\hmti\model :


$ mkdir com
$ mkdir com/googlecode
$ mkdir com/googlecode/projecttemplate
$ mkdir com/googlecode/projecttemplate/hmti
$ mkdir com/googlecode/projecttemplate/hmti/model


Setelah itu buat fle Person.java dengan kode di bawah ini
package com.googlecode.projecttemplate.hmti.model;


public class Person{
  private Long id;
  private String nama;
  public String getNama(){
    return nama;
  }
  public void setNama(String nm){
    nama = nm;
  }
  public Long getId(){
    return id;
  }  public void setId(Long i){
    id = i;
  }
}


Perbedaan class Person di atas dengan class Person di contoh sebelumnya berada pada baris
pertama dimana ada keyword package untuk mendeklarasikan di pacakge apa class Person ini 
berada. Cara mengcompile class yang berada dalam package di atas seperti di bawah ini :


$ javac com/googlecode/projecttemplate/hmti/model/Person.java


Setelah   mengenal   package,   kita   akan   belajar   bagaimana   menggunakan   import   untuk
mendeklarasikan class-class yang berada di dalam package yang berbeda.


Import
Import digunakan untuk menyederhanakan penulisan class.  Tanpa menggunakan import kita
harus menuliskan nama lengkap class besarta packagenya. Dengan menggunakan import, kita
deklarasikan di mana class yang digunakan tersebut berada sehingga selanjutnya tidak perlu
lagi menuliskan nama package dari sebuah class.
Ada dua pengecualian di mana import tidak diperlukan, pertama untuk class-class yang berada
dalam package yang sama dan kedua adalah class-class yang berada dalam package java.lang. 
Kita akan membuat interface yaitu PersonDao yang di dalamnya ada class Person, nah kedua
class  ini  akan berada dalam package yang berbeda sehingga di  dalam  interface PersonDao
harus mengimport class Person.
Pertama kita buat dulu struktur folder untuk PersonDao :


$ mkdir com/googlecode/projecttemplate/hmti/dao


Setelah itu buat interface PersonDao dengan menyertakan package dan import
package com.googlecode.projecttemplate.hmti.dao;


import com.googlecode.projecttemplate.hmti.model.Person;
public interface PersonDao{
  void save(Person p);
  void delete(Person p);
  Person getById(Long id);
}


Kalau menulis kode dengan menggunakan text editor biasa rasanya cukup repot menangani
import ini, misalnya ada 20 class yang digunakan dalam satu class, maka harus ada 20 baris
import untuk setiap class.  Untuk sedikit  memudahkan proses  import   ini  bisa menggunakan
wildcard   (*),   jadi   kita   bisa   import   sekaligus   semua   class   dalam   satu   package   dengan menggunakan wildcard ini. Contohnya di bawah ini :
import com.googlecode.projecttemplate.hmti.model.*;
Import di  atas akan menyertakan semua class di  dalam package model,  tetapi  kelemahanya
adalah   proses   pencarian   class   di   dalam  package  menjadi   sedikit   lebih   lama   pada  waktu eksekusi  program,  kalau  tidak  terpaksa  sebaiknya  import  menggunakan wildard dihindari.
Nantinya kalau sudah menggunakan IDE seperti NetBeans proses  import  ini  menjadi sangat 
gampang karena dibantu oleh feature dari NetBeans tidak perlu lagi menggunakan wildcard.


Jar
Sampai di sini kita sudah tahu bagaimana class, package dan import bekerja. Nah kalau class-
nya sudah banyak, kita bisa mengumpulkanya menjadi satu agar mudah untuk didistribusikan. 
Kumpulan   class   yang  disimpan  dalam  satu  fle  disebut   jar   (Java  Archive).   Jar   sebenarnya hanyalah  fle  zip  semata,  kalau punya aplikasi   yang bisa membuka  fle  zip kita  juga bisa membuka fle jar. Kalau di windows bisa klik kanan fle jar kemudian open with winzip, isi dari 
fle jar bisa dilihat dengan gampang.
Jar   bisa   dibuat   dengan  menggunakan   command   line   tools   dari   JDK  yaitu   jar.  Di   bagian sebelumnya kita sudah membuat dua class yaitu Person dan PersonDao, kedua class ini akan diletakkan di dalam fle jar dengan nama hmti.jar, caranya sangat gampang, gunakan tools jar dari JDK seperti di bawah ini :


$ jar cvf pos.jar .


Di  dalam  fle  jar terdapat meta data untuk menerangkan  isi  dari   fle  jar tersebut yang disebut 
sebagai  manifest.  File  manifest.mf   berisi   keterangan  tentang  jar,  misalnya   kapan   dibuatnya,  dibuat oleh siapa, apa nama main classnya dan seterusnya. File manifest.mf harus diletakkan di dalam folder META-INF. Jar yang dibuat oleh tool jar dari JDK akan dibuatkan fle manifest default yang berisi keterangan sederhana.
Setelah mengerti konsep dari jar, berikutnya kita belajar tentang classpath. Classpath digunakan
untuk mendefnisikan di mana saja java bisa menemukan class yang diperlukan oleh aplikasi.

sumber : ifnu bima

BAB II.1

Details

Anatomi Class Java
Bab ini akan menjelaskan tentang anatomi class Java. Pertama kita akan belajar tentang
bagaimana mendeklarasikan class dan interface, kemudian kita akan belajar tentang class
member. Method, constructor dan variabel adalah tiga buah class member, dan ketiganya juga
akan kita bahas dalam bagian terpisah. Memahami bagaimana mendeklarasikan class dan class
membernya adalah pengetahuan paling dasar dalam membuat aplikasi java.
Perhatikan baik-baik aturan apa saja yang diperbolehkan dan dilarang dalam membuat class Java.
Aturan ini cukup banyak dan mengikat, awalnya akan sedikit terasa merepotkan dan
membutuhkan waktu untuk menghafal aturan-aturan tersebut. Setelah beberapa lama, aturan itu
menjadi mudah dipahami dan dihafal. Tidak ada yang lebih baik dibanding belajar dari praktek,
oleh karena itu kita akan praktek menulis kode. Jangan dilewati sesi menulis kode, usahakan tulis
semua kode yang ada dalam bab ini, compile dan jalankan kodenya. Dengan begitu anda akan
lebih cepat menghafal aturan dalam bahasa Java. Tanpa latihan berulang-ulang maka akan
membutuhkan waktu lebih lama lagi menguasai bahasa Java.


Deklarasi Class
Class di dalam java dideklarasikan menggunakan keyword class diikuti dengan nama class.
Setelah nama class ada kurung kurawal buka ({) menandai awal dari class dan kurung kurawal
tutup (}) yang menandai akhir dari class.
Object adalah instansiasi dari class. Kita bisa membayangkan bahwa class adalah sebuah cetakan
dan object adalah materi hasil cetakan dari class. Setiap object akan mempunyai state (instance
variabel/properties) yang membedakan satu object dengan object lain, kemudian object juga
mempunyai behaviour (method) dimana logic dari class disimpan.
Class adalah jantungnya Java, class adalah bagian terkecil dari kode di java yang bisa berdiri
sendiri. Setiap kali kita akan membuat sebuah kode java, yang pertama harus dideklarasikan
adalah class. Java mengijinkan class didefnisikan dalam beberapa cara berbeda. Cara pertama
adalah mendefnisikan sebuah public class di dalam fle .java. Contohnya bisa kita lihat di bawah
ini :
public class Person { }
Simpan di dalam fle Person.java, kemudian compile fle .java di atas menggunakan java compiler
(javac).
$ javac Person.java
Setelah proses kompilasi berhasil, lihat isi folder dengan menggunakan perintah dir (windows)
atau ls (*nix). Terlihat bahwa class Person dibuatkan satu buah fle .class, dan nama dari fle
.class-nya sama persis dengan nama class-nya.
Kode di atas adalah deklarasi minimal dari sebuah class Java, ada keyword class diikuti oleh nama
class-nya kemudian diikuti oleh kurung kurawal buka dan tutup.
Cara kedua adalah beberapa class dideklarasikan di dalam satu fle .java, tetapi dalam satu fle
.java hanya boleh dideklarasikan satu buah public class yang namanya sama dengan nama fle
.java. Contohnya sebagai berikut :
public class Person{}
class Person2{}
class Person3{}
class Person4{}
Simpan di dalam fle Person.java, kemudian compile fle .java di atas menggunakan java compiler
(javac).
$ javac Person.java
Setelah proses kompilasi berhasil, lihat isi folder dengan menggunakan perintah dir (windows)
atau ls (*nix). Terlihat bahwa setiap class dibuatkan satu buah fle .class, dan nama dari fle .classnya
sama persis dengan nama class-nya.
Person.class
Person2.class
Person3.class
Person4.class
Cara ketiga adalah mendeklarasikan class sebagai inner class. Bisa kita lihat bahwa cara kedua di
atas, deklarasi class kedua dan seterusnya berada di luar dari class pertama, kemudian fle
.class yang dihasilkan berbeda-beda, dan penamaan class-nya tidak menyertakan nama class
public-nya, semuanya adalah class berbeda tetapi diletakkan dalam fle yang sama.
Konsep inner class berbeda, karena sekarang class yang dideklarasikan di dalam class lain
(inner class). Inner class sangat terikat dengan class dimana inner class itu berada. Misalnya
dari sisi penamaan, nama inner class harus diawali dengan nama class dimana inner class
berada kemudian diikuti dengan nama inner class itu sendiri. Misalnya contoh di bawah ini :
public class Person{
private class Person2{}
private static class Person3{}
class Person4{}
}
Compile fle .java di atas menggunakan java compiler (javac).
$ javac Person.java
Setelah proses kompilasi berhasil, lihat isi folder dengan menggunakan perintah dir (windows)
atau ls (*nix). Terlihata bahwa setiap class dibuatkan satu buah fle .class, nama fle .class
untuk inner class diawali dengan nama class di mana inner class berada kemudian ada tanda $
dan diakhiri dengan nama innner class-nya.
Person.class
Person$Person2.class
Person$Person3.class
Person$Person4.class
Cara deklarasi terakhir adalah anonymous inner class, yaitu inner class yang tidak mempunyai
nama, loh kok bisa? feature ini sering digunakan kalau kita ingin mengimplementasikan
interface di satu tempat dan implementasi itu tidak pernah digunakan di tempat lain.
Contohnya sebagai berikut ini :
public class Person{
private Runnable thread = new Runnable(){
public void run(){
System.out.println("HelloWorld from Thread");
}
};
}
Perhatikan kode di atas, ada sebuah variabel dengan nama thread, variabel tersebut adalah
object dari class Runnable. Karena Runnable adalah interface, maka kita perlu membuat class
yang implement interface, tetapi implementasinya tidak perlu membuat class baru dengan
nama tertentu, cukup langsung new Runnable dan implementasikan method run langsung di
situ.
Simpan ke fle Person.java dan coba compile menggunakan javac, setelah kompilasi berhasil
lihat isi dari direktori, akan ada dua buah fle class yaitu Person.class dan Person$1.class, nah
class yang terakhir inilah anonymous inner class. Kalau ada dua inner class atau lebih,
penamaanya menjadi Person$2.class, Person$3.class dan seterusnya.
Setelah kita membahas cara deklarasi java, sekarang kita bahas aturan-aturan yang harus
dipatuhi pada waktu pendeklarasian class di Java. Aturan-aturan tersebut antara lain :
• Hanya boleh ada satu class public dalam satu fle .java, non public class boleh lebih dari
satu di dalam satu fle .java
• Nama class public harus sama dengan nama fle .java
• Komentar bisa diletakkan di mana saja
• Jika class berada dalam sebuah package, maka harus ada deklarasi package di bagian
paling atas dari fle .java
• Import berada antara deklarasi package dan deklarasi class
• Deklarasi import dan package berlaku untuk semua class dalam fle .java, tidak mungkin
mendefnisikan dua buah class yang mempunyai package berbeda di dalam satu fle .java
Dalam aturan di atas, ada poin yang menyebutkan tentang package. Package adalah feature yang
sangat penting dalam Java, pada dasarnya package adalah sebuah folder yang memisah-misahkan
class. Class dengan fungsi yang mirip akan dikelompokkan dalam satu package yang sama, hal ini
dimaksudkan untuk memudahkan pengelolaan class agar mudah dipahami.
Kita bisa meletakkan beberapa keyword pada waktu pendeklarasian class. Jenis keyword pertama
yang bisa digunakan adalah access modifer, keyword access modifer terdiri dari empat level :
public, default, protected dan private. Hanya tiga dari empat level tersebut yang benar-benar
merupakan keyword, access modifer default bukan merupakan keyword karena kalau tidak ada
satupun dari ketiga access modifer digunakan di dalam deklarasi class maka kita menyebutnya
default. Kita akan bahas satu per satu efek dari penggunaan access modifer pada deklarasi
sebuah class.
Jika sebuah class dideklarasikan sebagai public, maka semua class yang lain dapat melihat class
tersebut. Melihat di sini dalam arti bisa mengimport, menginstansiasi, mengextends dan
memanggil method yang ada dalam class. Jika sebuah class dideklarasikan sebagai default atau
tidak ada access modifer sama sekali, maka hanya class dari package yang sama atau class
turunanya yang dapat melihat class tersebut. Class tidak bisa dideklarasikan sebagai protected.
Private hanya bisa digunakan oleh inner class saja, sedangkan class lain tidak bisa ditandai
sebagai private.
Selain access modifer, class bisa dideklarasikan menggunakan keyword fnal. Jika class
dideklarasikan dengan keyword fnal maka class ini tidak bisa diextends oleh class lain, salah satu
alasan kenapa class ditandai fnal agar tidak ada implementasi lain selain class ini. Semua class
wrapper seperti String ditandai sebagai fnal agar tidak ada yang mengextends class String ini.
Keyword abstract bisa digunakan untuk mendeklarasikan class, hal ini akan menyebabkan
abstract class tidak dapat diinstansiasi atau dibuat objectnya.


Deklarasi Interface
Interface pada dasarnya adalah sebuah class, hanya saja method-method di dalamnya hanya
berupa deklarasi saja, tidak ada implementasi dari method-method tersebut. Secara teknis bisa
dikatakan bahwa interface adalah class yang bersifat abstract, semua methodnya adalah public
dan abstract, serta semua variabel yang ada dalam interface adalah static fnal atau biasa disebut
sebagai konstanta. Deklarasi interface menggunakan keyword interface diikuti dengan nama
interface. Contoh paling sederhana dari sebuah interface bisa kita lihat dalam kode di bawah ini:
interface PersonDao{}
Aturan penamaan interface sama dengan penamaan class, kemudian aturan pendeklarasian
interface juga sama dengan pendeklarasian interface. Hanya saja tidak ada istilah inner interface
layaknya inner class.
Sebagai contoh kita akan membuat class PersonDaoImpl yang mengimplementasikan interface
PersonDao, di dalam interface PersonDao ada tiga buah method: save, delete dan getById
sehingga class PersonDaoImpl harus mengimplementasikan ketiga method ini.
public class Person{
private Long id;
private String nama;
public String getNama(){
return nama;
}
public void setNama(String nm){
nama = nm;
}
public Long getId(){
return id;
}
public void setId(Long i){
id = i;
}
}
Interface dideklarasikan dengan menggunakan keyword interface. Di dalamnya ada methodmethod
yang dideklarasikan tetapi belum ada implementasinya, ditandain dengan adanya titik
koma (;) setelah deklarasi method. Kalau method sudah diimplementasikan maka setelah
deklarasi method harus ada pasangan kurung kurawal buka tutup ({}) yang menandai blok
kode yang akan dieksekusi kalau method tersebut dipanggil.
public interface PersonDao{
void save(Person p);
void delete(Person p);
Person getById(Long id);
}
Class mengimplementasikan interface dengan menggunakan keyword implements. Semua
method dalam interface bersifat public sehingga walaupun dalam deklarasi interface tidak ada
public tetapi di class yang mengimplementasikan interface harus meletakkan access identifers
public pada deklarasi methodnya.
public class PersonDaoImpl implements PersonDao{
public void save(Person p){
System.out.println("menyimpan Person");
}
public void delete(Person p){
System.out.println("menghapus person");
}
public Person getById(Long id){
Person p = new Person();
p.setId(id);
p.setNama("abc");
return p;
}
}
Sebuah class bisa mengimplementasikan lebih dari satu interface, antara satu interface
dengan interface yang lain dipisahkan dengan tanda koma, seperti contoh sederhana di bawah
ini :
public interface PersonDaoImpl implements PersonDao, Serializable{}
Interface biasanya digunakan sebagai "kontrak" agar sebuah class yang mengimplementasikan
interface mempunyai semua method yang ada dalam interface itu, tetapi kita tidak ingin
mengekspose implementasinya. Salah satu contoh penggunaan interface adalah JDBC API. di
dalam JDBC API terdapat banyak interface seperti Connection, ResultSet, Statement,
PreparedStatement dan seterusnya. Setiap database yang ingin bisa diakses dari Java akan
mengimplementasikan JDBC API ini dengan cara membuat class yang mengimplementasikan
semua interface dalam JDBC API. Sehingga kalau kita ingin melakukan koneksi ke MySQL
ataupun ke Oracle, interfacenya sama, yang berbeda hanya implementasinya saja.
Implementasi dari JDBC API ini sering dikenal sebagai JDBC Driver. Mengenai JDBC kan kita
bahas lebih lanjut di bagian akses data ke database, sekarang kita fokuskan ke Interface.
Interface juga digunakan dalam best practice yang sering disebut dengan "code to interface",
best practice ini menganjurkan developer untuk menggunakan interface antar layer dalam
aplikasi. Misalnya contoh di atas kita membuat sebuah interface dengan nama PersonDao
untuk melakukan operasi penyimpanan object person, dengan membuat interface seperti ini
kita bisa mempunyai implementasi berbeda-beda untuk proses penyimpanan object person. Di
contoh di atas implementasi PersonDao sangat sederhana hanya menulis string ke stdout, kita
juga bisa membuat misalnya PersonDaoJdbc untuk menyimpan object person ke database
dengan menggunakan JDBC, atau bisa juga dibuat PersonDaoHibernate untuk menyimpan
object person ke database menggunakan Hibernate.
Kalau anda masih sulit memahami dua paragraf terakhir tentang interface, tidak masalah,
tujuan utama bab ini adalah menjelaskan tentang bagaimana membuat interface, seiring
dengan bab-bab selanjutnya kita akan belajar lebih jauh mengenai beberapa teknologi yang
sempat disinggung di atas.

ikuti terus tutorialnya..........

 

sumber : ifnu bima

   

Indeks  

   
© ALLROUNDER