【Android Studio】精确毗连MySQL数据库以及常见题目汇总(亲测可用) ...

打印 上一主题 下一主题

主题 543|帖子 543|积分 1629

前言:在迩来学习安卓开发的过程中,需要毗连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的版本,也是可以正常毗连的。
  1. SELECT VERSION();
复制代码

这里采用的是单例模式,全程只会获取一次毗连,避免不必要的开销, 
工具类完整代码:
  1. package com.example.studentsystem.utils;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. public class JDBCUtil {
  5.     private static JDBCUtil jdbcUtil;
  6.     private Connection connection;
  7.     private JDBCUtil() {
  8.     }
  9.     public static JDBCUtil getInstance() {
  10.         if(jdbcUtil == null) {
  11.             jdbcUtil = new JDBCUtil();
  12.         }
  13.         return jdbcUtil;
  14.     }
  15.     public Connection getConnection() throws Exception {
  16.         if(connection == null) {
  17.             //1、装载驱动
  18.             Class.forName("com.mysql.jdbc.Driver");
  19.             //2.定义连接url
  20.             String url="jdbc:mysql://ip地址:3306/数据库名称?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
  21.             //3.定义账号和密码
  22.             String username="账号";
  23.             String password="密码";
  24.             //4.获得连接对象
  25.             connection = DriverManager.getConnection(url, username, password);
  26.         }
  27.         return connection;
  28.     }
  29. }
复制代码
注:这里的ip地址需要自己打开cmd窗口,使用ipconfig下令获取本机的IPV4地址,不能用localhost!!!
1.2、UserDao层

这里简单的展示一下我是怎样毗连数据库举行查询操纵的。
完整代码:
  1. package com.example.studentsystem.dao;
  2. import android.util.Log;
  3. import com.example.studentsystem.utils.JDBCUtil;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. public class UserDao {
  8.     public void test(){
  9.         try {
  10.             Connection connection = JDBCUtil.getInstance().getConnection();
  11.             String sql = "select * from sys_user";
  12.             PreparedStatement preparedStatement = connection.prepareStatement(sql);
  13.             ResultSet resultSet = preparedStatement.executeQuery();
  14.             while (resultSet.next()) {
  15.                 int userId = resultSet.getInt("user_id");
  16.                 String usr = resultSet.getString("username");
  17.                 String pwd = resultSet.getString("password");
  18.                 String role = resultSet.getString("role");
  19.                 // 处理每一行数据,您可以根据需求进行相应的操作
  20.                 System.out.println("user: " + userId);
  21.                 System.out.println("username: " + usr);
  22.                 System.out.println("password: " + pwd);
  23.                 System.out.println("role: " + role);
  24.             }
  25.             resultSet.close();
  26.             preparedStatement.close();
  27.         } catch (Exception e) {
  28.             System.out.println(e);
  29.             Log.e("jdbc",e.getMessage());
  30.         }
  31.     }
  32. }
复制代码
1.3、自界说事件

这里需要自己自界说一个点击事件举行测试,由于数据库毗连需要耗费肯定时间,所以需要肯定要放在线程当中去处理,否则会报错。
完整代码:
  1. package com.example.studentsystem;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import com.example.studentsystem.dao.UserDao;
  6. public class MainActivity extends AppCompatActivity {
  7.     @Override
  8.     protected void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         setContentView(R.layout.activity_main);
  11.     }
  12.    
  13.    
  14.     public void login(View view){
  15.         new Thread(){
  16.             @Override
  17.             public void run() {
  18.                 UserDao userDao = new UserDao();
  19.                 userDao.test();
  20.             }
  21.         }.start();
  22.     }
  23. }
复制代码
1.4、项目结构

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

1.5、开启外网访问权限

找到AndroidManifest.xml文件,添加如下两行代码。
  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <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)
  办理办法:
账号暗码检查过了都是对的,就是毗连不上,后来才发现是由于没有开启远程访问的权限,如图所示:

依次输入如下三行下令:
  1. use mysql
复制代码
  1. update user set host = '%' where user = 'root';
复制代码
  1. 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数据的完整分享,盼望对大家有资助,如果写的有题目或者有遗漏的欢迎在评论区补充。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表