0

リモートの MySQL データベースから情報を取得する Android アプリを作成しています。MySQL DB と対話してテーブルからデータを取得する JAX-RS を使用して、安らかな Java Web サービスを使用します。基礎となるデータベースと対話するために、JPAの実装を使用できることを認識しています。しかし、DB からデータを取得するだけでよいので、Android アプリを (クライアントとして) 使用して新しいデータを挿入する必要はありません。

では、JPA を実装する必要は本当にあるのでしょうか? そうでない場合、Java Web サービスで MySQL データベースからデータを取得するにはどうすればよいですか?

私のデータベースは、apache tomcat 7 を実行している Amazon ec2-instance にインストールされています。最適なアプローチは何ですか? 良いチュートリアルを紹介していただける場合は、どうぞ。

4

2 に答える 2

2

適切なパーツを選択すれば、マーシャリング コードもライブラリも追加されていない、驚くほどシンプルなアプリを 1 日で完成させることができます。

アプリケーションが「小さすぎる」場合、特定のテクノロジーを避けるべきであるという考えが広まっているようです。実際、これらの小さなアプリでさえ、適切なテクノロジーを使用すれはるかに小さくなります。

JAX-RS と JPA を使用し、Tomcat の EE バージョン ( TomEE ) を使用することをお勧めします。

私はTomEEに取り組んでいますが、あなたの要件、特にEC2の部分を読んで、それについて言及する必要があります. TomEE は基本的に Tomcat であり、追加のライブラリが追加され、EC2 (t1.micros 以降) で認定された Java EE 6 Web プロファイルが追加されています。これはかなり小さく、デフォルトのメモリ設定だけで TCK を渡すことができます。つまり、613MB のメモリを搭載した小さな t1.micro でも、サーバーはそのわずかな割合しか占有しません。

Movieこれは、データベースからオブジェクトを読み書きできる JAX-RS アプリケーションです。これは、2 つの Java ファイルと 1 つの xml ファイルで構成されています。追加されたライブラリはありません。

ムービー.java

オブジェクトはJSONデータMovieデータベース データの両方を表すことができるため、JSONとの間、またはデータベースとの間でマーシャリングを行う必要はありません。これはすべて私たちのために処理されます。

package org.stackoverflow;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@XmlRootElement(name = "movie")
public class Movie {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String director;
    private String title;
    private int year;

    public Movie() {
    }

    public Movie(String director, String title, int year) {
        this.setDirector(director);
        this.setTitle(title);
        this.setYear(year);
    }

    public long getId() {
        return id;
    }

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

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }
}

映画.java

ここには、canGETPOSTmovies を実行する単純な RESTful サービスがあります。

package org.stackoverflow;

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

@Path("/rest/movies")
@Produces(MediaType.APPLICATION_JSON)
@Singleton
@Lock(LockType.READ)
public class Movies {

    @PersistenceContext
    private EntityManager entityManager;

    @GET
    @Path("/{id}")
    public Movie getMovie(@PathParam("id") Long id) {
        return entityManager.find(Movie.class, id);
    }

    @POST
    public void addMovie(Movie movie) {
        entityManager.persist(movie);
    }
}

persistence.xml

これを実行するには、単純なWEB-INF/persistence.xmlファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

  <persistence-unit name="unit">
    <jta-data-source>movieDatabase</jta-data-source>
    <properties>
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
    </properties>
  </persistence-unit>

</persistence>

上記について注目すべき興味深い点openjpa.jdbc.SynchronizeMappingsは、JPA プロバイダー (この場合は OpenJPA) が存在しない場合にすべてのデータベース テーブルを作成するプロパティです。

終わり

信じられないかもしれませんが、それだけです。このアプリは動作します。戦争ファイルの内容を見て、戦争にあるものとないものすべてを完全に理解できるようにしましょう。

demo.war
demo.war/META-INF
demo.war/META-INF/MANIFEST.MF
demo.war/WEB-INF
demo.war/WEB-INF/classes
demo.war/WEB-INF/classes/org
demo.war/WEB-INF/classes/org/stackoverflow
demo.war/WEB-INF/classes/org/stackoverflow/Movie.class
demo.war/WEB-INF/classes/org/stackoverflow/Movies.class
demo.war/WEB-INF/lib
demo.war/WEB-INF/persistence.xml

基本的にMovies.class、 、Movie.classの3 つのファイルpersistence.xml

試乗

curl簡単なので使ってみましょう。mymovie.txt次の内容で呼び出される小さなファイルを作成します。

{
    "movie":{
       "director":"David Dobkin",
       "title":"Wedding Crashers",
       "year":2005
    }
 }

次に、サーバーに投稿することでそのムービーを追加できます。

$ curl -v -H "Content-Type: application/json" -X POST -d "@mymovie.txt" http://localhost:8080/demo/rest/movies
* About to connect() to localhost port 8080 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /demo/rest/movies HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 106
> 
* upload completely sent off: 106 out of 106 bytes
< HTTP/1.1 204 No Content
< Server: Apache-Coyote/1.1
< Date: Mon, 03 Dec 2012 21:12:23 GMT
< 
* Connection #0 to host localhost left intact
* Closing connection #0

これで、簡単なコマンドで簡単にムービーを取得できます。

$ curl http://localhost:8080/demo/rest/movies/1
{"movie":[{"director":"David Dobkin","id":1,"title":"Wedding Crashers","year":2005}]}
于 2012-12-03T22:04:35.970 に答える
1

説明から必要なデータ セットがかなり小さい場合、このソリューションに JPA を実装する必要はありません。データベースが呼び出されるたびに単純な JDBC クエリを実行するだけの RESTful Web サービスを構築できます。

REST 要求が入ってきます - Web サービスによって照会されます - Web サービスがデータを取得します - Tomcat から XML / JSON 応答を返します。また、アプリケーション サーバーではなく Tomcat を使用しているため、JPA ルートを使用する場合は、JBoss などのアプリケーション サーバーがないと EJB を使用できないため、Hibernate をお勧めします。それでも、大規模なシステムでない限り、特に EC2 では、JDBC を実行する Tomcat インスタンスだけで問題なく動作するはずです。

于 2012-12-03T13:45:26.897 に答える