Android Studio连接MySQL8.0

【序言】

        移动平台这个课程要做一个app的课设,我打算后期增加功能改成毕设,就想要使用MySQL来作为数据库,相对于SQLlite来说,我更熟悉MySQL一点。

【遇到的问题】

        一直无法连接上数据库,开始的时候查了很多资料,说是MySQL8.0版本比较高,密码验证插件是caching_sha2_password,Android Studio中的JDBC驱动可能不支持这种加密方式。(但我并不确定是否是这个原因,就是一直连不上)

我最开始用的是下面的代码(连接数据库):

    private static final String  TAG="DBUtils";//    用于日志打印
    private static Connection conn=null;//    定义连接变量conn
    //数据库连接函数
    public static Connection getConnection(String dbname) {//定义connection类函数,需要返回一个connection对象,即在上面定义的conn

        String ip = "192.168.0.146";//ip地址,win+R,输入cmd打开控制台,输入ipconfig /all查看本机ipv4地址,最上面那个
        int port = 3306;//MySQL安装时的默认端口号,无需更改
        String user = "root";//打开Navicat,点击用户,如果显示root@localhost,请修改为root@%或新加一个root@%,%表示任意,任意ip地址都可以连接
        String password = "123456";//密码
        String url = "jdbc:mysql://172.19.221.130:3306/course_design?useUnicode=true&characterEncoding=UTF-8&useSSL=true";
//        "?useUnicode=true&characterEncoding=UTF-8"添加中文信息时不会乱码
//       注册JDBC驱动的固定语句
        try {
            Class.forName("com.mysql.jdbc.Driver");//这是一个目录,你可以找到这个目录点进去就懂了
            Log.d(TAG, "加载JDBC驱动成功");
        } catch (ClassNotFoundException e) {
            Log.d(TAG, "加载JDBC驱动失败");
        }
//        创建与mysql的连接对象conn,当然你也可以直接把上面定义的那些变量url的值直接写进去,就不用上面写一堆定义
        try {
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功");
            Log.d(TAG, "数据库连接成功");

        } catch (SQLException e) {
            Log.d(TAG, "数据库连接失败");
        }
        return  conn;//connection类,返回一个connection连接对象
    }

但是一直都是打印“数据库连接失败”。原博主的方法他自己是成功的,可能是我哪一步出错了我没发现吧。参考链接:Android studio 连接MYQSL8.0_android studio下载适配mysql8-CSDN博客。最后我试了别的方法成功了。

【我的解决方法】

1、开启远程访问3306端口

步骤1:依次点击控制面板—系统和安全—windows防火墙—高级设置-入站规则

步骤2:如图

步骤3:如图。填好端口号3306后,一直点击下一步即可。

2.进入MySQL页面

步骤1:Win+R,输入cmd,进入命令行窗口,输入mysql -u root -p后回车,再输入你的数据库密码

步骤2:

输入命令并回车:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION

该命令表示允许从所有IP进行连接,其中123456为数据库密码

3.需要新开一个线程运行,才能连接MySQL数据库

代码如下:

public void initConnect(String table) {
        // 必须新开线程才能连接MySQL数据库
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 数据库驱动
                String CLS="com.mysql.jdbc.Driver";
                String URL="jdbc:mysql://172.19.221.130:3306/course_design?serverTimezone = GMT&characterEncoding=UTF-8";
                String USER="root";
                String PWD="123456";
                try {
                    Class.forName(CLS).newInstance();// 加载数据库驱动
                    Connection conn=(Connection) DriverManager.getConnection(URL,USER,PWD);// 连接数据库
                    String sql="select * from "+table;
                    Statement stmt=conn.createStatement();
                    ResultSet rs=stmt.executeQuery(sql);// 执行sql
                    List<User> users = new ArrayList<>();
                    while (rs.next()) {
                        User user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"));
                        user.setId(rs.getInt("id"));
                        user.setName(rs.getString("username"));
                        user.setPassword(rs.getString("password"));
                        users.add(user);
                        System.out.println(users);
                    }
                    System.out.println("连接成功");
                } catch (ClassNotFoundException | SQLException | IllegalAccessException | InstantiationException e) {
                    System.out.println("连接失败");
                    e.printStackTrace();
                }
            }
        }).start();
    }

