Showing posts with label Sample 1 : Student Registration. Show all posts
Showing posts with label Sample 1 : Student Registration. Show all posts

July 16, 2014

Abstract Service Class

ပြီးခဲ့တဲ့အခေါက်တုန်းက Entity တွေအားလုံးကိုအခြေခံ အသုံးပြုမယ့် Dao ကို ရေးခဲ့ပါတယ်။ ဒီတစ်ခေါက် အဲ့ဒီ Entity တွေကို Web အပေါ်မှာ Service အနေနဲ့ ပြဖို့အတွက် RESTFul Web Service ကို ရေးပါမယ်။ ဒီတစ်ခေါက်မှာလည်း Dao တုန်းကလိုပဲ Resource တွေကို Reference လုပ်မယ်၊ Create လုပ်မယ်၊ Update လုပ်ပြီး Delete လုပ်ပါလိမ့်မယ်။ Dao တုန်းကလိုပဲ Generices ကို အသုံးပြုပြီး ရေးသားပါမယ်။ ဒါပေမယ့် ဒီတစ်ခေါက်က သိပ်ပြီးမတူဘူးဗျ။ ဘာလို့လဲဆိုတော့ JAX-RS မှာ Resource တစ်ခုအတွက် unique ဖြစ်တဲ့ Path တစ်ခုကို ရေးရမှာဖြစ်တယ်။ အားလုံးကို ဒီ Class တစ်ခုတည်းနဲ့ ရေးမယ်လို့လုပ်လို့မရပါဘူး။ အဲ့ဒီအတွက် ဆင်တူတဲ့ Method တွေကို Abstract Class မှာရေထားပြီး၊ ထူးထူးခြားခြားရေးချင်တဲ့ အခါတွေမှပဲ Concrete Class တွေထဲမှာ ဖြည့်ရေးပါမယ်။ နောက်ပြီး Path တွေကိုလည်း Concrete Class တွေမှာရေသားပါမယ်။


Application Path


အရင်ဦးဆုံး ရေးထားတဲ့ အပလီမှာ JAX-RS ကို သုံးလို့ရအောင်လုပ်ပါဦးမယ်။ web.xml မှာ ဖြည့်ရေးတဲ့နည်းရယ်၊ Annotation ကို သုံးရေတဲ့နည်းရယ် ရှိပါတယ်။ ဒီအပလီမှာ အစထဲက web.xml ကို အသုံးမပြုထားပါဘူး။ အဲ့ဒီအတွက် Annotation ကိုပဲသုံးပြီးရေပါမယ်။ ရေးရမှာကတော့ javax.ws.rs.ApplicationPath ကို extends လုပ်ထားတဲ့ Class တစ်ခုကို ရေးရပါမယ်။ ပြီးရင်အဲ့ဒီမှာ @ApplicationPath ကို ဖြည့်ပြီးရေရုံပါပဲ။ အဲ့ဒီ Annotation ရဲ့ Parameter အဖြစ်နဲ့ အသုံးပြုလိုတဲ့ Path ကို ရေးလိုက်တာနဲ့ အဲ့ဒီ Path ဟာ Rest Application ရဲ့  Root End Point အဖြစ်အသုံးပြုနိုင်မှာဖြစ်ပါတယ်။
@ApplicationPath(value = "/")
public class ServiceApplication extends Application {

}

အထဲမှာ "/" လို့ရေထားတဲ့အတွက် Web Application ရဲ့ Root Path ကို Rest ရဲ့ Root End Point အဖြစ်အသုံးပြုနိုင်မှာဖြစ်ပါတယ်။



Abstract Service Class


RESTFul Web Service ကို ရေးလို့ရပြီဆိုတော့ Entity တွေကို Resources အဖြစ်ဖော်ပြဖို့အတွက် Abstract Class တစ်ခုကိုရေးပါမယ်။
public abstract class AbstractService<T> {

 @Inject
 protected Dao<T> dao;
 protected Class<T> entity;

 protected abstract void setEntity();

 @PostConstruct
 public void init() {
  setEntity();
 }

 @GET
 @Produces(value = MediaType.APPLICATION_JSON)
 public List<T> getAll() {
  return dao.findAll(entity);
 }

 @GET
 @Path("{id}")
 @Produces(value = MediaType.APPLICATION_JSON)
 public T findById(@PathParam(value = "id") Integer id) {
  return dao.findById(id, entity);
 }

 @POST
 @Consumes(value = MediaType.APPLICATION_JSON)
 public T create(T t) {
  dao.persist(t);
  return t;
 }
 
 @PUT
 @Consumes(value =MediaType.APPLICATION_JSON)
 public T update(T t) {
  dao.update(t);
  return t;
 }

 @DELETE
 @Path("{id}")
 @Produces(MediaType.APPLICATION_JSON)
 public Response delete(@PathParam("id") int id) {
  this.dao.delete(dao.findById(id, entity));
  return Response.noContent().build();
 }

}

