gpt4 book ai didi

android - 使用什么数据持久化方法?

转载 作者:太空宇宙 更新时间:2023-11-03 12:34:46 25 4
gpt4 key购买 nike

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

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

我的数据库安装在运行 apache tomcat 7 的 Amazon ec2 实例上。最好的方法是什么?如果您可以向我推荐一些好的教程,请推荐。

最佳答案

您只需要一个下午就可以获得一个非常简单的应用程序,该应用程序包含零编码代码且没有添加库......如果您选择了正确的部分。

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

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

我在 TomEE 上工作,但阅读您的要求——尤其是 EC2 部分——我不得不提一下。 TomEE 基本上是添加了额外库和 Java EE 6 Web 配置文件的 Tomcat certified on EC2 (t1.micros 及更高版本)。它相当小,可以通过默认内存设置通过 TCK。这意味着即使使用具有 613MB 内存的小型 t1.micro,服务器也只占用其中的一小部分。

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

电影.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;
}
}

电影.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);
}
}

持久性.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文件的内容,这样我们就可以全面了解 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}]}

关于android - 使用什么数据持久化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com