REST風サービスをJavaEEで構築する方法10(DAO層編1)

前回はDBに接続するための設定方法を紹介した。
今回は、その接続設定を使用して、実際にDBのデータを読み書きする方法を紹介する。

<前提条件>
下記の記事を読了していること。
REST風サービスをJavaEEで構築する方法01(導入編)
REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
REST風サービスをJavaEEで構築する方法04(各メソッド編)
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
REST風サービスをJavaEEで構築する方法06(JSON返却編1)
REST風サービスをJavaEEで構築する方法07(JSON返却編2)
REST風サービスをJavaEEで構築する方法08(Logic層編)
REST風サービスをJavaEEで構築する方法09(DB接続設定編)

接続するDB(MySQL)に下記のテーブルが作成されていること。


テーブル名:SAMPLE_TBL

No. カラム名 制約
1 ID CHAR 4 NOT NULL PRIMARY KEY
2 NAME VARCHAR 128 -

<全体像から見た位置づけ>
Entityクラス、Dao層の実装を行う。また、Logic層・Api層・RESTクライアントの追加編集を行う。

<手順概要>
1.Entityクラスを作成する
2.DAO層のクラスを作成する
3.Logic層クラスを編集する
4.Api層のクラスを編集する
5.index.htmlを編集する

<手順詳細>
1.Entityクラスを作成する
読み書きの対象となるテーブルのカラム構成に対応したEntityクラスを作成する。
プロジェクトツリー上で右クリックし、[新規]>[Javaクラス]を選択する。
表示されたダイアログにのクラス名に「SampleEntity」(※)、パッケージに「lab.moonmt.SampleRest.entity」(※)と設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。

作成されたクラスを下記の様に編集する。

package lab.moonmt.SampleRest.entity;

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

@Entity                         //...(1)
@Table(name="SAMPLE_TBL")       //...(2)
public class SampleEntity implements Serializable {
    
    @Id
    private String id;          //...(3)
    
    private String name;        //...(3)
    
    public SampleEntity(){}
    
    public SampleEntity(String id, String name){
        
        this.setId(id);
        this.setName(name);
    }

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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


ソースコード解説

番号 説明
(1) @Entityアノテーションを使用して、Entityクラスであることを宣言している。
(2) @Tableアノテーションを使用して、このクラスに対応するテーブル名が「SAMPLE_TBL」であることを宣言している。クラス名とテーブル名を一致させれば、本設定は不要である。
(3) テーブルのカラム名に対応したプロパティを定義している。

2.DAO層のクラスを作成する
プロジェクトツリー上で右クリックし、[新規]>[Javaクラス]を選択する。
表示されたダイアログのクラス名に「SampleDao」(※)、パッケージに「lab.moonmt.SampleRest.dao」(※)と設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。

作成されたクラスを下記の様に編集する。

package lab.moonmt.SampleRest.dao;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaQuery;
import lab.moonmt.SampleRest.entity.SampleEntity;

@Stateless
public class SampleDao {
    
    @PersistenceContext
    private EntityManager entityManager;        //...(1)
    
    //挿入
    public void create(SampleEntity sampleEntity){
        
        entityManager.persist(sampleEntity);   //...(2)
    }
    
    //更新(上書き)
    public void update(SampleEntity sampleEntity){
        
        entityManager.merge(sampleEntity);     //...(3) 
    }
    
    //削除
    public void delete(SampleEntity sampleEntity){
        
        entityManager.remove(entityManager.merge(sampleEntity));   //...(4)
    }
    
    //検索(IDによる検索)
    public SampleEntity find(String id){
        
        return entityManager.find(SampleEntity.class, id);        //...(5)
    }
    
    //全件取得
    public List<SampleEntity> getAll(){
        
        //(6)
        CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
        cq.select(cq.from(SampleEntity.class));
        return entityManager.createQuery(cq).getResultList();
    }
}


ソースコード解説

番号 説明
(1) @PersistenceContextアノテーションで「エンティティマネージャ」をインジェクト(DI)している。この「エンティティマネージャ」に前回設定した接続情報が適用されている。
(2) EntityManagerクラスの「persist」メソッドを使用して、テーブルに対して挿入処理を行っている。
(3) EntityManagerクラスの「merge」メソッドを使用して、テーブルに対して更新処理を行っている。
(4) EntityManagerクラスの「merge」メソッドと「remove」メソッドを使用して、テーブルに対して削除処理を行っている。
(5) EntityManagerクラスの「find」メソッドを使用して、テーブルに対して検索処理を行っている。
(6) 全件取得する際の定型処理を行っている。

3.Logic層クラスを編集する
REST風サービスをJavaEEで構築する方法08(Logic層編)で作成した「SampleLogic」を編集して、手順2で作成したDAO層クラスのメソッドを呼び出す。

package lab.moonmt.SampleRest.logic;

import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import lab.moonmt.SampleRest.dao.SampleDao;
import lab.moonmt.SampleRest.entity.SampleEntity;

@Stateless
public class SampleLogic {
    
    @EJB
    private SampleDao sampleDao;    //...(1)
    
    public void postMethod(String id, String name){
        
        SampleEntity se = new SampleEntity(id, name);
        sampleDao.create(se);     //...(2)  
    }
    
    public void putMethod(String id, String name){
        
        SampleEntity se = new SampleEntity(id, name);
        sampleDao.update(se);     //...(2)  
    }
    
    public void deleteMethod(String id){
        
        SampleEntity se = new SampleEntity(id, null);
        sampleDao.delete(se);     //...(2)  
    }
    