ကျွှန်တော်တို့ဒီနေရာမှာ သတိထားရမှာက Abstract Class ကို Generics Type အနေနဲ့ရေးထားပါတယ်။ ပြီးတော့ အဲ့ဒီ Class ကို Extends လုပ်တဲ့ Concrete Class မှာ Type Parameter ကို ဖြည့်ပြီး ရေးပါမယ်။ ဥပမာအား ဖြင့် Student Resource အတွက် StudentService Class ကို ရေးမယ်ဆိုရင် StudentService extends AbstractService<Student> လို့ရေးပါမယ်။ Type Parameter အဖြစ်အသုံးပြုထားတဲ့ Student ကို အတွင်းမှာပါတဲ့ Type Parameter နေရာတွေမှာ အစားထိုးအသုံးပြုသွားနိုင်မှာဖြစ်ပါတယ်။

နောက်တစ်ခု သတိထားကြည့်ရမယ့်နေရာက abstract method ဖြစ်တဲ့ setEntity ကိုပါ။ ဒီအထဲမှာ Dao မှာအသုံးပြုမယ့် Entity Class ရဲ့ အမျိုးအစားကို ဖြည့်ပေးဖို့လိုအပ်ပါတယ်။ အဲ့ဒီအတွက် member အနေနဲ့ Class<T> entity လို့ရေသားထားပါတယ်။ entity ရဲ့ တန်ဖိုးကို Concrete Class တွေမှာ အစားထိုးစေလိုတဲ့အတွက် abstract method setEntity ကို ရေးသားထားရခြင်း ဖြစ်ပါတယ်။ အဲ့ဒီ setEntity ကို @PostConstruct Annotation တပ်ထားတဲ့ init method ထဲကနေခေါ်ပါတယ်။ Enterprise Bean တွေကို Container ကနေ လိုအပ်တဲ့အခါမှာ Create လုပ်ပေးမှာဖြစ်တဲ့အတွက် Constructor ကို အသုံးပြုလို့မရပါဘူး။ အဲ့ဒီအတွက် Constructor ထဲမှာ ရေးချင်တဲ့ Logic တွေကို Life Cycle Annotation ဖြစ်တဲ့ PostConstruct Annotation နဲ့ရေးထားတဲ့ Method ထဲမှာ ရေးထားရခြင်း ဖြစ်ပါတယ်။ AbstractService ကို Extends လုပ်ထားတဲ့ Concrete Class ထဲမှာ setEntity ကို Override လုပ်ရေးထားပြီး၊ အတွင်းမှာ entity ကို အသုံးပြုမယ့် Class နဲ့ အစားထိုးထားမယ်ဆိုရင် အဲ့ဒီ Concrete Class ကို Construct လုပ်ပြီးတာနဲ့ entity ရဲ့တန်ဖိုးကို အခြား method တွေကနေ အသုံးပြုနိုင်မှာဖြစ်ပါတယ်။

ကျန်တာတွေကတော့ Resource တွေမှာ အသုံးပြုလိုတဲ့ CRUD Method တွေဖြစ်ပါတယ်။ Reference အတွက် အားလုံးကို ရှာမယ့် getAll method နဲ့ findById ကို ရေးသားထားပါတယ်။

getAll ရဲ့ Return Type ကတော့ List<T> ဖြစ်ပါတယ်။ ပြီးတော့ @GET Annotation ကို အသုံးပြုထားပါတယ်။ သက်ဆိုင်ရာ Resource ရဲ့ URI ကို HTTP Get method နဲ့ Request လုပ်လာရင် အဲ့ဒီ Resource အားလုံးကို ပြန်လည် ရရှိမှာဖြစ်ပါတယ်။ နောက်ပြီး ဒီအပလီမှာ Representation Type အနေနဲ့ JSON ကို အသုံးပြုချင်တဲ့အတွက် @Produces Annotation ရဲ့ Parameter မှာ MediaType.APPLICATION_JSON လို့ ရေးသားထားပါတယ်။

နောက်Method တစ်ခုကတော့ findById ပါ။ Argument အနေနဲ့ Integer id ကို အသုံးပြုထားပြီး၊ Return Type ကတော့ Generices Type ဖြစ်တဲ့ T ပါ။ Parameter အဖြစ် id ရဲ့တန်ဖိုးကို ပေးတာနဲ့ သက်ဆိုင်ရာ Object ကို ရရှိမှာဖြစ်ပါတယ်။ ဒီနေရာမှာ သတိပြုစေလိုတာက အဲ့ဒီ id ကို ဘယ်က ယူမလဲဆိုတဲ့အချက်ပါပဲ။ အဲ့ဒီ id ကို Path Parameter ကနေရယူလိုတဲ့အတွက် @Path("{id}") လို့ Path ကို ရေးထားပါတယ်။ ဥပမာအားဖြင့်  Student Resource ကို သုံးတဲ့နေရာမှာ /student/1 လို့ရေထားရင် 1 အား id အဖြစ်ရရှိမှာ ဖြစ်ပါတယ်။ အဲ့ဒီလို ရယူနိုင်ရန်အတွက်လည်း Argument id ရှေ့တွင် @PathParam("id") Integer id လို့ရေသားထားရခြင်းဖြစ်တယ်။ ထိုကဲ့သို့ရေးထားပါက Argument id ၏တန်ဖိုးအား Path Parameter id မှ ရယူသွားမည် ဖြစ်ပါသည်။

