我正在开发一个需要远程数据库连接的客户端 - 服务器应用程序。我们可以使用JDBC在Android中连接远程MySQL数据库吗?
我知道,网络和更多的人教程是使用PHP与MySQL进行交互。但是,我并不擅长PHP,而我以前的经验是使用Core Java,Swing和JDBC。
任何人都可以指导我,如果有可能在Android应用程序使用JAVA JDBC API连接远程MySQL数据库?
我正在开发一个需要远程数据库连接的客户端 - 服务器应用程序。我们可以使用JDBC在Android中连接远程MySQL数据库吗?
我知道,网络和更多的人教程是使用PHP与MySQL进行交互。但是,我并不擅长PHP,而我以前的经验是使用Core Java,Swing和JDBC。
任何人都可以指导我,如果有可能在Android应用程序使用JAVA JDBC API连接远程MySQL数据库?
基本上:您可以连接到您的MySQL(或任何您使用的服务器),但你不应该直接从你的Android应用程序做到这一点。
原因:
Android应用程序可以反编译,并在客户端将有凭据来访问你的数据库。如果使用诸如Backtrack这类正确的黑客工具,那么这个恶意客户端可以访问,连接和利用数据库中的数据。
如果您的应用程序,为客户在世界各地,那么客户应该打开并保持每个操作数据库的连接或一组操作。即使您的PC客户端位于数据库引擎服务器旁边的LAN中,打开物理数据库连接也需要很长时间。现在,想象一下从世界另一端的国家打开一个连接,例如中国或日本,或来自南美洲的国家,如巴西或秘鲁(我住的地方)。
出于这些原因有二,我可以拿出,它甚至还试图连接到MySQL或任何其他数据库直接从手机设备的发动机是一个坏主意。
如何解决这个问题?使用面向服务的体系结构,您将至少有两个应用程序:
服务提供商应用程序。此应用程序将创建和发布Web服务(最好是RESTful),并可能建立策略以使用Web服务,如用户身份验证和授权。此应用程序也将连接到数据库并对其执行CRUD操作。
服务消费者应用程序。这将是您的Android(或任何其他手机)应用程序。
从你的问题,你关注点1,正如我在我的意见已经说过了,你可以在Java中创建Web应用程序,创建一个RESTful服务存在,这可以归结为一个POJO (普通的旧Java对象),每个服务都有一个方法。在这种方法中,因为它毕竟是纯Java,所以可以添加其他功能,如JDBC使用。
下面是使用新泽西州,杰克逊(JSON库)和JDBC开球例如:
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM product");
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
productList.add(product);
}
//ALWAYS close the resources
rs.close();
stmt.close();
conn.close();
return productList;
}
}
你可以像mkyong's或Vogella's或其他任何你喜欢的教程检查的Java Web应用程序的进一步构造(这个答案中放置了太多信息)。
请注意,此应用程序可以演变为分层应用程序,并且JDBC代码将进入DAO类,然后ProductRestService
类将通过此DAO类访问数据库。这里有另一个开创性的例子:
public class ProductDao {
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
//the rest of the code explained above...
return productList;
}
}
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
ProductDao productDao = new ProductDao();
return productDao.getProducts();
}
}
而且你可以对这个项目进行其他修改以及不断发展。
你能说我PHP在这里做什么吗? (如果我使用PHP进行开发)
而不是使用Java编写服务提供者应用程序(如上所示),您可以使用PHP进行此操作。或者以Python,Ruby,C#,Scala或任何其他为您提供此技术的编程语言。再次,我不确定你正在阅读什么类型的教程,但应该在某处解释,并解释为了本教程的目的,您将使用PHP创建服务。如果您觉得用Java编写这些服务比使用PHP或其他语言编写这些服务更舒服,那就没有问题了。您的Android应用程序并不关心使用哪种技术来生成Web服务,它只会关心使用这些服务,并且可以使用这些服务中的数据。
你能提出任何关于使用泽西网络服务将Android应用程序连接到MySQL数据库的好文章吗? – 2014-12-09 14:54:32
@userX我在搜索我的搜索引擎时发现这个:http://programmerguru.com/android-tutorial/android-restful-webservice-tutorial-how-to-call-restful-webservice-in-android-part-3/ Tutorial TL; DR调用外部Web服务的方法是'invokeWS'。我不支持该教程。 – 2014-12-09 15:04:30
不能一个web服务被ddos攻击,所以它是如何完美的?是的,它可以保护pw,但是我不需要oauth或另一层悲伤?我倾向于使用mysql-procedures而不是webservice。这样我可以使用他们的IP地址来节制使用,不良行为。是的,IP是可以伪造的,但是在与php中介解决方案作战10年后,我倾向于使用mysql程序。 – jim 2017-01-02 16:08:27
无法从Android的访问MySQL数据库本身。编辑:其实你可以使用JDBC,但不建议(或可能无法正常工作?)......看到Android JDBC not working: ClassNotFoundException on driver
见
http://www.helloandroid.com/tutorials/connecting-mysql-database
的Android无法直接连接到数据库服务器。因此,我们 需要创建一个简单的Web服务,将通过请求到 数据库,将返回响应。
http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html
对于大多数[好]的用户,这可能是罚款。但是想象一下,你会得到一个黑客来抓住你的程序。我已经对自己的应用程序进行了反编译,并且惊吓了我所看到的内容。如果他们将您的用户名/密码发送到您的数据库并造成严重破坏,该怎么办?坏。
@xyz正如我在你对我的问题的评论中指出的那样,PHP不是必需的,这就是本教程向你解释的内容。 RESTful服务可以用PHP,Java,Python,Ruby,C#或任何其他支持创建一组RESTful服务的编程语言编写。 Web服务客户端(在这种情况下,即您的Android应用程序)与创建Web服务的技术无关。 – 2014-10-20 16:34:02
@LuiggiMendoza你能说我在这里做什么PHP吗? (如果我用PHP开发的) – xyz 2014-10-20 16:36:26
这是可以做到的,但不建议使用。我之前做过,因为我和你在同一条船上,所以我会分享一些代码。
我用特别这个JDBC JAR:https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-java-3.0.17-ga-bin.jar?dl=0
现在的代码:
package com.example.test.databaseapp;
import java.sql.DriverManager;
import java.sql.SQLException;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
public class MainActivity extends Activity {
static final String url = "jdbc:mysql://x.x.x.x:xxxx/DBNAME";
static final String user = "client";
static final String pass = "password";
public static List<objClass> objList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Download(MainActivity.this, internalUrl).execute(); //async task for getting data from db
}
}
现在对于我的异步任务:
public class Download extends AsyncTask<Void, Void, String> {
ProgressDialog mProgressDialog;
Context context;
private String url;
public Download(Context context, String url) {
this.context = context;
this.url = url;
}
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(context, "",
"Please wait, getting database...");
}
protected String doInBackground(Void... params) {
try {
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection(url, user, pass);
java.sql.Statement st = con.createStatement();
java.sql.ResultSet rs = st.executeQuery("select * from table");
list = new ArrayList<objClass>();
while (rs.next()) {
String field= rs.getString("field");
MainActivity.playerList.add(new objectClass(field));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return "Complete";
}
protected void onPostExecute(String result) {
if (result.equals("Complete")) {
mProgressDialog.dismiss();
}
}
}
确保包括在清单上网权限。 如果您有任何问题,请随时提出有关我的代码的更多问题。
我不知道你在阅读什么样的教程,但对于Android应用程序来与数据库交互,你应该使用RESTful服务。这些服务可以使用PHP,Java或其他编程语言构建。 – 2014-10-20 16:11:43
@LuiggiMendoza我在这两方面都实现了搜索--REST for PHP和RESTLET for JAVA ...但是,我非常喜欢客户端 - 服务器应用程序。我不知道我们如何使用JDBC和RESTLET webservices。 – xyz 2014-10-20 16:13:51
你应该专注于一件事。搜索关于如何使用Java构建RESTful服务的简单教程,可能使用Tomcat或Jetty。然后,当你发现这个RESTful服务由一个类和一个方法支持后,你可能会注意到你可以在这个类/方法中使用JDBC并发展你的服务的目的。然后,这可能演变成分层架构并继续演变。更重要的是:你会在练习这些东西的时候学习。 – 2014-10-20 16:15:44