อธิบาย class AbstractDao

ได้มีโอกาสเขียน code ร่วมกับพี่ที่เรียนปริญญาโทด้วยกัน เห็นเค้าเขียน class Dao ได้น่าสนใจดี
ก็เลยจะเอามาอธิบายให้ฟังกัน โดยความน่าสนใจหลักๆ ของคลาสนี้ก็คือการที่มันเป็น abstract
ซึ่งผมก็ยัง งง อยู่ว่า ไอ้ <T> เนี่ยมันเรียกว่าอะไร แต่ดูจากการทำงานก็พอจะเข้าใจแต่เรียกชื่อไม่ถูก
ลองมาดูคลาสตัวอย่างกัน เริ่มที่

Class:AbstactDao

package simplemrp.dao.bean;

import java.util.List;
import javax.persistence.EntityManager;

/**
 *
 * @author Golf
 */
public abstract class AbstractDao<T> {
    private Class<T> entityClass;

    public AbstractDao(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    //บังคับให้ class ที่ extends ไปใช้ต้อง implements method getEntityManager()
    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

    public List<T> findAll() {
        return getEntityManager().createQuery("select object(o) from " + entityClass.getSimpleName() + " as o").getResultList();
    }

    public List<T> findRange(int[] range) {
        javax.persistence.Query q = getEntityManager().createQuery("select object(o) from " + entityClass.getSimpleName() + " as o");
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    public int count() {
        return ((Long) getEntityManager().createQuery("select count(o) from " + entityClass.getSimpleName() + " as o").getSingleResult()).intValue();
    }

}

อธิบายได้ดังนี้
1. คลาสนี้เป็น abstract หมายความว่าัมันเป็นแค่โครงสร้าง รอให้เอาไป extends เพื่อนำไปใช้
2. หมายความว่า ตอนที่ extends ถ้านำ class ใดๆใส่เข้าไปจะสามารถส่ง Class นั้นเข้าไปเป็นข้อมูลให้ Abstract Class ได้
โดย T มันก็จะกลายเป็นคลาสนั้นๆ เช่น ใส่คลาสStudent ไป T ก็จะกลายเป็น class Student เจ๋งไหมเล่าาาา

ต่อไปมาดู
Class:BankDao

package simplemrp.dao.bean;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import simplemrp.dao.InfBankDao;
import simplemrp.entity.Bank;

/**
 *
 * @author Golf
 */
@Stateless
//BankDao นั้น extends AbstarctDao โดยให้  เป็น EntityClass คือ Bank
public class BankDao extends AbstractDao<Bank> implements InfBankDao {
    @PersistenceContext(unitName = "simple-mrp-ejbPU")
    private EntityManager em;

    //abstract getEntityManager() ถูกบังคับให้สร้างโดยในที่นี้ใช้ EntityManager จาก PersistenceContext return ไปซะ
    protected EntityManager getEntityManager() {
        return em;
    }

    public BankDao() {
        super(Bank.class);
    }

}

เวลาจะใช้ก็สามารถใช้ได้แบบนี้

BankDao bankDao = new BankDao();

    public List<Bank> getListBank() {
        return bankDao.findAll();
    }

ข้อดีของการสร้าง AbstractDao แบบนี้ก็คือ
1. ไม่ว่าคุณจะมี Entity กี่ตัวมักจะมี method ที่ต้องเขียนซ้ำแล้วซ้ำเล่า เช่น findAll(), find(id) แบบนี้เสมอ การเขียนสไตล์นี้จะลดความซ้ำซ้อน
ของการเขียน method พวกนี้ลงไปครับ
2. ยังนึกไม่ออก เหอะๆ

About WK

Kajook is a Senior Software Engineer. Job is Design & Develop in Java EE environment on Glassfish. I'm Interested in Agile software development ,iOS and Android.
This entry was posted in knowledge and tagged , , . Bookmark the permalink.

Leave a Reply

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

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s