我们可以使用JDBC在Android中连接远程MySQL数据库吗?
我正在开发一个需要远程数据库连接的客户端服务器应用程序。
我知道网上的教程和更多的人正在使用PHP来与MySQL进行交互。 但是,我并不擅长PHP,而我以前的经验是使用Core Java,Swing和JDBC。
任何人都可以指导我,如果有可能连接远程MySQL数据库使用JAVA JDBC API在Android应用程序?
基本上:你可以连接到你的MySQL(或任何你使用的)服务器,但是你不应该直接从你的Android应用程序中这样做。
原因:
-
Android应用程序可以被反编译,客户端将拥有访问数据库的凭据。 如果使用Backtrack等正确的黑客工具,那么这个恶意客户端可以访问,连接和利用数据库中的数据。
-
如果您的应用程序适用于全球的客户端,则客户端应该打开并维护每个操作或一组操作的数据库连接。 即使您的PC客户端位于数据库引擎服务器旁边的LAN中,打开物理数据库连接也需要很长时间。 现在,想象一下,从世界另一端的国家,例如中国或日本,或从南美的一个国家,如巴西或秘鲁(我居住的地方)开始build立联系。
由于这两个原因我可以想出来,甚至试图直接从您的手机设备连接到MySQL或任何其他数据库引擎是一个坏主意。
如何解决这个问题? 使用面向服务的体系结构,至less有两个应用程序:
-
服务提供商申请。 此应用程序将创build和发布Web服务(最好是RESTful),并可能build立策略来使用Web服务,如用户身份validation和授权。 这个应用程序也将连接到数据库并对其执行CRUD操作。
-
服务消费者申请。 这将是您的Android(或任何其他移动)应用程序。
从你的问题来看,你关注的重点是1.正如我在评论中所说的,你可以用Java创build一个Web应用程序,在那里创build一个RESTful服务,归结为一个POJO(普通的旧Java对象)每个服务都有一个方法。 在这种方法中,因为它毕竟是纯Java,所以可以添加其他function,如JDBC使用。
这里有一个使用Jersey,Jackson(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或Vogella或其他任何类似的教程中查看Java Web应用程序的进一步configuration(这个答案太多了)。
请注意,这个应用程序可以发展成一个分层的应用程序,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或任何其他编程语言向您提供此技术。 再次,我不知道你正在阅读什么types的教程,但这应该在某处解释,并解释为了本教程的目的,您将使用PHP创build服务。 如果你觉得用Java编写这些服务比用PHP或其他语言编写这些服务更合适,那就没有问题了。 你的Android应用程序并不关心使用哪种技术来生成Web服务,它只关心使用这些服务,并且可以使用它们中的数据。
这是可能的,但不build议。 我之前做过,因为我和你在同一条船上,所以我会分享一些代码。
我特别使用了这个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://xxxx: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 } }
现在我的asynchronous任务:
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(); } } }
确保在清单中包含Internet权限。 如果您有任何问题,请随时提出有关我的代码的更多问题。
你不能从本地访问Android的MySQL数据库。 编辑:其实你可能能够使用JDBC,但它不被推荐(或可能无法正常工作?)…看到Android JDBC不工作:ClassNotFoundException驱动程序
看到
http://www.helloandroid.com/tutorials/connecting-mysql-database
Android无法直接连接到数据库服务器。 因此,我们需要创build一个简单的Web服务,将请求传递给数据库,并返回响应。
http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html
对于大多数[好]用户,这可能是好的。 但是想象一下,你会得到一个黑客来抓住你的程序。 我已经反编译了我自己的应用程序,以及我见过的可怕的东西。 如果他们把你的用户名/密码到你的数据库并造成严重破坏? 坏。