ကျန်တဲ့ Method တွေကတော့ create, update နဲ့ delete တို့ပါပဲ။ ၎င်းတို့ကိုလည်း သက်ဆိုင်ရာ HTTP POST, PUT နဲ့ DELETE တို့ကို အသုံးပြုထားပါတယ်။

အသုံးပြုလိုတဲ့ Resource Class တွေမှာ အထက်ပါ AbstractService ကို extends လုပ်ရေးရုံနဲ့ အထက်ပါ CRUD method တွေကို အသုံးပြုနိုင်မှာ ဖြစ်ပါတယ်။နောက်ရက်များမှပဲ Resources တွေအတွက် Concrete Class တွေကို ရေးသားပါတော့မယ်။

လေးစားစွာဖြင့်
မင်းလွင်

July 14, 2014

Data Access Object

ပြီးခဲ့တဲ့ရက်တွေတုန်းက အလုပ်ရှုပ်နေတာနဲ့ ဘလောဂ်ကို မရေးဖြစ်ခဲ့ဘူး။ ဒီနေ့တော့ နည်းနည်းအားတာနဲ့ ပြီးခဲ့တဲ့တစ်ခေါက်ရေးခဲ့တဲ့ အပလီကို ဆက်ရေးပါမယ်။ ပြီးခဲ့တဲ့တစ်ခေါက်တုန်းကတော့ Entity တွေကို Table ကနေ Generate လုပ်ခဲ့ပါပြီ။ ယခုတစ်ခေါက်မှာတော့ အဲ့ဒီ Entity တွေကို Access လုပ်တဲ့ Object ကို ရေးပါမယ်။ ဘယ် Entity တွေမဆို အခြေခံအားဖြင့် CRUD တော့လုပ်ရပါမယ်။ အဲ့ဒီ အလုပ်တွေကို လုပ်တဲ့အခါမှာ အသုံးပြုမယ့် Entity ကသာကွာသွားပါမယ်၊ လုပ်ရမှာကတော့ အတူတူဖြစ်ပါလိမ့်မယ်။ အဲ့ဒီအတွက် Generics ကိုသုံးပြီး ရေးကြည့်ပါမယ်။

Genericsဆိုတာက Objectအတွင်းမှာအသုံးပြုမယ့် Object ရဲ့ Typeကို Parameter နဲ့ရယူနိုင်ပြီး၊ အသုံးပြုမယ့် Element တွေကို Abstraction ဖြစ်အောင် လုပ်နိုင်ပါတယ်။ အဲ့ဒီအတွက် Entity ကို Abstraction လုပ်ပြီး Entity တစ်ခုချင်းစီရဲ့ Data Access Object ကို မရေးတော့ပဲ Object တစ်ခုတည်းကနေ Entity အားလုံးကို Access လုပ်လို့ရမယ့် Object မျိုးကို ရေးသားပါမယ်။


Entity Manager


နောက်ပြီးကျွှန်တော်တို့လက်ရှိသုံးနေတဲ့ပတ်ဝင်းကျင်ကတော့ Java EE 7 ရဲ့ Glassfish 4ဖြစ်ပါတယ်။ အဲ့ဒီထဲမှာ EJB ကို သုံးလို့ရပေမယ့် မသုံးထားပါဘူး။ မလိုအပ်တဲ့အတွက်ပါ။ အဲ့ဒီအစား Transaction တွေကို ထိမ်းဖို့အတွက်ကတော့ CDI ကို အသုံးပြုပါမယ်။ အဲ့ဒီတော့ Data Access အတွက် အသုံးပြုမယ့် EntityManager ကိုတော့ CDI ရဲ့ Application Scope မှာ Produce လုပ်ပြီး၊ အဲ့ဒီ EntityManager ကိုပဲ လိုအပ်တဲ့နေရာမှာ Inject လုပ်ပြီးသုံးပါမယ်။ Dao ထဲကနေ လိုအပ်တဲ့အခါမှာ EntityManager ကို Inject လုပ်ပြီးသုံးသွားပါမယ်။

ကျွှန်တော်တို့ ဒီနမှုနာအတွက် CDI ကို အသုံးပြုမှာဖြစ်ပါတယ်။ ScopeBeans တွေ Named တွေဆိုရင်တော့ beans.xml ကို မရေးရင်လည်းရပါတယ်။ ဒါပေမယ့် Dao ကို Default Injection အနေနဲ့ အသုံးပြုမှာဖြစ်တဲ့အတွက် ဒီနေရာမှာတော့ beans.xml ကို အသုံးပြုမှာဖြစ်ပါတယ်။ beans.xml ကို မကြာမကြာရေးရမှာဖြစ်တဲ့အတွက် ecipse ရဲ့ xml template ထဲမှာ သွားပြီး ရေးထားရင် template ထဲက ဖိုင်ကို create လုပ်ပြီးသုံးနိုင်မှာဖြစ်ပါတယ်။
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
 http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
 version="1.1" bean-discovery-mode="all">
</beans>

