兜兜零元 发表于 2024-8-14 15:34:03

【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包驱动版本如图所示:
https://img-blog.csdnimg.cn/direct/377a15d842764d37950c720ceff7a379.png
亲测可用,这个版本很好用,我的本地数据库是8.0的版本,也是可以正常毗连的。
SELECT VERSION(); https://img-blog.csdnimg.cn/direct/a101abc3f54a486598c1afb9baec72e0.png
这里采用的是单例模式,全程只会获取一次毗连,避免不必要的开销, 
工具类完整代码:
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这个方法的,这里就不贴出来了。
https://img-blog.csdnimg.cn/direct/ec066ea2f12048ff986af9c4a1b48227.png
1.5、开启外网访问权限

找到AndroidManifest.xml文件,添加如下两行代码。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  https://img-blog.csdnimg.cn/direct/0f13010abe144669b1fdfcf9054d9f79.png
到这里就可以了。 
二、踩坑记录

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

题目详情:
   Could not create connection to database server
如图所示:
https://img-blog.csdnimg.cn/direct/ba6c8addd6024db6ad7b2996046018ce.png
办理办法:
第一种情况:是由于的ip地址写的是localhost了,应该是本机的IPV4地址。
第二种情况:是你的jar包驱动和MySQL版本不匹配,这里我推荐的稳定版本是:5.1.49的驱动jar包,既可以毗连MySQL8.0也可以毗连MySQL5.0版本的。
第三种情况:你的有关数据库的毗连操纵必须在线程当中实现。
这三个题目自己一个个排查过去,大部分都是以上三种缘故原由。
2.2、报错二

题目详情:
   Access denied for user 'root'@'HTT' (using password: YES)
办理办法:
账号暗码检查过了都是对的,就是毗连不上,后来才发现是由于没有开启远程访问的权限,如图所示:
https://img-blog.csdnimg.cn/direct/e00df003a68344f1bbddef64636a7e9b.png
依次输入如下三行下令:
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[,nativeLibraryDirectories=]
        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数据的完整分享,盼望对大家有资助,如果写的有题目或者有遗漏的欢迎在评论区补充。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Android Studio】精确毗连MySQL数据库以及常见题目汇总(亲测可用)