- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个 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文件组成。没有添加库。
我们的 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;
}
}
这里我们有一个简单的 RESTful 服务,可以GET
和POST
电影。
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);
}
}
为此,我们只需要一个简单的 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.class
、Movie.class
和 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}]}
关于android - 使用什么数据持久化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684491/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!