အထက်ပါအတိုင်း beans.xml ကို ရေးပြီးတဲ့အခါမှာ EntityManager ကို Produce လုပ်မယ့် Bean ကို ရေးရပါမယ်။ EntityManager ကို Application တစ်ခုလုံးမှာ တစ်ခုတည်းအသုံးပြုချင်တဲ့အတွက် ၎င်းကို ApplicationScope ထဲမှာ ရေးပါမယ်။အသုံးပြုလိုတဲ့ EntityManager ကို @PersistanceContext ကို ရေးပြီး Inject လုပ်ပါမယ်။ နောက်ဆုံးgetter method မှာ @Produce ကို အသုံးပြုပြီး အောက်ပါအတိုင်း ရေးသားထားပါတယ်။
@ApplicationScoped
public class CommonProducer {

 @PersistenceContext
 private EntityManager em;
 
 @Produces
 public EntityManager getEm() {
  return em;
 }
}

ဒါဆိုရင် ဒီအပလီကေးရှင်းထဲမှာ EntityManager ကို လိုအပ်တဲ့နေရာမှာ Inject လုပ်ပြီး အသုံးပြုနိုင်မှာဖြစ်တယ်။


Data Access Object


ဆက်လက်ပြီး Data Access Object ကို စဉ်းစားပါမယ်။ အခြေခံအားဖြင့် Dao မှာ Create လုပ်မယ်၊ Reference လုပ်မယ်၊ Update လုပ်မယ်ဗျာ၊ ပြီးရင် Delete လုပ်ပါမယ်။ နောက်ပြီး Reference လုပ်တဲ့နေရာမှာလည်း အားလုံးကို Reference လုပ်တာနဲ့ ID နဲ့ Reference လုပ်တာရှိပါမယ်။ အဲ့ဒီအတွက် Generics Type Interface ကို ရေးပါမယ်။
public interface Dao<T> {
 
 public T persist(T t);
 public List<T> findAll(Class<T> clz);
 public T findById(Object id, Class<T> clz);
 public T update(T t);
 public void delete(T t);

}
အထက်ပါ Dao<T> Interface ဟာ Generic Type Interface ဖြစ်ပါတယ်။ အဲ့ဒီအထဲမှာပါတဲ့ T ဟာ Type Parameter ဖြစ်ပါတယ်။ အဲ့ဒီ T နေရာမှာ အသုံးလိုတဲ့ Type ကို ဖြည့်စွက်ပြီး၊ ၎င်း အတွင်းမှာရှိတဲ့ T နေရာမှာ ၎င်း Type အား အစားထိုး၍ အသုံးပြုသွားမှာဖြစ်တယ်။ အထဲမှာတော့ Create လုပ်ဖို့အတွက် persist method ကို၎င်း၊ အားလုံးကို ရှာဖို့အတွက် findAll method ကို၎င်း၊ id နဲ့ ရှာဖို့အတွက် findById အား၎င်း၊ update လုပ်ဖို့အတွက် update method အား၎င်း၊ delete လုပ်ဖို့အတွက် delete method ကို၎င်း ရေးသားထားပါတယ်။ ဒါဆိုရင် Entity အားလုံးအတွက် အခြေခံ CRUD ကို ဒီ Interface ကို Implement လုပ်ရေးထားတဲ့ Class တစ်ခုတည်းနဲ့ အစဉ်ပြေစွာအသုံးပြုနိုင်မှာဖြစ်ပါတယ်။ နောက်ပိုင်းကျမှ Where တို့ Join တို့ကို အစဉ်ပြေအောင် ရေးနိုင်ဖို့စဉ်းစားပြီးရေးထားပါမယ်။

ဆက်လက်ပြီး ၎င်းကို Implement လုပ်မယ့် DaoImp Class ကို ဆက်ရေးပါမယ်။
public class DaoImp<T> implements Dao<T> {

 @Inject
 private EntityManager em;

 @Override
 @Transactional
 public T persist(T t) {
  em.persist(t);
  return t;
 }

 @Override
 public List<T> findAll(Class<T> clz) {
  return em.createQuery(
    String.format("select a from %s a", clz.getSimpleName()), clz)
    .getResultList();
 }

 @Override
 public T findById(Object id, Class<T> clz) {
  return em.find(clz, id);
 }

 @Override
 @Transactional
 public T update(T t) {
  return em.merge(t);
 }

 @Override
 @Transactional
 public void delete(T t) {
  em.remove(t);
 }

}

ဤ DaoImp သည် Dao အား Implement လုပ်ထားသော Generics Class ဖြစ်သည်။ ၎င်းအထဲတွင်EntityManager object အား အသုံးပြုရန်လိုအပ်ပါသည်။ ထို့ကြောင့် EntityManager သည် DaoImp ၏ Dependency ဖြစ်ပါသည်။ အကြောင်းမှာ DaoImp အားအလုပ်လုပ်စေရန် EntityManager အား မှီခိုနေရသောကြောင့်ဖြစ်သည်။

