Android studio连接mysql数据库


前言

  用Android studio连接Navicat Premium 16管理的mysql,我安装的是mysql5.7.19版本,用的包是mysql-connector-java-5.1.49-bin.jar。
  在开始连接前请务必确保MySQL版本不是8.0及以上的版本!!否则会一直报错无法创建连接。
  jar包也尽量选择低一些的版本,高版本我没试过,据说新版不太稳定不支持也会报错。


环境配置:

一,mysql下载地址:https://downloads.mysql.com/archives/community
二,Navicat Premium 16安装地址:https://www.downkuai.com/soft/161548.html
三,mysql-connector-java-5.1.49-bin.jar下载地址:https://downloads.mysql.com/archives/c-j/


一、Android studio连接mysql数据库

1.配置Android Studio

  • 打开项目,导入jar包,将下载的jar包放入项目/app/libs内,右键,点击Add As Library。
    在这里插入图片描述

  • 配置环境,在AndroidManifest.xml中加入以下代码来获取网络访问权限。

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

2.mysql设置权限

  • 在Navicat Premium 16中点击连接选择mysql,输入自己的mysql密码创建连接,主机或IP地址要填写自己电脑的IPv4地址,双击选中。
    不知道地址的可以cmd打开命令提示符,输入ipconfig,找到自己的iPv4地址
    在这里插入图片描述
  • 管理员权限运行命令提示符,进入mysql所在的文件夹进入mysql,输入密码登录你的账号,输入以下代码表示增加新用户,bya是用户名,123456是明文密码,%表示能够在任何机器上登陆mysql,
d:										//进入D盘
cd D:mysqlmysql-5.7.19-winx64bin		//进入mysql在的文件夹
mysql -u RCQ -p							//登录账号 RCQ要替换为自己的用户名
123456									//输入自己的密码
GRANT ALL PRIVILEGES ON *.* TO 'bya'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

  显示ok则表示添加成功
在这里插入图片描述

  • 在Navicat Premium 16中点击用户,新建用户,用户名和密码要和刚添加mysql用户时的用户名和密码一致,最后点击保存即可。
    在这里插入图片描述

二、在Android studio进行测试

创建表和数据

  • 在Navicat Premium 16中创建数据库demo,创建表user,再编写几个数据,因为是测试,所以我就写了四个属性。
    表结构为:
    在这里插入图片描述
    表数据为:
    在这里插入图片描述

编写代码进行测试

  • 在Android studio中编写代码进行测试
      一共要编写三个java文件:JDBCUtils,UserDao和MainActivity.java。JDBCUtils用于连接数据库,UserDao是数据库与前端交互类,MainActivity.java是应用主页面的实现代码。
      本来应该再写一个User是信息存储类的,但是因为这是简单的测试就没有写,直接在代码里定义好数据直接进行查询和插入数据
    JDBCUtils类:
package com.example.androidpractice.Utils;

import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;

/**
 * function: 数据库工具类,连接数据库用
 */
public class JDBCUtils {
    private static final String TAG = "mysql-party-JDBCUtils";
    private static String driver = "com.mysql.jdbc.Driver";// MySql驱动
    private static String dbName = "demo";// 数据库名称
    private static String user = "bya";// 用户名
    private static String password = "123456";// 密码
    public static Connection getConn(){
        Connection connection = null;
        try{
            Class.forName(driver);// 动态加载类
            String ip = "10.73.146.38";// 写成本机地址,不能写成localhost,
            // 尝试建立到给定数据库URL的连接
            connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
                    user, password);
            Log.d("ning","数据库连接成功!");
        }catch (Exception e){
            e.printStackTrace();
            Log.d("ning","数据库连接失败!");
        }
        return connection;
    }
}

UserDao.java类:

package com.example.androidpractice.dao;

import android.util.Log;
import com.example.androidpractice.Utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * author: 白易安
 * date: 2023.08.05
 * **/
public class UserDao {

    //根据传入的账号查询数据库对应的密码,再与传入的密码进行对比
    public  boolean loginup(String account, String password) {
        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            // 获取数据库连接
            connection = JDBCUtils.getConn();
            Log.d("ning","账号:" + account);
            // 查询表中的密码
            String sql = "SELECT password FROM user WHERE account = ?";
            pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, account);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                // 比较查出的密码和传入的密码是否相同
                String dbPassword = rs.getString("password");
                Log.d("ning","密码:" + dbPassword);
                return dbPassword.equals(password);
            } else {
                return false; // 没有找到对应的账号,返回false表示登录失败
            }
        } catch (SQLException e) {
            e.printStackTrace(); // 打印异常信息
            return false; // 发生异常,返回false表示登录失败
        } finally {
            // 关闭资源
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    //插入数据
    public  void insert(String account, String password, String name) {
        Connection connection = null;
        PreparedStatement pstmt = null;
        try {
            // 获取数据库连接
            connection = JDBCUtils.getConn();
            // 构造SQL语句
            String sql = "INSERT INTO user (account, password, name) VALUES (?, ?, ?)";
            pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, account);
            pstmt.setString(2, password);
            pstmt.setString(3, name);
            // 执行SQL语句
            pstmt.executeUpdate();
            Log.d("ning","插入数据成功!");
        } catch (SQLException e) {
            e.printStackTrace(); // 打印异常信息
            Log.d("ning","插入数据失败!");
        } finally {
            // 关闭资源
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

}

MainActivity.java:

package com.example.androidpractice;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import com.example.androidpractice.dao.UserDao;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String account="17374517111";
        String password="111111";
        String account1="17374517444";
        String password1="111111444";
        String name="d";
        UserDao dao=new UserDao();
        boolean up=false;
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            up=dao.loginup(account,password);
            dao.insert(account1,password1,name);

        }
        if (up==true){
            Log.d("ning","登录成功");
        }else {
            Log.d("ning","登录失败");
        }
    }
}

主线程不能进行网络操作问题

  • 其中刚运行是还是报错,查找了错误原因为:在主线程中执行了网络操作,这是不允许的。为了解决这个问题,你需要将网络操作放到子线程中执行。
  • 我使用了一下代码来解决这个报错:
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

  这段代码是在Android应用中使用的,用于在Android 10(API级别29)及更高版本上启用StrictMode。StrictMode是一个用于检测应用程序中可能的内存泄漏、死锁等问题的工具。
代码解析:
  1,首先检查当前设备的Android版本是否大于9(即API级别29),因为从Android 10开始,StrictMode才默认启用。
  2,如果设备版本大于9,则创建一个StrictMode.ThreadPolicy对象,允许所有线程执行。
  3,最后,使用setThreadPolicy方法将创建的策略设置为当前线程的策略。


总结

  因为才学Android没多久,看的课程Android studio只有连接自带的sqlite没有通过网络访问mysql数据库这部分,所以自己搜索着解决了一下,最后那个解决报错的方法肯定不适用于很多情况,还需要在找一些其他方法,我问了AI说可以使用AsyncTask或者Thread来解决,但是还没有试。
  继续学习,加油!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>