Android与MySQL数据库连接指南
在现代移动应用开发中,数据的存储和管理是至关重要的,对于Android应用来说,虽然本地数据库(如SQLite)是一种常见的选择,但在需要远程数据访问和同步的场景下,使用云端数据库(如MySQL)成为了一种趋势,本文将详细介绍如何在Android应用中连接并操作MySQL数据库。
一、准备工作
1. 安装MySQL数据库
确保你的计算机上已经安装了MySQL数据库,并且服务正在运行,你可以通过命令行或MySQL Workbench来验证MySQL是否正常运行。
2. 创建数据库和用户
登录到MySQL后,创建一个新数据库以及一个具有适当权限的用户。
CREATE DATABASE mydatabase; CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'%'; FLUSH PRIVILEGES;
这里的myuser
和mypassword
分别是你创建的用户名和密码,mydatabase
是你要操作的数据库名。
3. 下载MySQL JDBC驱动
前往[MySQL官方网站](https://dev.mysql.com/downloads/connector/j/)下载适用于Java的MySQL连接器(JDBC驱动),下载完成后,将驱动JAR文件添加到你的Android项目中,如果你使用的是Maven或Gradle构建工具,可以在build.gradle
文件中添加依赖项:
implementation 'mysql:mysql-connector-java:8.0.26'
二、连接MySQL数据库
要在Android应用中连接MySQL数据库,你需要执行以下步骤:
1. 添加网络权限
在AndroidManifest.xml
文件中添加网络权限,以便应用能够进行网络通信:
<uses-permission android:name="android.permission.INTERNET"/>
2. 创建数据库连接类
编写一个辅助类来管理数据库连接,以下是一个示例代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DbUtil { public static String IP = "192.168.2.157"; // 数据库IP地址 public static String DB_NAME = "mydatabase"; // 数据库名 public static String DB_USERNAME = "myuser"; // 用户名 public static String DB_PASSWORD = "mypassword"; // 密码 public static Connection createConnection() { Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); String connURL = "jdbc:mysql://" + IP + ":3306/" + DB_NAME + "?useUnicode=true&characterEncoding=utf8"; conn = DriverManager.getConnection(connURL, DB_USERNAME, DB_PASSWORD); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } return conn; } }
注意:在实际项目中,请避免硬编码敏感信息(如密码),建议使用更安全的方法来管理配置。
三、执行基本CRUD操作
一旦建立了数据库连接,你就可以执行基本的增删改查(CRUD)操作了,以下是一些示例代码:
1. 查询数据
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class MySQLQuery { public static void main(String[] args) { Connection connection = DbUtil.createConnection(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { preparedStatement = connection.prepareStatement("SELECT * FROM users"); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { System.out.println("User ID: " + resultSet.getInt("user_id")); System.out.println("User Name: " + resultSet.getString("user_name")); System.out.println("E-mail Address: " + resultSet.getString("email")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
2. 插入数据
public class MySQLInsert { public static void main(String[] args) { Connection connection = DbUtil.createConnection(); String sql = "INSERT INTO users(user_name, email) VALUES(?, ?)"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setString(1, "John Doe"); pstmt.setString(2, "john.doe@example.com"); int affectedRows = pstmt.executeUpdate(); System.out.println("Inserted successfully, affected rows: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
3. 更新数据
public class MySQLUpdate { public static void main(String[] args) { Connection connection = DbUtil.createConnection(); String sql = "UPDATE users SET email = ? WHERE user_id = ?"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setString(1, "new.email@example.com"); pstmt.setInt(2, 1); // 假设要更新的用户ID为1 int affectedRows = pstmt.executeUpdate(); System.out.println("Updated successfully, affected rows: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
4. 删除数据
public class MySQLDelete { public static void main(String[] args) { Connection connection = DbUtil.createConnection(); String sql = "DELETE FROM users WHERE user_id = ?"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setInt(1, 1); // 假设要删除的用户ID为1 int affectedRows = pstmt.executeUpdate(); System.out.println("Deleted successfully, affected rows: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
四、多表操作与事务处理
除了基本的CRUD操作外,MySQL还支持复杂的查询和事务处理,以下是一些高级操作的示例:
1. 内连接查询(INNER JOIN)
public class MySQLJoinQuery { public static void main(String[] args) { Connection connection = DbUtil.createConnection(); String sql = "SELECT u.user_id, u.user_name, o.order_id, o.amount FROM users u INNER JOIN orders o ON u.user_id = o.user_id"; try (PreparedStatement pstmt = connection.prepareStatement(sql); ResultSet resultSet = pstmt.executeQuery()) { while (resultSet.next()) { System.out.println("User ID: " + resultSet.getInt("user_id")); System.out.println("User Name: " + resultSet.getString("user_name")); System.out.println("Order ID: " + resultSet.getInt("order_id")); System.out.println("Amount: " + resultSet.getDouble("amount")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
2. 事务处理
public class MySQLTransaction { public static void main(String[] args) { Connection connection = DbUtil.createConnection(); try { // 开始事务 connection.setAutoCommit(false); String sql1 = "UPDATE accounts SET balance = balance ? WHERE account_id = ?"; String sql2 = "UPDATE accounts SET balance = balance + ? WHERE account_id = ?"; try (PreparedStatement pstmt1 = connection.prepareStatement(sql1); PreparedStatement pstmt2 = connection.prepareStatement(sql2)) { pstmt1.setDouble(1, 100.0); pstmt1.setInt(2, 1); // 转账账户ID pstmt2.setDouble(1, 100.0); pstmt2.setInt(2, 2); // 接收账户ID pstmt1.executeUpdate(); pstmt2.executeUpdate(); // 提交事务 connection.commit(); System.out.println("Transaction committed successfully"); } catch (SQLException e) { // 回滚事务 connection.rollback(); System.out.println("Transaction rolled back due to an error"); e.printStackTrace(); } finally { // 恢复自动提交模式 connection.setAutoCommit(true); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
五、常见问题及解决方案
在使用Android连接MySQL时,可能会遇到一些问题,以下是一些常见问题及其解决方案:
问题1:无法连接到数据库
解决方案:首先检查网络连接是否正常,确保Android设备能够访问互联网,确认MySQL服务器正在运行,并且防火墙设置允许外部访问,检查数据库URL、用户名和密码是否正确。
问题2:字符编码问题导致中文乱码
解决方案:确保MySQL数据库的字符集设置为UTF-8,你可以在my.ini
文件中添加以下配置:
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_general_ci
然后重启MySQL服务,在Java代码中指定字符编码为UTF-8也很重要,在连接字符串中添加参数?useUnicode=true&characterEncoding=utf8
。
问题3:SQL注入风险
解决方案:使用PreparedStatement
代替Statement
来执行SQL查询,以避免SQL注入攻击。PreparedStatement
会自动处理特殊字符,并确保输入的数据不会破坏SQL语句的结构。
String sql = "SELECT * FROM users WHERE user_id = ?"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setInt(1, userId); // 动态绑定参数值 ResultSet resultSet = pstmt.executeQuery(); // 处理结果集... } catch (SQLException e) { e.printStackTrace(); }
通过上述步骤和示例代码,你应该能够在Android应用中成功连接并操作MySQL数据库,需要注意的是,直接从移动设备访问远程数据库可能带来安全隐患,因此在实际应用中应考虑使用中间层(如Web服务或API)来进行数据交互,以提高安全性和性能,希望本文对你有所帮助!
以上就是关于“android数据库MYSQL”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/629112.html