ဤနေရာတွင် EntityManager အား CDI ၏ Dependency Injection အား အသုံးပြု၍ Inject လုပ်ထားပါသည်။ သို့မဟုတ်ပါက တိုက်ရိုက် DaoImp အထဲတွင် Instanciate လုပ်ရန်၊ ဒါမှမဟုတ် Constructor ဖြင့် ထည့်သွင်းရန်၊ ဒါမှမဟုတ် setter method အား အသုံးပြုရန် လိုအပ်ပါလိမ့်မယ်။ ဤနေရာတွင် Dependency Injection အားအသုံးပြု၍ ၎င်းတို့အကြားရှိ ပတ်သက်မှု့ကိုလျှော့ချစေနိုင်ပါသည်။

ဤ DaoImp အား အသုံးပြု၍ Entity အားလုံး၏ အခြေခံ CRUD တို့အား အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။ နောက်ရက်များမှပဲ ၎င်းတို့အား Resource အဖြစ် Web အပေါ်တွင် ဖော်ပြနိုင်ရန် JAX-RS နှင့် ဆက်လက်ရေးသားသွားပါဦးမည်။

ဆက်ပါဦးမည်။လေးစားစွာဖြင့်။
မင်းလွင်

June 26, 2014

Creating Entities from Tables

ပြီးတဲ့တဲ့ အခေါက်အထိ External Design တွေဖြစ်တဲ့ View တွေနဲ့ Database Design ကိုလည်း ရေးခဲ့ပါပြီ။ ပြီးတော့ MySQL Database ကိုလည်း တည်ဆောက်ခဲ့ပါပြီ။ ဒီတစ်ခေါက်မှာတော့ Server ဘက်က အပိုင်းကို ရေးပါမယ်။

ဒီနေရာမှာ Database ကနေ JPA ရဲ့ Entity Class တွေကို Generate လုပ်တဲ့ နည်းကို အသုံးပြုသွားပါမယ်။ တစ်ခုသတိပြုရာမှာက Rest ကို သုံးပြီး XML ဒါမှမဟုတ် JSON ကို ပြောင်းတဲ့အခါမှာ Bidirectional Relationship တွေကို ရေးထားမယ်ဆိုရင် ပြဿနာတက်တတ်ပါတယ်။ ဖြေရှင်းတဲ့နည်း မရှိဘူးတော့မဟုတ်ပါဘူး။ Annotation ကို သုံးပြီးရေထားရင် ပြဿနာမရှိပါဘူး။ ဒါပေမယ့် ဒီတစ်ခေါက်တော့ အချိန်သိပ်ပြီး မယူချင်တဲ့အတွက် Unidirectional Relationship ကို ပဲသုံးပြီး ရေးသွားပါမယ်။ တစ်ခါတစ်လေ ပြန်ပြီး Reference လုပ်လိုတဲ့အခါကျမှ လော့ဂျစ်သုံးပြီး ရေးပါတော့မယ်။

လုပ်ရမယ့်အဆင့်တွေကတော့ အောက်ပါအတိုင်း ဖြစ်ပါတယ်။

  • CDI, JPA ရယ် jax-rs ကို သုံးလို့ရမယ့် Project တစ်ခု ဆောက်ပါမယ်။
  • ပြီးရင် Eclipse ရဲ့ Function ကို သုံးပြီး JPA Entity Class တွေကို Create လုပ်ပါမယ်။
  • နောက်ဆုံး အခြေခံ CRUD လုပ်မယ့် Dao Class တစ်ခုကို Generics သုံးပြီး ရေးပါမယ်။
တကယ်ဆို SQL မှာလုပ်လို့ရတဲ့ API တစ်ခုကို ရေးချင်တာပါ။ ဒါပေမယ့် ဒီတစ်ခေါက်တော့ ရိုးရိုး CRUD ပဲလုပ်လို့ရတာကိုပဲ ရေးလိုက်ပါမယ်။ နောက်အခေါက်တွေမှပဲ API တစ်ခု ရေးပါတော့မယ်။


Creating Server Site Project

ကျွှန်တော်တို့ View နဲ့ ERD ရေးပြီးသွားတဲ့အခါ Server Site မှာရှိတဲ့ အပလီကို ရေးပါမယ်။ ကျွှန်တော်တို့ JPA ကို အသုံးပြုတဲ့ WebService Application တစ်ခုကိုရေးပါမယ်။ အဲ့ဒီမှာ Transaction ကို CDI ကို သုံးပြီးထိမ်းပါမယ်။

အဲ့ဒီအတွက် JDC, CDI နဲ့ jax-rs ကို အသုံးပြုမယ့် Dynamic Web Project တစ်ခု ကိုရေးပါမယ်။ Server အနေနဲ့ Glassfish 4.0 ကို သုံးပါမယ်။

Project ကို တည်ဆောက်မယ့် အစီအစဉ်ကတော့

  • Dynamic Web Project တစ်ခုကို ဆောက်ပါမယ်
  • Project Facet ကို JPA, jax-rs ကို အသုံးပြုနိုင်အောင် ပြုပြင်ပါမယ်
  • Glassfish Server အပေါ်မှာ Resource ကို Create လုပ်ပါမယ်
  • persistence.xml ကို ပြုပြင်ရေးသားပါမယ်

Project Facets ကတော့ အောက်ပါအတိုင်း ဖြစ်ပါတယ်။


