使用什么数据持久性方法?

时间:2012-12-03 13:41:06

标签: android mysql jpa amazon-ec2 jax-rs

我正在制作一个Android应用程序,它将从远程MySQL数据库中检索一些信息。我将使用JAX-RS使用restful java web服务,它将与MySQL DB交互以从表中检索数据。我知道,为了与底层数据库交互,可以使用JPA的一些实现。但是因为我只需要从数据库中检索数据而不是使用我的Android应用程序(作为客户端)插入任何新数据。

所以我真的需要实现JPA吗? 如果没有,我应该如何让我的java web服务从MySQL数据库中获取数据?

我的数据库安装在我运行apache tomcat 7的Amazon ec2-instance上。什么是最好的方法?如果你能推荐我一些好的教程,请做。

2 个答案:

答案 0 :(得分:2)

你正好只有一个下午远离一个非常简单的应用程序,它包含零编组代码而没有添加库......如果你选择了正确的部分。

似乎有一种普遍的想法,如果应用程序“太小”,它应该避免使用某些技术。事实上,如果 使用正确的技术,即使是这些小应用也会小得多

我建议使用JAX-RS和JPA并使用EE版本的Tomcat(TomEE)。

我在TomEE工作,但是阅读你的要求 - 尤其是EC2部分 - 我只需提及它。 TomEE基本上是Tomcat,添加了额外的库和Java EE 6 Web Profile certified on EC2(t1.micros及更高版本)。它相当小,只能通过默认的内存设置传递TCK。这意味着即使有一个小的t1.micro,它有613MB的内存,服务器只占很小的比例。

这是一个JAX-RS应用程序,可以从数据库中读取/写入Movie个对象。它由两个java文件和一个xml文件组成。没有添加库。

Movie.java

我们的Movie对象可以表示JSON数据数据库数据,因此我们不需要对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;
    }
}

Movies.java

我们提供了一个简单的RESTful服务,可以GETPOST部电影。

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)为我们创建所有数据库表。

完成

信不信由你,就是这样。这个程序有效。让我们来看一下war文件的内容,这样我们就可以完全看到所有这些并且不在战争中。

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

基本上有3个文件,Movies.classMovie.classpersistence.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}]}

答案 1 :(得分:1)

如果您需要从描述中获得相当少的数据,则无需为此解决方案实施JPA。您可以构建一个RESTful Web服务,只需在数据库调用时对数据库执行简单的JDBC查询。

REST请求进入 - 由Web服务询问 - Web服务获取数据 - 从Tomcat返回XML / JSON响应。另外 - 当您使用Tomcat而不是应用程序服务器时,如果您确实想要沿着JPA路线走,我会推荐Hibernate,因为如果没有像JBoss这样的应用程序服务器,您将无法使用EJB。即便如此,除非它是一个大型系统,否则运行某些JDBC的Tomcat实例应该可以正常工作,尤其是在EC2中。