2014-10-20 180 views
4

我正在开发一个需要远程数据库连接的客户端 - 服务器应用程序。我们可以使用JDBC在Android中连接远程MySQL数据库吗?

我知道,网络和更多的人教程是使用PHP与MySQL进行交互。但是,我并不擅长PHP,而我以前的经验是使用Core Java,Swing和JDBC。

任何人都可以指导我,如果有可能在Android应用程序使用JAVA JDBC API连接远程MySQL数据库?

+1

我不知道你在阅读什么样的教程,但对于Android应用程序来与数据库交互,你应该使用RESTful服务。这些服务可以使用PHP,Java或其他编程语言构建。 – 2014-10-20 16:11:43

+0

@LuiggiMendoza我在这两方面都实现了搜索--REST for PHP和RESTLET for JAVA ...但是,我非常喜欢客户端 - 服务器应用程序。我不知道我们如何使用JDBC和RESTLET webservices。 – xyz 2014-10-20 16:13:51

+3

你应该专注于一件事。搜索关于如何使用Java构建RESTful服务的简单教程,可能使用Tomcat或Jetty。然后,当你发现这个RESTful服务由一个类和一个方法支持后,你可能会注意到你可以在这个类/方法中使用JDBC并发展你的服务的目的。然后,这可能演变成分层架构并继续演变。更重要的是:你会在练习这些东西的时候学习。 – 2014-10-20 16:15:44

回答

21

基本上:您可以连接到您的MySQL(或任何您使用的服务器),但你不应该直接从你的Android应用程序做到这一点。

原因:

  1. Android应用程序可以反编译,并在客户端将有凭据来访问你的数据库。如果使用诸如Backtrack这类正确的黑客工具,那么这个恶意客户端可以访问,连接和利用数据库中的数据。

  2. 如果您的应用程序,为客户在世界各地,那么客户应该打开并保持每个操作数据库的连接或一组操作。即使您的PC客户端位于数据库引擎服务器旁边的LAN中,打开物理数据库连接也需要很长时间。现在,想象一下从世界另一端的国家打开一个连接,例如中国或日本,或来自南美洲的国家,如巴西或秘鲁(我住的地方)。

出于这些原因有二,我可以拿出,它甚至还试图连接到MySQL或任何其他数据库直接从手机设备的发动机是一个坏主意。

如何解决这个问题?使用面向服务的体系结构,您将至少有两个应用程序:

  1. 服务提供商应用程序。此应用程序将创建和发布Web服务(最好是RESTful),并可能建立策略以使用Web服务,如用户身份验证和授权。此应用程序也将连接到数据库并对其执行CRUD操作。

  2. 服务消费者应用程序。这将是您的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'sVogella'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服务,它只会关心使用这些服务,并且可以使用这些服务中的数据。

+0

你能提出任何关于使用泽西网络服务将Android应用程序连接到MySQL数据库的好文章吗? – 2014-12-09 14:54:32

+1

@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

+0

不能一个web服务被ddos攻击,所以它是如何完美的?是的,它可以保护pw,但是我不需要oauth或另一层悲伤?我倾向于使用mysql-procedures而不是webservice。这样我可以使用他们的IP地址来节制使用,不良行为。是的,IP是可以伪造的,但是在与php中介解决方案作战10年后,我倾向于使用mysql程序。 – jim 2017-01-02 16:08:27

2

无法从Android的访问MySQL数据库本身。编辑:其实你可以使用JDBC,但不建议(或可能无法正常工作?)......看到Android JDBC not working: ClassNotFoundException on driver

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无法直接连接到数据库服务器。因此,我们 需要创建一个简单的Web服务,将通过请求到 数据库,将返回响应。

http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html

对于大多数[好]的用户,这可能是罚款。但是想象一下,你会得到一个黑客来抓住你的程序。我已经对自己的应用程序进行了反编译,并且惊吓了我所看到的内容。如果他们将您的用户名/密码发送到您的数据库并造成严重破坏,该怎么办?坏。

+0

@xyz正如我在你对我的问题的评论中指出的那样,PHP不是必需的,这就是本教程向你解释的内容。 RESTful服务可以用PHP,Java,Python,Ruby,C#或任何其他支持创建一组RESTful服务的编程语言编写。 Web服务客户端(在这种情况下,即您的Android应用程序)与创建Web服务的技术无关。 – 2014-10-20 16:34:02

+0

@LuiggiMendoza你能说我在这里做什么PHP吗? (如果我用PHP开发的) – xyz 2014-10-20 16:36:26

7

这是可以做到的,但不建议使用。我之前做过,因为我和你在同一条船上,所以我会分享一些代码。

我用特别这个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(); 
     } 
    } 
} 

确保包括在清单上网权限。 如果您有任何问题,请随时提出有关我的代码的更多问题。

相关问题