顺带说一下导入jar包和添加权限

4、导入jar包

步骤1:到官网下载:MySQL :: Download MySQL Connector/J (Archived Versions)

我这里用的版本是5.1.49,建议用5.几的版本,版本高的似乎会出错

步骤2:下载后找到对应版本的jar包,复制粘贴到libs的文件夹下(没有libs就建一个)

步骤3:选中libs目录下的jar包,右击鼠标,点击最下面的Add as Library即可。这样系统就会自动在app目录下的build.gradle中帮你添加依赖。(如图)

注意:如果你的jar包用不了重新导入了别的版本,记得到build.gradle中将上一个版本的jar包删掉,不然会因为系统找不到该文件而报错

5、在AndroidManifest.xml中添加网络权限

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

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

然后就可以连接MySQL啦!

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/613482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)

上次讲了进程这些内容&#xff1a;Linux&#xff1a;进程概念&#xff08;二.查看进程、父进程与子进程、进程状态详解&#xff09; 文章目录 1.Linux中的进程状态1.1前台进程和后台进程运行状态睡眠状态磁盘休眠状态停止状态kill指令—向进程发送信号 死亡状态 2.僵尸进程2.1僵…

一文读懂NVIDIA AI全景:从芯片到应用,全面解析未来科技

英伟达 NVIDIA AI 全景解析 NVIDIA 概述 公司概况 NVIDIA作为全球顶尖科技公司&#xff0c;早期深耕图形处理器设计制造&#xff0c;现已跃升为人工智能领域的领军者&#xff0c;产品和服务覆盖AI应用的全方位&#xff0c;引领科技潮流。 NVIDIA&#xff0c;1993年创立于美国…

机器学习实战宝典:用scikit-learn打造智能应用

书接上文——《数据探险家的终极指南&#xff1a;用Python挖掘机器学习的奥秘》 前文我们在这段精彩的机器学习探险之旅中&#xff0c;从基础概念出发&#xff0c;深入探索了使用Python和scikit-learn库进行数据分析和模型构建的全过程。 我们首先了解了机器学习的基本原理&am…

RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo

目录 前言 一、再谈自定义应用层协议 二、再谈 BrokerServer 三、再谈 Connection、Channel 四、Demo a&#xff09;启动服务器 b&#xff09;客户端连接 前言 本篇文章来自于笔者之前写过的一个系列 —— “根据源码&#xff0c;模拟实现 RabbitMQ” 系列&#xff0c…

WPF之工具栏菜单栏功能区。

1&#xff0c;菜单栏&#xff0c;工具栏&#xff0c;状态栏。 1.1&#xff0c;Menu中可添加菜单分隔条<Separator></Separator>作为分割线&#xff0c;使用Separator可以通过改变其template来自定义&#xff0c;Separator是无焦点的&#xff0c;如果简单的在MenuIt…

c++ 获取机器码

看到网上代码代码都没什么好的&#xff0c;自己备用一个 #include <iostream> #include <string> #include <sstream> #include <iomanip> #include <Windows.h> #include <iphlpapi.h> // 包含这个头文件以获取 PIP_ADAPTER_INFO #inclu…

面试官:SPA(单页应用)首屏加载速度慢怎么解决

一、什么是首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是…

Macbook2024电脑必备系统优化软件CleanMyMacX

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。特别是当你运行大型应用程序&#xff0c;比如视频编辑软件或图形设计工具时&#xff0c;卡顿现象…

Python计算器程序代码

from tkinter import * import random class App: def __init__(self, master): self.master master self.initwidgets() #表达式的值 self.expr None def initwidgets(self): #定义一个输入组件 self.show Label(relief SUNKEN, font (Courier New, 24), width 25, bg …

[JAVASE] 类和对象(二)

目录 一. 封装 1.1 面向对象的三大法宝 1.2 封装的基本定义与实现 二. 包 2.1 包的定义 2.2 包的作用 2.3 包的使用 2.3.1 导入类 2.3.2 导入静态方法 三. static 关键字 (重要) 3.1 static 的使用 (代码例子) 3.1.1 3.1.2 3.1.3 3.1.4 四. 总结 一. 封装 1.1 面向对象…

