我们可以用jdbc连接android中的远程mysql数据库吗?

gblwokeq  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(416)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

6年前关门了。
改进这个问题
我正在开发一个需要远程数据库连接的客户机-服务器应用程序。
我知道网上的教程和更多的人正在使用php与mysql进行交互。但是,我并不擅长php,我以前的经验是使用corejava、swing和jdbc。
在android应用程序中,是否可以使用javajdbcapis连接远程mysql数据库?

zf9nrax1

zf9nrax11#

可以这样做,但不建议这样做。我以前做过,因为我和你在同一条船上,所以我将分享一些代码。
我专门使用了这个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();
        }
    }
}

请确保在清单中包含internet权限。如果您有任何问题,请随时询问有关我的代码的更多问题。

j13ufse2

j13ufse22#

你不能从android本地访问mysql数据库。编辑:实际上您可能可以使用jdbc,但不建议使用它(或者可能不起作用?)。。。请参见android jdbc不工作:驱动程序上的classnotfoundexception
看见
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
对于大多数[好的]用户来说,这可能没问题。但是想象一下你有一个黑客控制了你的程序。我已经反编译了我自己的应用程序和它可怕的我所看到的。如果他们把你的用户名/密码输入你的数据库并造成严重破坏怎么办?糟糕。

9jyewag0

9jyewag03#

基本上:您可以连接到mysql(或任何您使用的)服务器,但不应该直接从android应用程序进行连接。
原因:
android应用程序可以反编译,客户端将拥有访问您的数据库的凭据。如果使用正确的黑客工具,如回溯,那么这个恶意客户端可以访问,连接和利用数据库中的数据。
如果您的应用程序适用于世界各地的客户机,那么客户机应该为每个操作或一组操作打开并维护到数据库的连接。打开物理数据库连接需要很多时间,即使您的pc客户端位于数据库引擎服务器旁边的lan中。现在,想象一下从世界另一端的一个国家(如中国或日本)或从南美的一个国家(如巴西或秘鲁)(我居住的地方)开通连接。
出于这两个原因,我可以想出,这是一个坏主意,甚至试图连接到mysql或任何其他数据库引擎直接从您的手机设备。
如何解决这个问题?使用面向服务的体系结构,其中至少有两个应用程序:
服务提供商应用程序。这个应用程序将创建和发布web服务(最好是restful),并且可以建立策略来使用web服务,比如用户身份验证和授权。此应用程序还将连接到数据库并对其执行crud操作。
服务使用者应用程序。这将是您的android(或任何其他移动)应用程序。
从你的问题来看,你把重点放在了第一点上。正如我在评论中所说的,您可以用java创建一个web应用程序,在那里创建一个restful服务,它可以归结为一个pojo(纯旧java对象),每个服务都有一个方法。在这个方法中,因为它毕竟是纯java,所以可以添加其他功能,比如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's或vogella's之类的教程中查看javaweb应用程序的进一步配置(这个答案中的信息太多了)。
注意,这样这个应用程序就可以发展成一个分层的应用程序,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服务,它只关心使用这些服务,并且可以使用来自这些服务的数据。

相关问题