Android 连接 MySQL 并进行基本的增删改查操作

准备工作

导入 jar 包

  1. 下载 mysql-connector-java 包(吃过亏的表示推荐 5.x.x 版本,8.x.x 版本会出现挺多问题的):mysql-connector-java 下载地址
  2. 打开 AS,将 jar 包复制到 libs 文件夹下, 复制完后右键 jar 包,点击 “add as library”,将 jar 包导入相应 module
  3. 如果导入的 mysql-connector-java 版本为 8.x.x,则需要在 app\build.gradle 中添加:
android {
    // ...
    
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

添加网络权限

在 AndroidManifest.xml 中添加:

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

在本地主机的 mysql 中创建要连接的数据库

  1. 使用命令行创建数据库
create database <数据库名>;    
  1. 使用 navicat 等可视化工具直接创建数据库

连接 MySql

直接上工具类:

/**
 * @author Feng Zhaohao
 * Created on 2019/11/24
 */
public class DbOpenHelper {

    private static String driver = "com.mysql.jdbc.Driver";// mysql 驱动
    private static String ip = "xxx.xxx.xxx.xxx";  // 安装了 mysql 的电脑的 ip 地址
    private static String dbName = "TestDB";    // 要连接的数据库
    private static String url = "jdbc:mysql://" + ip + ":3306/" + dbName
            + "?useUnicode=true&characterEncoding=utf8";    // mysql 数据库连接 url
    private static String user = "root";    // 用户名
    private static String password = "xxxxxx"; // 密码

    private static Connection sConnection;

    /**
     * 连接数据库
     */
    public static Connection getConnection() {
        if (sConnection == null) {
            try {
                Class.forName(driver);  // 获取 mysql 驱动
                sConnection = DriverManager.getConnection(url, user, password);   // 获取连接
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return sConnection;
    }

    /**
     * 关闭数据库
     */
    public static void closeConnection() {
        if (sConnection != null) {
            try {
                sConnection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

通过 getConnection() 获得连接,不需要连接时记得使用 closeConnection() 关闭。

注意:

  1. url 连接中的 ip 地址是指本地主机(安装了 mysql 的电脑)的 ip 地址,不是 localhost(localhost 是你手机的 ip 地址,你手机不可能装 mysql 吧)
  2. url 连接中的数据库名不要写错,必须是本地主机的 mysql 中已经创建好的数据库
  3. 需要在子线程中进行连接 MySQL 操作

连接后进行增删改查

准备工作:在 TestDB 数据库中创建了一个 person 表,该表有 3 个 column: id(int 类型,主键,自增长)、name(text 类型,表示姓名)、age(int 类型,表示年龄)。

注意:连接 MySQL 和对 MySQL 数据库进行增删改查操作都需要放在子线程中进行,不然会抛出异常。

插入数据

    /**
     * 插入数据(插入一条姓名为 name,年龄为 age 的数据)
     */
    public static void insert(String name, int age) {
        // 插入数据的 sql 语句
        String sql = "insert into person (name, age) values (?, ?)";
        Connection connection = DbOpenHelper.getConnection();
        PreparedStatement ps = null;
        if (connection == null) {
            return;
        }
        try {
            ps = connection.prepareStatement(sql);
            // 为两个 ? 设置具体的值
            ps.setString(1, name);
            ps.setInt(2, age);
            // 执行语句
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

更新数据

    /**
     * 更新数据(将姓名为 name 的年龄改为 newAge)
     */
    public static void update(String name, int newAge) {
        // 更新数据的 sql 语句
        String sql = "update person set age = ? where name = ?";
        Connection connection = DbOpenHelper.getConnection();
        PreparedStatement ps = null;
        try {
            ps = connection.prepareStatement(sql);
            // 为两个 ? 设置具体的值
            ps.setInt(1, newAge);
            ps.setString(2, name);
            // 执行语句
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

删除数据

    /**
     * 删除数据(删除姓名为 name 的数据)
     */
    public static void delete(String name) {
        // 删除数据的 sql 语句
        String sql = "delete from person where name = ?";
        Connection connection = DbOpenHelper.getConnection();
        PreparedStatement ps = null;
        try {
            ps = connection.prepareStatement(sql);
            // 为 ? 设置具体的值
            ps.setString(1, name);
            // 执行语句
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

查询数据

    /**
     * 查询 person 表的所有数据
     */
    public static String query() {
        // 查询的 sql 语句
        String sql = "select * from person";
        Connection connection = DbOpenHelper.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        StringBuilder builder = new StringBuilder();
        try {
            ps = connection.prepareStatement(sql);
            // 执行语句(执行查询语句用的是 executeQuery 方法)
            rs = ps.executeQuery();
            // 得到查询结果
            if (rs != null) {
                while (rs.next()) {
                    builder.append("[name = ");
                    builder.append(rs.getString("name"));
                    builder.append(", age = ");
                    builder.append(rs.getInt("age"));
                    builder.append("] ");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        return builder.toString();
    }

出现的问题

下面是对在连接 MySQL 过程中出现问题的记录,其中问题 2、问题 4、问题 5 是导入 mysql-connector-java-8.x.x 出现的问题;问题 6 是导入 mysql-connector-java-5.x.x 出现的问题。

  1. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
解决:在项目中导入 mysql-connector-java 包
  1. Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver.
解决:将 mysql 驱动由 "com.mysql.jdbc.Driver" 换成 "com.mysql.cj.jdbc.Driver"
  1. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
原因:连接的数据库(在连接 url 中指定的数据库)未创建(很多博客都没有说这点,结果一开始我傻傻地以为随便输入一个数据库名就行)

解决:连接前先在本地创建好需要连接的数据库
  1. java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
解决:在连接 url 中添加 serverTimezone,例如 "jdbc:mysql://ip:3306/dbName?serverTimezone=GMT%2B8"
  1. java.lang.ClassNotFoundException: Didn’t find class “java.sql.SQLType” on path: DexPathList…
原因:推测和 jdk1.8 版本有关,但是在 IDEA 上用 Java 连接 MySql 又正常,有点迷

解决:放弃 mysql-connector-java-8.x.x,重新导了个更低版本的 mysql-connector-java-5.x.x(又回到最初的起点...)。

注意,导了 5.x.x 版本后问题 2、问题 4 就不存在了。
  1. Unknown initial character set index ‘255’ received from server. Initial client character
解决: 在连接 url 指定字符集,例如 "jdbc:mysql://ip:3306/dbName?useUnicode=true&characterEncoding=utf8"

参考

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Android Studio连接MySQL数据库进行增删改查操作,你需要以下步骤: 1. 首先,在你的项目中添加MySQL连接所需的驱动程序。可以将MySQL连接的JAR文件添加到项目的libs文件夹中,或者通过Gradle依赖项添加。 2. 在AndroidManifest.xml文件中添加网络访问权限。确保在文件中添加以下行: ``` <uses-permission android:name="android.permission.INTERNET" /> ``` 3. 在你的Java代码中,创建一个数据库连接并执行相应的增删改查操作。你可以使用JDBC连接MySQL数据库。以下是一些常见操作的示例: - 连接数据库: ```java Connection connection = DriverManager.getConnection("jdbc:mysql://your_host:your_port/your_database", "your_username", "your_password"); ``` - 插入数据: ```java String insertQuery = "INSERT INTO your_table (column1, column2) VALUES (?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(insertQuery); preparedStatement.setString(1, "value1"); preparedStatement.setString(2, "value2"); preparedStatement.executeUpdate(); ``` - 更新数据: ```java String updateQuery = "UPDATE your_table SET column1 = ? WHERE column2 = ?"; PreparedStatement preparedStatement = connection.prepareStatement(updateQuery); preparedStatement.setString(1, "new_value"); preparedStatement.setString(2, "condition_value"); preparedStatement.executeUpdate(); ``` - 删除数据: ```java String deleteQuery = "DELETE FROM your_table WHERE column = ?"; PreparedStatement preparedStatement = connection.prepareStatement(deleteQuery); preparedStatement.setString(1, "condition_value"); preparedStatement.executeUpdate(); ``` - 查询数据: ```java String selectQuery = "SELECT * FROM your_table WHERE column = ?"; PreparedStatement preparedStatement = connection.prepareStatement(selectQuery); preparedStatement.setString(1, "condition_value"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { // 处理查询结果 } ``` 请注意,为了在Android中使用JDBC连接MySQL,在Gradle文件中添加以下依赖项: ``` dependencies { implementation 'mysql:mysql-connector-java:8.0.27' // 或者你所使用的MySQL驱动的版本 } ``` 这样,你就可以在Android Studio连接MySQL数据库并执行相应的增删改查操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值