刚踩一个大坑,求个高人指点(已解决)

java出身,近期想做一些Android项目,就想先做个简单的crud小试牛刀,结果第一jio就踩坑了。

mysql用的8.0.27,jar包是官网Community配套下载的从Connector J 8.0.27,

安卓部署环境,工具用的AS,导入jar包正常,gradle正常

gradle添加java8依赖

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

 AndroidManifest添加网络权限

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

接下来就是测试链接了

mysql高版本Driver目录移动至"com.mysql.cj.jdbc.Driver"

private static final String TAG = "testsql----->";
    public static void mymysql(){
        String url = "jdbc:mysql://192.168.0.142:3306/test" +
                "?useUnicode=true" +
                "&characterEncoding=utf8" +
                "&useSSL=false" +
                "&serverTimezone=GMT" +
                "&rewriteBatchedStatements=true";
        String user = "root";
        String password = "123456";
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
        }catch(Exception e){
            Log.e(TAG, e.toString());
        }
        try {
            DriverManager.getConnection(url,user, password);
            Log.e(TAG, "已过");
        }catch(Exception e){
            Log.e(TAG, e.toString());
        }

 测试链接写好之后直接开冲。结果直接给了当头一棒

2022-01-11 10:42:10.197 22381-22381/com.example.test E/testsql----->: java.sql.SQLNonTransientConnectionException: Could not create connection to database server.

然后开始各种百度方案,像检查防火墙,检查驱动和数据库版本是否匹配,检查驱动地址正确,增加ssl配置,增加时区参数,各种重启服务等,均无果。今天早上就想,为什么不能问问神奇的Java呢?说干就干,直接在eclipse开了一个java的test工程,导入同样的版本mysql-connector-java-8.0.27,写了同样的代码。

public Connection getConnection() throws SQLException {
			String driver = "com.mysql.cj.jdbc.Driver";
			String url = "jdbc:mysql://192.168.0.142:3306/test" +
	                "?useUnicode=true" +
	                "&characterEncoding=utf8" +
	                "&useSSL=false" +
	                "&serverTimezone=GMT" +
	                "&rewriteBatchedStatements=true";
			String user = "root";
	        String password = "123456";
			try {
				Class.forName(driver);

			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}

			return DriverManager.getConnection(url, user, password);
		}

结果更是当头一棒。

public static void main(String[] args) {
		try {
			System.out.println(DbUtil.getInstance().getConnection());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

显示的结果竟然是

com.mysql.cj.jdbc.ConnectionImpl@59e84876

惊呆了,同样的jar包,同样的数据库,同样的url,nusername,password,在java工程就能连,在android工程就连不上,头发快掉光了也没查到有效的解决方案,希望大家帮帮小弟在编程的道路上能茁壮成长~

该问题已解决!

解决方案其实是java思路向Android思路的转变,在Android程序中有一条规则,就是任何拖慢主程序的程序都会被干掉。重新梳理了一遍丢出来的Exception,里面有一条

W/System.err: Caused by: java.net.SocketException: android.os.NetworkOnMainThreadException

如果大家也有相关问题可以仔细查看下是否也出现了这个异常,如果也有,则可以参考本文解决方案。

所以有关连接数据库的部分需要单开一个线程,修改后代码如下

public static void mymysql() {
        String url = "jdbc:mysql://192.168.0.142:3306/test"
                + "?useUnicode=true"
                + "&characterEncoding=utf8"
                + "&autoReconnect=true"
                + "&useSSL=false"
                + "&serverTimezone=GMT";
        String user = "root";
        String password = "123456";
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    dbCon.conn = DriverManager.getConnection(url,user, password);
                    String sql = "select * from testdb where 1=1 ";
                    stmt = conn.prepareStatement(sql);
                    rs = stmt.executeQuery();
                    ResultSetMetaData rsmd = rs.getMetaData();
                    int columnCount = rsmd.getColumnCount();
                    while (rs.next()) {
                        for (int i = 1; i <= columnCount; i++) {
                            Log.e(rsmd.getColumnLabel(i)+"------------>", rs.getObject(i).toString());
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    dbCon.disconnect();
                }
            }
        }).start();
    }

效果显示

至此,mysql的连接查询已无问题,crud也就迎刃而解了,下一篇将会记录查询后的结果显示至Activity的TextView中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值