android使用jdbc连接mysql问题

android使用jdbc连接mysql问题

起初使用java程序连接过mysql,以为安卓开发中也一样,实际遇到了很多问题。
建议检查以下几个问题:
1.数据库是否可以远程访问
2.驱动版本(建议下载较低的版本)
3.安卓网络权限设置
4.url格式
5.访问网络需要在子线程中进行,不允许在主线程中直接进行连接
6.防火墙

代码

DBOpenHelper

package com.hometeacher.data;
import java.sql.*;
public class DBOpenHelper {

    private static String driver = "com.mysql.jdbc.Driver";//MySQL 驱动
    private static String url ="jdbc:mysql://192.168.80.18:3306/hometeach?serverTimezone=UTC&useSSL=false";
    private static String user = "root";//用户名
    private static String password = "123456";//密码
    private static Connection conn = null;

    /**
     * 连接数据库
     * */

    public static Connection getConn(){
        if(conn != null)
            return conn;

        //Connection接口代表Java程序和数据库的连接对象,只有获得该连接对象后,才能访问数据库,并操作数据表
        try {
            Class.forName("com.mysql.jdbc.Driver");//加载MySQL数据库驱动
        }catch(java.lang.ClassNotFoundException e) {//如果找不到这个类,执行下面的异常处理
            System.out.println("驱动程序配置未配置成功!!!");
        }
        try {
            conn= (Connection) DriverManager.getConnection(url,user,password);//建立和数据库的连接,并返回表示连接的Connection对象
            System.out.println("数据库连接成功!!!");
        }catch(Exception e) {//未连接成功,执行下面的异常处理
            System.out.println("数据库连接失败!!!");
        }
        return conn;
    }

    /**
     * 关闭数据库
     * */

    public static void closeAll(Connection conn, PreparedStatement ps){
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 关闭数据库
     * */

    public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs){
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

1 数据库是否可以远程访问

参考链接

2 驱动版本

mysql版本为8.0.24,下载驱动mysql-connector-java-8.0.25,java程序中进行本地连接可以进行。android不行,抛出异常:
com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

降低版本,使用mysql-connector-java-5.1.46可以建立连接降低版本后修改driver="com.mysql.jdbc.Driver";

遇到java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType 也可考虑降低版本。

3 网络权限

在AndroidManifest.xml添加

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

4 url格式

serverTimezone=UTC&useSSL=false是必要的,主要错在了ip地址。
端口号为3306,ip地址在cmd中输入ipconfig显示结果找到Ipv4,起初错填了以太网适配器 vEthernet (Default Switch)的ipv4导致一直无法连接。局域网ip可能改变,公网ip可不用检查
在这里插入图片描述

5 新建线程访问

    public static void Update(String property,int i,String date){
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                conn = DBOpenHelper.getConn();
                String sql1 = "update history set " + property + " = ? where date = ?;";
                try {
                    ps = (PreparedStatement) conn.prepareStatement(sql1);
                    ps.setString(1, String.valueOf(i));
                    ps.setString(2, getDateString());
                    ps.executeUpdate();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }});
        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

6 防火墙

关闭防火墙,或者添加设置开放端口。

最终困扰了几天的问题终于解决了,最终可以连接mysql并记录数据
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值