web-dev-qa-db-ja.com

Java JAX-RSを使用して)にWebサービスでデータベースからデータを挿入する方法

Webサービスは初めてです。 Javaでjersey JAX-RSを使用してデータベースにデータを挿入および取得する方法を提案してください。

13
spt

以下は、 JAX-RS サービスが [〜#〜] jpa [〜#〜] を使用してセッションBeanとして実装された例です。永続化および [〜#〜] jaxb [〜#〜] は、次のようになります。

CustomerService

package org.example;

import Java.util.List;

import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {

    @PersistenceContext(unitName="CustomerService",
                        type=PersistenceContextType.TRANSACTION)
    EntityManager entityManager;

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public void create(Customer customer) {
        entityManager.persist(customer);
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("{id}")
    public Customer read(@PathParam("id") long id) {
        return entityManager.find(Customer.class, id);
    }

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public void update(Customer customer) {
        entityManager.merge(customer);
    }

    @DELETE
    @Path("{id}")
    public void delete(@PathParam("id") long id) {
        Customer customer = read(id);
        if(null != customer) {
            entityManager.remove(customer);
        }
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("findCustomersByCity/{city}")
    public List<Customer> findCustomersByCity(@PathParam("city") String city) {
        Query query = entityManager.createNamedQuery("findCustomersByCity");
        query.setParameter("city", city);
        return query.getResultList();
    }

}

お客様

以下は、エンティティの1つの例です。 JPAアノテーションとJAXBアノテーションの両方が含まれています。

package org.example;

import Java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

import Java.util.Set;

@Entity
@NamedQuery(name = "findCustomersByCity",
            query = "SELECT c " +
                    "FROM Customer c " +
                    "WHERE c.address.city = :city")
@XmlRootElement
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private long id;

    @Column(name="FIRST_NAME")
    private String firstName;

    @Column(name="LAST_NAME")
    private String lastName;

    @OneToOne(mappedBy="customer", cascade={CascadeType.ALL})
    private Address address;

    @OneToMany(mappedBy="customer", cascade={CascadeType.ALL})
    private Set<PhoneNumber> phoneNumbers;

}

詳細情報


[〜#〜]更新[〜#〜]

必要な瓶は何ですか

JAX-RS/EJB/JPA/JAXBアプリケーションを任意のJava EE 6準拠のアプリケーションサーバーにデプロイすることができ、追加のサーバーをセットアップする必要はありません。JAX-RSAPIを取得できるクライアントのプログラミングJersey( http://jersey.Java.net/ )から、およびEclipseLinkからのJPAおよびJAXB API( http://www.Eclipse.org/eclipselink/ =)。

データベース接続が書き込まれる場所

JDBCリソースと接続プール

アプリケーションサーバーで接続プールを設定する必要があります。以下はGlassFishでこれを行う手順です。手順は、使用しているアプリケーションサーバーによって異なります。

  1. JDBCドライバー(ojdbc14.jar)を/ glashfish/libにコピーします。
  2. 管理コンソールを起動します
  3. 接続プールを作成します。
    1. 名前= CustomerService
    2. リソースタイプ= 'javax.sql.ConnectionPoolDataSource'
    3. データベースベンダー= Oracle(またはデータベースに適切なデータベースベンダー)
    4. [次へ]をクリックして、次の「追加のプロパティ」に入力します。
    5. ユーザー(CustomerServiceなど)
    6. パスワード(例:パスワード)
    7. URL(例:jdbc:Oracle:thin:@localhost:1521:XE)
    8. 「Ping」ボタンを使用して、データベース接続をテストします
  4. 「CustomerService」というJDBCリソースを作成します
    1. JNDI名= CustomerService
    2. プール名= CustomerService(前の手順で作成した接続プールの名前)

JPA構成

次に、上で作成したデータベース接続をJPAエンティティのpersistence.xmlファイルで次のように参照します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://Java.Sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="CustomerService" transaction-type="JTA">
        <provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>CustomerService</jta-data-source>
        <class>org.example.Customer</class>
        <class>org.example.Address</class>
        <class>org.example.PhoneNumber</class>
        <properties>
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.level" value="FINEST" />
            <property name="eclipselink.logging.level.ejb_or_metadata" value="WARNING" />
            <property name="eclipselink.logging.timestamp" value="false"/>
            <property name="eclipselink.logging.thread" value="false"/>
            <property name="eclipselink.logging.session" value="false"/>
            <property name="eclipselink.logging.exceptions" value="false"/> 
            <property name="eclipselink.target-server" value="SunAS9"/> 
        </properties>
    </persistence-unit>
</persistence>
13
bdoughan

これを見てください link 、それを行う方法の1つを説明するビデオチュートリアルがあります。

したがって、このビデオでは、Webサービスが値を取得して、指定された資格情報がデータベース内の一部のデータと一致することをクライアントに伝える方法を説明しています。

これは、クライアント要求を処理するメソッドがどのように見えるかです:

@POST
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/login")
    public Response login(@FormParam("email") String email, @FormParam("password") String password) {

        Response.ResponseBuilder responseBuilder = null;
        
        boolean result = entityFacade.doLogin(email, password);
        if (result) {
             responseBuilder = Response.ok("Success");//Login good!
        }
        else {            
            responseBuilder = Response.ok("Wrong credentials!");//Login bad!
        }

        return responseBuilder.build();
    }

このWebサービスは、EJBがデータベースで選択操作を実行するビジネス層に資格情報を転送します:

@Stateless
public class EntityFacade implements EntityFacadeLocal {

    @Resource
    private UserTransaction ut;
    private CredentialJpaController controller;

    @PostConstruct
    public void init() {        
        controller = new CredentialJpaController(ut, Persistence.createEntityManagerFactory("ROLEProject-ejbPU"));
    }


    public boolean doLogin(String email, String password){        
        return controller.loginWithParameters(email,password);
    }
}

EJBは、データベースと対話するタスクを実行するサービスクラスに依存しています

public class CredentialJpaController implements Serializable {

    public CredentialJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    public boolean loginWithParameters(String email, String password) {
        boolean result = false;
        EntityManager em = getEntityManager();
        Long l = (Long) em.createNamedQuery("loginquery").setParameter("emailParam", email).setParameter("passwordParam", password).getSingleResult();
        if (l == 1) {
            result = true;
        }
        return result;
    }
}

最後にDBと対話できるようにするには、データをJPAエンティティとして表す必要があります。また、選択された行をマーシャリングしてクライアントに戻すことができるようにするには、MediaTypeが何であれ、エンティティにJaxBアノテーションが含まれている必要があります

@XmlRootElement
@Entity
@Table(name = "CREDENTIALS")
@NamedQuery(name="loginquery", query="SELECT COUNT(c) FROM Credential c WHERE c.email = :emailParam AND c.password = :passwordParam")
public class Credential implements Serializable {

    @Id
    private String email;
    @Column(nullable = false)
    private String password;

    @XmlElement
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

     @XmlElement
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

以下はクライアントコードのサンプルです。Webサービスを呼び出す方法の1つを確認できます。

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>TODO supply a title</title>
    </head>
    <body>
        <div>TODO write content</div>
        <form action="http://localhost:8080/ROLEProject-war/role/login" method="POST">
            Email <input name="email"/>
            Password <input type="password" name="password"/>
            <input type="submit"/>
        </form>
    </body>
</html>

これがあなたにアイデアを与えるのに役立つことを願っています。

データを挿入するには、プロセスはほとんど同じです。エンティティマネージャーのfind()ではなく、persist()メソッドを使用します。

4
sfrj