如何使 MySQL Connector/J 在 android 上工作?

Posted

技术标签:

【中文标题】如何使 MySQL Connector/J 在 android 上工作?【英文标题】:How to make MySQL Connector/J working on android? 【发布时间】:2014-09-22 13:44:09 【问题描述】:

我有一个 mysql 服务器在本地 Linux 机器上运行。我没有遇到任何问题,通过一个简单的 Java 程序(在 eclipse 中运行)使用 MySQL Connector/J 与它通信和执行 SQL 语句。 这是我的简单 Java 程序:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.lang.*;


public class main
    private static void request()
        String url = "jdbc:mysql://myadress:3306/mydatabase";
        String user = "user";
        String passwd = "passwd";

        Connection conn = null;
        try
            /* Initializing the connection */
            conn = DriverManager.getConnection(url, user, passwd);

            Statement statement = conn.createStatement();

            ResultSet resultset = statement.executeQuery(/* MY SQL reqquest */);

            while(resultset.next())
                System.out.println(resultset.getString(/* THE COLUMN AND ROW I WANTED IN MY REQUEST */));       
            

        catch(SQLException e)
            System.out.println("SQL connection error: " + e.getMessage());
        finally 
            if(conn != null)
                try
                    /* CLosing connection */
                    conn.close();
                catch (SQLException e)
                    System.out.println("Error while closing the connection: " + e.getMessage());
                
            
        
    
    public static void main(String[] args) 
        try // Loading the MySQL Connector/J driver
            Class.forName("com.mysql.jdbc.Driver");
        catch(ClassNotFoundException e)
            System.out.println("Error while loading the Driver: " + e.getMessage());
        
        request();
    


此代码在 Eclipse 中完美运行,并且可以毫无问题地执行与 UPDATE SQL 请求一样多的 SELECT。 当我尝试将此请求方法调整到我的 MainActivity.java 类时,我的 android 应用程序确实正确加载了驱动程序,但无法与我的 MySQL 服务器通信并返回错误。

如果我在前面的代码中输入本地 IP 地址到我的服务器并将我的 android 手机连接到 Wi-Fi,那么我的应用程序会返回我:

"通信链路故障。最后一个数据包成功发送到 服务器是 0 毫秒前。驱动程序没有收到任何数据包 来自服务器。”

但是,如果我尝试在之前的代码中向我的服务器输入一个外部 IP 地址(不要担心 MySQL 端口对互联网开放并且我的服务器正在侦听任何 IP),请使用我的 android 手机通过LTE 互联网连接,我收到另一个错误:

“无法创建与数据库服务器的连接”

到目前为止,我的研究都没有帮助我。有谁知道我的问题可能来自哪里? 在此先感谢:)

【问题讨论】:

【参考方案1】:

在转向 Android 世界的 Java 开发人员中普遍存在的误解是,为老式 Java 创建的所有内容也可以在 Android 上使用。由于 Android 对 Java 的使用违反了 Java 的主要原则,“一次编写,到处运行”,这根本不是真的。我见过有人尝试在 Android 中使用常见的 Apache jar,这导致了奇怪的错误(请参阅 Can't import Apache HTTP in Eclipse)。

Java JDBC 驱动程序和 API 似乎也存在同样的问题,例如在这里查看答案:Connecting to MySQL from Android with JDBC

常见的建议 - 每次尝试在 Android 上使用 3rd 方 JAR 时,请检查它是否与后者兼容,或者是否有特定于 Android 的端口。

【讨论】:

感谢您花时间回答。看来我将不得不使用 php 脚本作为接口。【参考方案2】:

通常,推荐的方法是发布到 Web 服务,并允许 Web 服务对数据库执行所需的操作。但是,GitHub 上有一个开源库,它允许您直接连接到数据库服务器,而无需 Web 服务。

该库是相当新的,并且已经针对 MySQL 5.1 -> 5.7 进行了测试,这也应该与 MariaDB 的等效 MySQL 版本兼容。

免责声明:我写的。

【讨论】:

【参考方案3】:

如果您使用正确的连接器,这是可能的。 我使用连接器 3.0.17,在其他一些示例中,连接器是 mysql-connector-java-5.1.24-bin.jar

    只需下载正确的连接器。 libs 上的 connector-java.x.x.x-bin.jar 过去

    导入java.sql

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    

    使用下一种方法连接

    public void conectarBDMySQL (String user, String password, 
                String ip, String port, String cat)
        
            if (conexionMySQL == null)      
            
                String urlConexionMySQL = "";
                if (cat!= "")
                    urlConexionMySQL = "jdbc:mysql://" + ip + ":" + port+ "/" + cat;
                else
                    urlConexionMySQL = "jdbc:mysql://" + ip + ":" + port;
                if (user!= "" & password!= "" & ip != "" & port!= "")
                
                    try 
                    
                        Class.forName("com.mysql.jdbc.Driver");
                        conexionMySQL = DriverManager.getConnection(urlConexionMySQL, 
                                user, password);                    
                     
                    catch (ClassNotFoundException e) 
                    
                          Toast.makeText(getApplicationContext(),
                                    "Error: " + e.getMessage(),
                                    Toast.LENGTH_SHORT).show();
                     
                    catch (SQLException e) 
                    
                          Toast.makeText(getApplicationContext(),
                                    "Error: " + e.getMessage(),
                                    Toast.LENGTH_SHORT).show();
                    
                
            
        
    

它非常适合我,我没有遇到任何问题!!!

【讨论】:

以上是关于如何使 MySQL Connector/J 在 android 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

MySQL------如何安装mysql-connector-java-5.1.38.zip

在 Windows 7 中设置路径 Connector/J

在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入

Java连接MySQL数据库

手把手教你JAVA如何连接MYSQL-mysql-connector-j-8.0.32.jar