ပြီးတဲ့အခါမှာ Glassfish Admin Console ကနေပြီးတော့ Server ပေါ်မှာအသုံးပြုနိုင်တဲ့ Resource ကို Create လုပ်ပါမယ်။


အထက်ပါအတိုင်း အသုံးပြုမည့် Database ကို ဆက်သွယ်နိုင်တဲ့ JDBC Connection Pool ကို အရင်ဆောက်ပြီး၊ ၎င်းအား အသုံးပြုသော JDBC Resource အား ဆောက်လုပ်ထားပါသည်။ ဤနေရာတွင် တည်ဆောက်ထားသော JDBC Resource Name အား JPA ၏ persistence.xml တွင် အသုံးပြုမည် ဖြစ်သည်။


Creating JPA Entity by Eclipse


အရင်ဦးဆုံး Entity အတွက် Package တစ်ခုကို ဆောက်ပါတယ်။ src folder အပေါ်မှာ right click ထောက်ပြီး New > Package ကိုရွေးပါတယ်။


အဲ့ဒီနောက်မှာ com.solt.jdc.entity လို့ Package Name မှာဖြည့်ပြီး Finish ကို နှိပ်ပါတယ်။


ထို့နောက် ဆောက်ထားတဲ့ Package အပေါ် Right Click ထောက်ပြီး New > JPA Entities from Tables ကို ရွေးပါတယ်။


အောက်ဖော်ပြပါအတိုင်း Connection ကို ရွေးပြီး၊ Connect လုပ်ပေးလိုက်ရင် Database ထဲမှာရှိတဲ့ Tables တွေကို တွေ့ရပါလိမ့်မယ်။ အဲ့ဒါတွေကို Select လုပ်ပေးရပါမယ်။ Connection ကို တော့ အရင်ဆောက်ထားဖို့လိုပါတယ်။


ပြီးရင် Next Button ကို နှိပ်ပါမယ်။ Relation တွေကို ရွေးမယ့်စာမျက်နှာကို တွေ့ရပါမယ်။ Select လုပ်ရတာလွယ်အောင် Bi-Directional Relation ကိုပဲထားပါမယ်။ လိုအပ်ပါမှ XML Binding နေရာမှာ ပြန်ပြင်ပါမယ်။


ပြီးရင် Next ကို ဆက်နှိပ်ပြီး Key Generation ကို ရွေးချယ်ပါမယ်။ MySQL Tables တွေမှာ Key အတော်များများကို Auto Increase လုပ်ထားတဲ့အတွက် Identity ကို ရွေးပြီး Next ကို နှိပ်ပါမယ်။


Entity တစ်ခုဆီကို Customize လုပ်တဲ့ စာမျက်နှာမှာ Auto Increase မလုပ်မယ့် student_jdc ကို ရွေးပြီး Key Generator ကို none ကို ရွေးပြီး Finish ကို နှိပ်ပါမယ်။ ဒါဆိုရင် လိုအပ်တဲ့ Entity တွေကို အလိုအလျှောက် တည်ဆောက်သွားပါလိမ့်မယ်။


အောက်ပါအတိုင်း Entities တွေကို တည်ဆောက်ပြီး ဖြစ်နေတာကို တွေ့ရပါမယ်။


ဒီနေ့တော့ ဒီလောက်ပါပဲ။ နောက်ရက်များမှပဲ Dao Class ကို ရေးသားပါတော့မယ်။

ဆက်ပါဦးမည်။ လေးစားစွာဖြင့်။
မင်းလွင်

May 31, 2014

Database Design

Data Modeling


View အပိုင်းကို SceneBuilder သုံးပြီး ရေးတဲ့အတွက်  အတော်လေးကို မြန်မြန်ဆန်ဆန်ပြီးသွားပါတယ်။ လုပ်ချင်တဲ့ အရာတွေကိုလည်း လုပ်ဆောင်နိုင်ကြောင်းကို စမ်းစစ်မိပါတယ်။ အဲ့ဒီနောက်ပိုင်းမှာ MySQL ရဲ့ workbench ကို သုံးပြီး Database Design ကို ဆွဲပါတယ်။ သူကလည်း Drug And Drop နဲ့ ဆွဲလို့ရတဲ့အတွက် အတော်လေးကို တာသွားပါတယ်။

အသုံးပြုမယ့် Table ကတော့ အားလုံး ၈ ခုပါ။

  • ရန်ကုန်မြို့ရှိလူတွေကိုသာ Target ထားတဲ့အတွက် township ကို ပဲသုံးပါတယ်
  • ကျောင်းသားတွေအတွက်ကတော့ student
  • အချိန်စာရင်းအတွက်ကတော့ time_table
  • သင်ခန်းစာ အတွက်ကတော့ course
  • သင်တန်းကိုတော့ jdc_class မှာ သိမ်းပါမယ်
  • ဘယ်ကျောင်းသားက ဘယ်အတန်းမှာတက်တယ်ဆိုတာကို မှတ်ထားဖို့အတွက်ကတော့ student_jdc Table ကို သုံးပါမယ်
  • ငွေအဝင်အထွက်ကတော့ transaction နဲ့ သိမ်းပါမယ်
  • ကျောင်းလခကိုတော့ bill နဲ့ သိမ်းပါတယ်
  • နောက်ဆုံးထွက်ငွေအတွက်ကတော့ output table ကို သုံးပါတယ်

