关注

【Android Studio】正确连接MySQL数据库以及常见问题汇总(亲测可用)

前言:在最近学习安卓开发的过程中,需要连接MySQL数据库,这里面遇到了很多问题,也翻阅了网上大量资料,都层次不齐,有的还存在问题,于是我这里完整的记录一下我是如何正确连接MySQL数据库并记录一下自己踩过的坑,真的耗费了我很多时间,希望对大家有帮助。

目录

一、正确连接MySQL数据库

1.1、JDBC工具类

1.2、UserDao层

1.3、自定义事件

1.4、项目结构

1.5、开启外网访问权限

二、踩坑记录

2.1、报错一 

2.2、报错二

2.3、报错三

2.4、报错四

三、总结


一、正确连接MySQL数据库

代码都是博主亲自测试无误后写的,里面的坑我都替大家踩完了,大家可以放心参考。

1.1、JDBC工具类

jar包驱动版本如图所示:

亲测可用,这个版本很好用,我的本地数据库是8.0的版本,也是可以正常连接的。

 SELECT VERSION();

这里采用的是单例模式,全程只会获取一次连接,避免不必要的开销。

工具类完整代码:

package com.example.studentsystem.utils;

import java.sql.Connection;
import java.sql.DriverManager;


public class JDBCUtil {

    private static JDBCUtil jdbcUtil;
    private Connection connection;

    private JDBCUtil() {

    }

    public static JDBCUtil getInstance() {
        if(jdbcUtil == null) {
            jdbcUtil = new JDBCUtil();
        }
        return jdbcUtil;
    }

    public Connection getConnection() throws Exception {
        if(connection == null) {
            //1、装载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义连接url
            String url="jdbc:mysql://ip地址:3306/数据库名称?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
            //3.定义账号和密码
            String username="账号";
            String password="密码";
            //4.获得连接对象
            connection = DriverManager.getConnection(url, username, password);
        }
        return connection;

    }
}

注:这里的ip地址需要自己打开cmd窗口,使用ipconfig命令获取本机的IPV4地址,不能用localhost!!!

1.2、UserDao层

这里简单的展示一下我是如何连接数据库进行查询操作的。

完整代码:

package com.example.studentsystem.dao;

import android.util.Log;

import com.example.studentsystem.utils.JDBCUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDao {

    public void test(){
        try {
            Connection connection = JDBCUtil.getInstance().getConnection();
            String sql = "select * from sys_user";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                int userId = resultSet.getInt("user_id");
                String usr = resultSet.getString("username");
                String pwd = resultSet.getString("password");
                String role = resultSet.getString("role");
                // 处理每一行数据,您可以根据需求进行相应的操作
                System.out.println("user: " + userId);
                System.out.println("username: " + usr);
                System.out.println("password: " + pwd);
                System.out.println("role: " + role);
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            System.out.println(e);
            Log.e("jdbc",e.getMessage());
        }
    }
}

1.3、自定义事件

这里需要自己自定义一个点击事件进行测试,因为数据库连接需要耗费一定时间,所以需要一定要放在线程当中去处理,否则会报错。

完整代码:

package com.example.studentsystem;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

import com.example.studentsystem.dao.UserDao;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    
    
    public void login(View view){
        new Thread(){
            @Override
            public void run() {
                UserDao userDao = new UserDao();
                userDao.test();
            }
        }.start();
    }
}

1.4、项目结构

我是这样建包的,大家可以参考一下,activity_main.xml主页面加了个按钮,去触发login这个方法的,这里就不贴出来了。

1.5、开启外网访问权限

找到AndroidManifest.xml文件,添加如下两行代码。

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

 

到这里就可以了。 

二、踩坑记录

这里我给大家整理了几种常见的报错,以及我的解决方案,仅供参考。

2.1、报错一 

问题详情:

Could not create connection to database server

如图所示:

解决办法:

第一种情况:是因为的ip地址写的是localhost了,应该是本机的IPV4地址。

第二种情况:是你的jar包驱动和MySQL版本不匹配,这里我推荐的稳定版本是:5.1.49的驱动jar包,既可以连接MySQL8.0也可以连接MySQL5.0版本的。

第三种情况:你的有关数据库的连接操作必须在线程当中实现。

这三个问题自己一个个排查过去,大部分都是以上三种原因。

2.2、报错二

问题详情:

Access denied for user 'root'@'HTT' (using password: YES)

解决办法:

账号密码检查过了都是对的,就是连接不上,后来才发现是因为没有开启远程访问的权限,如图所示:

依次输入如下三行命令:

use mysql
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;

执行完以后,就连接上了。

2.3、报错三

问题详情:

 E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.example.studentsystem, PID: 10636
    java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType;
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1170)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:447)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:218)
        at com.example.studentsystem.utils.JDBCUtil.getConnection(JDBCUtil.java:33)
        at com.example.studentsystem.dao.UserDao.test(UserDao.java:15)
        at com.example.studentsystem.MainActivity$1.run(MainActivity.java:25)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "java.sql.SQLType" on path: DexPathList[[dex file "/data/data/com.example.studentsystem/code_cache/.overlay/base.apk/classes4.dex", zip file "/data/app/~~43pk1avwKCpcsqDTUZz4XA==/com.example.studentsystem-57z9E8XIRruRPRJVm4fHhg==/base.apk"],nativeLibraryDirectories=[/data/app/~~43pk1avwKCpcsqDTUZz4XA==/com.example.studentsystem-57z9E8XIRruRPRJVm4fHhg==/lib/x86_64, /system/lib64, /system_ext/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1170) 
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:447) 
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) 
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) 
        at java.sql.DriverManager.getConnection(DriverManager.java:580) 
        at java.sql.DriverManager.getConnection(DriverManager.java:218) 
        at com.example.studentsystem.utils.JDBCUtil.getConnection(JDBCUtil.java:33) 
        at com.example.studentsystem.dao.UserDao.test(UserDao.java:15) 
        at com.example.studentsystem.MainActivity$1.run(MainActivity.java:25) 

解决办法: 

还是因为jar包驱动的问题,我这里用了8.0版本的驱动jar包,报的这个错误,后来换了5.1.49的驱动jar包就好了。

2.4、报错四

问题详情:

Public Key Retrieval is not allowed

解决办法:

在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数。 

三、总结

以上就是关于我如何连接MySQL数据的完整分享,希望对大家有帮助,如果写的有问题或者有遗漏的欢迎在评论区补充。

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/HJW_233/article/details/140142807

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--