    public SampleEntity getMethod(String id){
        
        return sampleDao.find(id);     //...(2)  
    }
    
    public List<SampleEntity> getAllMethod(){
        
        return sampleDao.getAll();     //...(2)  
    }
}


ソースコード解説

番号 説明
(1) @EJBアノテーションでDAO層のクラスをインジェクト(DI)している。
(2) (1)のオブジェクトを使用して、Dao層クラスのメソッドを呼び出している。

4.Api層のクラスを編集する
REST風サービスをJavaEEで構築する方法08(Logic層編)で編集した「SampleApi」クラスを追加編集し、Logic層クラスのメソッドを呼び出す。

package lab.moonmt.SampleRest.api;

import java.util.List;
import javax.ejb.EJB;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import lab.moonmt.SampleRest.entity.SampleEntity;
import lab.moonmt.SampleRest.logic.SampleLogic;
import net.arnx.jsonic.JSON;

@Path("sampleApi")
public class SampleApi {
    
    @EJB
    private SampleLogic sampleLogic;
    
    @GET              
    @Path("getSample")
    public String getSampleMethod(
            @QueryParam("id")   String id
    ){
        
        SampleEntity se = sampleLogic.getMethod(id);
                        
        return JSON.encode(se);
    }
    
    @GET              
    @Path("getAllSample")
    public String getAllSampleMethod(){
        
        List<SampleEntity> seList = sampleLogic.getAllMethod();
                        
        return JSON.encode(seList);
    }
    
    @POST
    @Path("postSample")
    public String postSampleMethod(
            @FormParam("id")   String id,
            @FormParam("name") String name
    ){
        
        sampleLogic.postMethod(id, name);
                        
        return "success";
    } 
    
    @PUT
    @Path("putSample")
    public String putSampleMethod(
            @FormParam("id")   String id,
            @FormParam("name") String name
    ){
        
        sampleLogic.putMethod(id, name);
           
        return "success";
    }
    
    @DELETE
    @Path("deleteSample/{id}")
    public String deleteSampleMethod(
            @PathParam("id")   String id
    ){
        
        sampleLogic.deleteMethod(id);
                        
        return "success";
    }
}

5.index.htmlを編集する
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)で編集した、index.htmlファイルを追加編集する。

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <!-- jQueryライブラリの読み込み -->
        <script src='js/libs/jquery-1.11.2.min.js'></script>
        
        <!-- RESTクライアントの記述 -->
        <script>
             $(function(){
                 
                $('#btnGet').on('click', function(){    
                     $.ajax({
                       type: "GET",
                       url: "http://localhost:8080/SampleRest/webresources/sampleApi/getSample",
                       data: {"id":"0001"},
                       success: function(data){ 
                           alert(data);
                       }
                    });
                });
                
                $('#btnGetAll').on('click', function(){    
                     $.ajax({
                       type: "GET",
                       url: "http://localhost:8080/SampleRest/webresources/sampleApi/getAllSample",
                       success: function(data){ 
                           alert(data);
                       }
                    });
                });
                
                $('#btnPost').on('click', function(){    
                     $.ajax({
                       type: "POST",
                       url: "http://localhost:8080/SampleRest/webresources/sampleApi/postSample",
                       data: {"id":"8003","name":"bbbbbbbb"},
                       success: function(data){ 
                           alert(data);
                       }
                    });
                });
                
                $('#btnPut').on('click', function(){    
                     $.ajax({
                       type: "PUT",
                       url: "http://localhost:8080/SampleRest/webresources/sampleApi/putSample",
                       data: {"id":"8003","name":"cccccccc"},
                       success: function(data){ 
                           alert(data);
                       }
                    });
                });
                
                $('#btnDelete').on('click', function(){    
                     $.ajax({
                       type: "DELETE",
                       url: "http://localhost:8080/SampleRest/webresources/sampleApi/deleteSample/8003",
                       success: function(data){ 
                           alert(data);
                       }
                    });
                });
                
             });
        </script>
        
    </head>
    <body>
        <input type="button" value="GETメソッド"      id="btnGet"    /><br>
        <input type="button" value="GET(all)メソッド" id="btnGetAll" /><br>
        <input type="button" value="POSTメソッド"     id="btnPost"   /><br>
        <input type="button" value="PUTメソッド"      id="btnPut"    /><br>
        <input type="button" value="DELETEメソッド"   id="btnDelete" />
    </body>
</html>

<動作確認>
プロジェクトを実行し、ブラウザに表示されたボタンを押下し、DB操作が行われたことを確認する。

Enjoy Programing!!


<関連記事>
REST風サービスをJavaEEで構築する方法01(導入編)
REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
REST風サービスをJavaEEで構築する方法04(各メソッド編)
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
REST風サービスをJavaEEで構築する方法06(JSON返却編1)
REST風サービスをJavaEEで構築する方法07(JSON返却編2)
REST風サービスをJavaEEで構築する方法08(Logic層編)
REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)[本記事]
REST風サービスをJavaEEで構築する方法11(DAO層編2)
REST風サービスをJavaEEで構築する方法12(DAO層編3)
REST風サービスをJavaEEで構築する方法13(SQLログ編)


<お勧め書籍>

わかりやすいJavaEEウェブシステム入門
JavaEEに関して基本的なことが分かり易く記述されている。
JavaEEに関する最初の1冊としてお勧めである。
Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava
「金魚本」の愛称を持つJavaEEの教科書的な書籍である。
JavaEEを腰を据えて学びたい人にお勧めする1冊!!