အထက်ပါအတိုင်း Data Model ကို ရေးပြီးတဲ့အခါမှာ MySQL Database မှာ Synchronize လုပ်ပြီး Table တွေကို တည်ဆောက်လိုက်ပါတယ်။ View နဲ့ DB ပြီးပြီဆိုတော့ လော့ဂျစ်နဲ့ အာကီတက်ချာကို စဉ်းစားဖို့ ကြံပါတယ်။


About Architecture

ပုံမှန်ဆိုရင် ကောင်တာက တစ်ယောက်ထဲသုံးမှာမို့လို့ Standalone Desktop Appilcation လည်းဖြစ်ပါတယ်။ ဒါပေမယ့် နောက်ပိုင်းမှာ စက်တွေအများကြီးသုံးလာနိုင်တယ်။ ပြီးတော့ Reference ကိုလည်း Android တို့လို၊ Tablet တွေကနေ ကြည့်ချင်လည်း ကြည့်နိုင်မယ်။ အဲ့ဒီအတွက် Client Server ပုံစံကို သုံးမယ်စဉ်းစားပါတယ်။ နောက်ပြီး RESTFul နဲ့ Web Service ကို ဖွင့်ထားမယ်ဆိုရင် ဘယ်ပလတ်ဖောင်းကမဆို တပြေးညီထဲသုံးနိုင်မှာဖြစ်တယ်။ 

နောက်ပြီး ပတ်ဝင်းကျင်ရှားတဲ့ EJB ကို မသုံးချင်တဲ့အတွက် CDI ကို သုံးမယ်စဉ်းစားပါတယ်။ အသုံးပြုမယ့် Architecture ကတော့ အောက်ပါအတိုင်း ဖြစ်ပါတယ်။


Client ဘက်မှာ Lambda Expression ကို သုံးချင်တဲ့အတွက် Java SE 8 ကို အသုံးပြုမယ် စဉ်းစားပါတယ်။ Lambda Expression ကို အသုံးပြုခြင်းအားဖြင့် Code တွေကို ရှင်းရှင်းလင်းလင်းနဲ့ ထိထိရောက်ရောက် အသုံးပြုနိုင်ပါတယ်။ နောက်ပြီး Streams နဲ့ Functional Programming Style ကို သုံးပြီး Data တွေကို Manipulate လုပ်ရတာ လွယ်ကူစေနိုင်မှာ ဖြစ်တယ်။

နောက်အခေါက်ကနေစပြီး ကုဒ်ရေးတဲ့ အကြောင်းတွေကို ဆက်ပြီးဖော်ပြသွားပါဦးမယ်။

ဆက်ပါဦးမယ်။
မင်းလွင်

စတင်ခြင်း

ပြီးခဲ့တဲ့ တစ်ခေါက် Sunday Seminar မှာ CDI အကြောင်းပြောဖို့လုပ်တယ်။ ဒါပေမယ့် မအားတာနဲ့ ပြင်ဆင်ချိန် သိပ်မရလိုက်ဘူး။ နမှုနာလေးတစ်ခုရေးမယ်ဆိုပြီး ဒီအပလီကို စရေးဖြစ်ပါတယ်။ CDI ကို အဓိကထားပြီး JavaFX နဲ့ RESTFul Web Service ကို သုံးမယ်ပေါ့။ တစ်ချက်ခုတ် နှစ်ချက်ပြတ်ဆိုပြီး သင်တန်းအတွက် ကျောင်းသားစာရင်းသွင်းတဲ့ အပလီကို ရေးမယ် ဆုံးဖြတ်ပါတယ်။ ပြီးရင်လည်း ပြန်သုံးရအောင်လို့ပါ။

အစကတော့ လိုအပ်ချက်တွေကို ပြင်ဆင်ပါတယ်။

  • သင်တန်းအသစ်တွေ၊ အတန်းအသစ်တွေ၊ အချိန်အသစ်တွေ ဖြည့်ရမယ်။
  • ကျောင်းသားအသစ်တွေလက်ခံနိုင်ရမယ်
  • သင်တန်းကို လက်ခံနိုင်ရမယ်
  • ကျောင်းသားတွေကို ကျောင်းလခခွဲပြီး လက်ခံနိုင်ရမယ်
  • လက်ရှိ ဝင်ငွေထွက်ငွေကို ကြည့်နိုင်ရမယ်
ဒီအပလီကို နောက်ပိုင်းမှာ ချဲ့ချင်ရင် ချဲ့နိုင်အောင် တတ်နိုင်သလောက်တော့ ဒေတာဘေစ်ကို အရှင်းဆုံးထားမယ်ဆုံးဖြတ်ထားပါတယ်။ JavaFX ကို သုံးတဲ့အတွက် SceneBuilder နဲ့ View တွေကို မြန်မြန် ရေးနိုင်ခဲ့ပါတယ်။ 

