我们能在Android中使用JDBC连接远程MySQL数据库吗?
在Android应用中,我们可以连接到MySQL(或其他数据库)服务器,但不应该直接从Android应用程序中进行连接。这样做的原因主要有两个:
- Android应用程序可以被反编译,客户端将获得访问数据库的凭据。使用像Backtrack这样的黑客工具,恶意客户端可以访问、连接和利用数据库中的数据。
- 如果你的应用程序面向全球客户,那么客户端应该在每个操作或一组操作中打开和维护与你的数据库的连接。即使你的PC客户端在与数据库引擎服务器相邻的局域网中,打开物理数据库连接也需要很多时间。现在,想象一下从世界的另一边(比如中国或日本)或者像我住的南美国家巴西或秘鲁这样的国家打开连接。
因为以上两个原因,尝试直接从手机设备连接到MySQL或任何其他数据库引擎都是一个坏主意。
那么如何解决这个问题呢?使用面向服务的架构,至少需要两个应用程序:
- 服务提供者应用程序。该应用程序将创建和发布Web服务(最好是RESTful),并可以建立消费Web服务的策略,如用户身份验证和授权。该应用程序还将连接到数据库并执行CRUD操作。
- 服务消费者应用程序。这将是你的Android(或其他移动)应用程序。
从你的问题来看,你关注的是第一点。正如我在评论中所说,你可以在Java中创建一个Web应用程序,创建一个RESTful服务,它实际上是一个每个服务都有一个方法的POJO(普通的Java对象)。在这个方法中,由于它始终是普通的Java,你可以添加其他功能,如JDBC的使用。
这是一个使用Jersey、Jackson(JSON库)和JDBC的示例代码:
("/product") public class ProductRestService { ("/list") (MediaType.APPLICATION_JSON) public List<Product> getProducts() { List<Product> productList = new ArrayList<>(); Connection con = ...; //获取数据库连接 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); } //关闭资源 rs.close(); stmt.close(); conn.close(); return productList; } }
你可以在像mkyong的或Vogella的这样的教程中查看Java Web应用程序的进一步配置(放在这个答案中的信息太多了)。
请注意,然后这个应用程序可以发展成为一个分层应用程序,JDBC代码将放在一个DAO类中,然后ProductRestService
类将通过这个DAO类访问数据库。这是另一个示例代码:
public class ProductDao { public List<Product> getProducts() { List<Product> productList = new ArrayList<>(); Connection con = ...; //获取数据库连接 //其他代码与上面解释的相同... return productList; } } ("/product") public class ProductRestService { ("/list") (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服务的技术是什么,它只关心如何消费这些服务以及是否可以使用它们的数据。
你能推荐一篇有关使用Jersey Web服务连接Android应用程序到MySQL数据库的好文章吗?
在我的SEO搜索中,我找到了这篇文章:programmerguru.com/android-tutorial/…。该教程中调用外部Web服务的方法是invokeWS
。我不支持该教程。
Web服务不可能受到DDoS攻击吗?即使它能保护密码,但我是否仍然需要OAuth或其他层面的保护?我倾向于使用MySQL存储过程而不是Web服务。这样我就可以使用他们的IP地址来限制使用和处理不良行为。是的,IP地址可以伪造,但在使用PHP中间件解决方案进行了10年的斗争之后,我更倾向于使用MySQL存储过程...
任何通过Web提供的服务都可能受到DDoS或其他任何技术的攻击。只需将设备连接到WAN等访问点,然后使用嗅探器查看网络流量,你将看到你的设备正在调用的服务器,即使是通过IP,然后对该服务器进行DDoS攻击,无论其中有什么。使用MySQL存储过程不会改变这个事实。
可以在Android中使用JDBC连接远程MySQL数据库吗?
Android无法直接访问MySQL数据库。实际上,您可能可以使用JDBC,但不建议使用(或可能无法正常工作)。可以参考Android JDBC not working: ClassNotFoundException on driver。
Android无法直接连接数据库服务器,因此需要创建一个简单的Web服务来传递请求到数据库并返回响应。可以参考http://www.helloandroid.com/tutorials/connecting-mysql-database和http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html。
对于大多数用户来说,这可能是可以接受的。但是,想象一下如果黑客入侵了您的程序会发生什么。我曾经对自己的应用程序进行过反编译,看到的情况让人害怕。如果他们获取了您的数据库用户名/密码,可能会造成严重后果。因此,不建议直接在Android中连接MySQL数据库。
正如我在对您的问题的评论中所指出的那样,PHP并不是必需的,这就是教程向您解释的内容。RESTful服务可以使用PHP、Java、Python、Ruby、C#或任何其他支持创建一组RESTful服务的编程语言来编写。Web服务客户端(在本案例中是您的Android应用程序)与创建Web服务的技术无关。
如果我使用PHP进行开发,PHP在这里的作用是什么?
我们可以在Android中使用JDBC连接远程MySQL数据库吗?
这个问题的出现是因为有人想要在Android应用中连接远程的MySQL数据库。下面是连接远程MySQL数据库的代码示例:
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 ListobjList; 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 { 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 (); 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权限。
以上就是连接远程MySQL数据库的代码示例,如果有任何问题,请随时提问。