反了!美国假冒邮政服务钓鱼网站访问量竟然超过正规官网

美国邮政是美国主要的包裹信件投递机构之一&#xff0c;长期以来该单位都是网络钓鱼和诈骗的针对目标。对美国公民来说&#xff0c;在假期通常都会收到声称来自美国邮政的诈骗。美国邮政甚至单独建设的网页提醒消费者警惕诈骗信息&#xff1a; 专用提醒网页 Akamai 的研究人员…

IP证书签发申请

IP证书签发申请 IP证书的全称是IP SSL证书&#xff0c;其主要的作用是为IP实现https访问&#xff0c;且IP SSL证书可以完美的解决企业对于IP地址实现https加密需求。 这种类型的证书特别适合于那些没有域名只有公网IP或者不方便使用域名的企业或个人。证书允许通过特定的IP地…

简单的表单初始密码验证的实现

目录 简单示例&#xff1a;表单初始密码验证 1.1准备工作(图1&#xff09; 1.2 index部分 1.3 css部分 1.3.1先把css部分链接到index.html中&#xff0c;注意链接的地址。 1.3.2添加样式 1.4 JS部分 1.4.1 先把js部分链接到index.html中&am…

LAE SHOW 2024 大湾区国际低空经济产业博览会

LAE SHOW 2024 大湾区国际低空经济产业博览会 2024 CHN GBA Intl Low-Altitude Economy Industrial Show ◎ 展会基本信息&#xff1a; 展览时间&#xff1a;2024年12月4日-6日 展览地点&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; 展览面积&#xff1a…

2万字干货:如何从0到1搭建一套会员体系(2)

2.用户等级 还是一样&#xff0c;我们为什么要搭建用户等级&#xff1f; 一个国家有几亿人口的时候你怎么来管理&#xff1f;老祖宗秦始皇给出了我们答案&#xff1a;郡县制。发展到现在则演进成了省-市-区县-乡镇(街道)-村(社区)5层行政治理结构。 产品同理&#xff0c;当你…

人脸识别技术在访客管理中的应用

访客办理体系&#xff0c;能够使用于政府、戎行、企业、医院、写字楼等众多场所。在办理时&#xff0c;需求对来访人员身份进行精确认证&#xff0c;才能保证来访人员的进入对被访单位不被外来风险入侵。在核实身份时&#xff0c;比较好的方法就是选用人脸辨认技能&#xff0c;…

QT 小项目:登录注册账号和忘记密码(下一章实现远程登录)

一、环境搭建 参考上一章环境 二、项目工程目录 三、主要源程序如下&#xff1a; registeraccountwindow.cpp 窗口初始化&#xff1a; void registeraccountWindow::reginit() {//去掉&#xff1f;号this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButt…

针对 % 号 | 引起的 不安全情况

把网站开放的课程都检索下来了 一、情况1 org.apache.tomcat.util.http.Parameters processParameters 信息: Character decoding failed. Parameter [Mac] with value [%%%] has been ignored. Note that the name and value quoted here may be corrupted due to the failed…

陪诊陪护小程序基于ThinkPHP + FastAdmin + 微信小程序开发(源码搭建/上线/运营/售后/更新

支持多运营区&#xff0c;陪护师、推广者等完整闭环功能&#xff0c;快速搭建陪护业务平台。 消息通知&#xff1a;系统可以向用户发送订单状态变更、陪诊员信息更新等通知&#xff0c;确保用户及时了解相关信息&#xff0c;提高用户体验。 订单管理&#xff1a;患者可以查看自…

C++运算符重载(操作符重载)

运算符重载 1. 运算符重载基础1.1 运算符重载语法1.2 运算符重载细节补充1.3 更多的运算符重载 2. 重载单目运算符3. 如何直接输入输出对象类型——重载运算符 << 和 >>3.1 单个对象实现 cou <<3.2 多个对象实现 cout<<3.3 右移运算符 输入 cin >&g…