View တွေကတော့ 
  • သင်တန်းသားအသစ်လက်ခံတဲ့ Registration
  • ကျောင်းသားတွေကို ကြည့်နိုင်မယ့် Students
  • ဝင်ငွေထွက်ငွေတွေကို ကြည့်နိုင်မယ့် Balance
  • Master Data တွေကို Management လုပ်မယ့် Admin

Registration View

ဒီ View ကတော့ သင်တန်းသားအသစ်တွေကို လက်ခံတဲ့ View ပါ။ ရှိပြီးသားကျောင်းသားတွေကလည်း သင်တန်းအသစ် ပြန်တက်ချင်တက်မယ်။ တစ်ခါမှ မလာဘူးတဲ့ ကျောင်းသားအသစ်တွေလည်းပါမယ်။ ဒီမှာ လုပ်နိုင်တာက Register တစ်ခုပါပဲ။ သင်တန်းသားအသစ်ဆိုရင် ကျောင်းသား (Student) နဲ့ အတန်းကော၊ လက်ခံရရှိငွေစာရင်း(Bill) ကိုပါ Registration လုပ်မယ်။ သင်တန်းသားအဟောင်းဆိုရင်တော့ Bill နဲ့ အတန်းကိုပဲ Registration လုပ်ပါမယ်။
စစချင်းပေါ်နေရမှာက Student List နဲ့ Registration Form တို့ပါပဲ။ ဆွဲထားတဲ့ ပုံစံက အောက်ပါအတိုင်း ဖြစ်ပါတယ်။




Students View

ဒီစာမျက်နှာက ကျောင်းသားတွေကို Management လုပ်မယ့် စာမျက်နှာပါ။ ကျောင်းလခရှင်းရန် ကျန်သေးတဲ့ ကျောင်းသားတွေကို မြန်မြန်တွေ့ရင် အသုံးဝင်မယ် စဉ်းစားပါတယ်။ ကျောင်းလခတွေကို ခွဲသွင်းနိုင်ရမယ်။ Personal Information တွေကို ပြုပြင်နိုင်ရမယ်။ ကျောင်းသားရဲ့ ငွေသွင်းခဲ့တဲ့ History ကို ကြည့်နိုင်ရမယ်။ အဓိက အလုပ်လုပ်မှာက ကျောင်းလခသွင်းတဲ့အလုပ်ရယ်၊ ကျောင်းသားရဲ့ Information တွေကို ပြင်တဲ့အလုပ်ပါ။ ရေးထားတဲ့ View ကတော့ အောက်ပါအတိုင်း ဖြစ်ပါတယ်။




Balance


ဒီစာမျက်နှာကတော့ ဝင်ငွေထွက်ငွေကို ကြည့်နိုင်မယ့် စာမျက်နှာပါ။ ဒီစာမျက်နှာမှာတော့ ဘယ်ရက်ကနေ ဘယ်ရက်အထိ ဝင်ငွေထွက်ငွေတွေကို တစ်ပြိုင်နက်တည်း ကြည့်နိုင်ရမယ်။ ပြီးတော့ အသုံးငွေတွေကိုလည်း စာရင်းသွင်းနိုင်ရမယ်ပေါ့။ ရေးထားတဲ့ပုံက အောက်ပါအတိုင်း ဖြစ်ပါတယ်။



Admin View

ဒီ View မှာတော့ အပလီမှာသုံးမယ့် Master Data တွေကို Management လုပ်မှာပါ။ အဲ့ဒီမှာ သင်တန်း အချိန် (Time Table)၊ သင်ခန်းစာအတန်း (Course) နဲ့ အတန်း (Class) တွေကို အသစ်ဖြည့်စွက်မယ်၊ ပြုပြင်နိုင်ရမယ်။ အားလုံးကို စာမျက်နှာတစ်ခုထဲမှာ ကြည့်ချင်တဲ့အတွက် Tab View ကို သုံးမယ် စဉ်းစားပါတယ်။ Sub View က သုံးခုရှိပေမယ့် ဖွဲ့စည်းပုံကတော့ အခြေခံအားဖြင့် အတူတူပါပဲ။ Input Form တစ်ခုရယ် Table View တစ်ခုရယ် ဒါပဲပါပါလိမ့်မယ်။ သူ့မှာကတော့ Create နဲ့ Update ပါပါလိမ့်မယ်။



View အတွက်ကတော့ ဒီလောက်ပါပဲ။ ဒီထဲမှာ XML ဖိုင်အရှည်ကြီးတွေတွေ့တော့ လန့်မသွားပါနဲ့။ အဲ့ဒါတွေဟာ ကျွှန်တော်ရေးထားတာမဟုတ်ပါဘူး။ Scene Builder ကိုသုံးပြီး Drug And Drop နဲ့ ရေးထားတာပါ။ XML ဖိုင်ကတော့ သူ့ဟာသူ Generate လုပ်ပေးတာပါ။ နောက်နေ့တွေမှပဲ Database Design ရေးပုံနဲ့ အပလီကုဒ်ရေးပုံတွေကို ဆက်ပြီးဖော်ပြသွားပါဦးမယ်။

လေးစားစွာဖြင့်
မင်းလွင်