上一篇
安卓开发连接mysql数据库
- 行业动态
- 2025-04-21
- 2
安卓连接MySQL的可行性分析
项目 | 说明 |
---|---|
直接连接风险 | 移动端直连数据库会暴露IP地址,存在安全隐患(如DDoS攻击、数据泄露) |
网络限制 | 运营商/企业级网络可能封锁3306端口(MySQL默认端口) |
性能瓶颈 | 移动设备处理大量数据交互能力弱,易造成卡顿 |
推荐方案 | 通过Web服务中转(如RESTful API) |
直接连接MySQL的实现步骤(仅限学习用途)
添加网络权限
在AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
引入MySQL驱动
下载mysql-connector-java
驱动包,将mysql-connector-java-x.x.x.jar
放入app/libs
目录,并在build.gradle
中配置:
dependencies { implementation files('libs/mysql-connector-java-8.0.xx.jar') }
创建数据库连接工具类
public class MySQLHelper { private static final String URL = "jdbc:mysql://服务器IP:3306/数据库名?useSSL=false"; private static final String USER = "用户名"; private static final String PASSWORD = "密码"; public static Connection getConnection() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); return DriverManager.getConnection(URL, USER, PASSWORD); } }
异步执行SQL操作(防止阻塞主线程)
new AsyncTask<Void, Void, ResultSet>() { @Override protected ResultSet doInBackground(Void... voids) { try (Connection conn = MySQLHelper.getConnection(); Statement stmt = conn.createStatement()) { return stmt.executeQuery("SELECT FROM table_name"); } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(ResultSet resultSet) { // 处理查询结果 } }.execute();
推荐方案:通过Web服务中转
组件 | 技术选型 | 作用 |
---|---|---|
客户端 | Retrofit/OkHttp + Gson | 发送HTTP请求,解析JSON数据 |
服务器端 | Spring Boot/Node.js/PHP | 处理业务逻辑,操作MySQL数据库 |
数据库 | MySQL | 存储核心数据 |
优势对比表
维度 | 直连MySQL | Web服务中转 |
---|---|---|
安全性 | 低(暴露数据库) | 高(隐藏数据库细节) |
兼容性 | 需处理多网络环境 | 标准化HTTP协议 |
扩展性 | 差 | 优(可独立扩展服务器) |
常见问题与解决方案
连接超时/拒绝连接
- 原因:服务器防火墙未开放3306端口、网络运营商屏蔽端口、MySQL配置禁止远程访问
- 解决:
- 检查服务器防火墙规则(
iptables
或云服务商安全组) - 修改
my.cnf
添加bind-address=0.0.0.0
允许远程连接 - 使用SSH隧道转发端口(
ssh -L 3307:localhost:3306 user@server
)
- 检查服务器防火墙规则(
SSL证书验证失败
- 原因:MySQL 8.0+默认要求SSL连接
- 解决:
- 在连接字符串添加
?useSSL=false
(不推荐,仅学习使用) - 配置服务器SSL证书并信任客户端
- 在连接字符串添加
相关问题与解答
Q1:如何通过Retrofit调用Web API连接MySQL?
A:
- 服务器端搭建RESTful API(如Spring Boot):
@RestController public class UserController { @GetMapping("/users") public List<User> getAllUsers() { // 查询MySQL并返回数据 } }
- 安卓端配置Retrofit:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://yourserver.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build();
Q2:如何处理多线程导致的数据库并发问题?
A:
- 服务器端:
- 使用事务管理(
transaction
)保证数据一致性 - 添加行锁(
SELECT ... FOR UPDATE
)防止脏读
- 使用事务管理(
- 客户端:
- 使用
synchronized
或Lock
控制并发请求 - 对关键操作添加重试机制(如
retryWhen
- 使用