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并记录数据