利用JDBC连接APP与在华为云服务器上部署的Mysql数据库
0. 环境
1. 关于JDBC
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制。
2. 连接教程
2.1 下载Mysql对应的JDBC包
进入官网:
或者直接点击JDBC 5.1下载地址:
注:与Mysql版本对应(在Android Studio上目前只能安装mysql5的版本,所以JDBC也需要下载对应的版本)
2.2 添加jar包到AS的libs中
下载完成后解压文件,并将.jar文件(我这里是mysql-connector-j-5.1.48.jar
)复制到Android Studio的app/libs目录下
注:需要在Project视图下才能看到
libs
文件夹
2.3 配置依赖文件
选择
File
—>Project Structure
点击
Dependencies
==> 选择Modules
中的app
—> 点击Declared Dependency
中的+
==>选择2 JAR/AAR Dependency
将刚刚添加的.jar包的路径写入,点击
OK
然后就可以看见刚刚添加的.jar包。点击
OK
2.4 Gradle文件同步
点击File
—> Sync Project with Gradle Files
,实现与Gradle文件的同步
2.5 添加访问网络的权限
在AndroidManifest.xml
文件中添加以下权限声明:
注:AndroidManifest.xml
文件需要打开Project视图,在路径app\src\main\AndroidManifest.xml下
<uses-permission android:name="android.permission.INTERNET" />
2.6 添加DBConnection
类,用于连接数据库
按照实际修改以下几个地方:
package
名:为activity所在的包名Class.forName("com.mysql.jdbc.Driver")
用于在Java程序中载入驱动程序Class.forName(“指定数据库的驱动程序”)” 方式来载入数据库到开发环境中的驱动程序
比如载入MySQL的数据驱动程序的代码为: Class.forName(“com.mysql.jdbc.Driver”)
user
:数据库登录的用户名password
:数据库登录的用户密码dbname
:所连接的数据库名ip
:数据库所在的服务器公网IPurl
:协议名+IP地址()+port+数据库名称。username和password是指登录数据库时所使用的username和passwordport
:端口号connection = DriverManager.getConnection(url, user, password)
:通过DriverManager类创建数据库连接对象Connection,这里会根据url
、user
和password
的修改而变动
注:连接数据库的费时操作不能在主线程中完成,需要单开一个子线程
2.6.1 DBConnection.java
文件
package com.example.myapplication2;
import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.ResultSet;
public class DBConnection {
private static final String TAG = "===MysqlConnection===";
public static void link () {
//设置IP/端口/数据库名/用户名/密码等必要的连接信息
//服务器的IP地址
String ip = "xxx.xxx.xxx.xxx";
int port = 3306;
//新建的数据库名
String dbName = "prairietraveler";
String url = "jdbc:mysql://" + ip + ":" + port
+ "/" + dbName+"?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
//连接数据库使用的用户名
String user = "root";
//连接的数据库时使用的密码
String password = "xxxxxxxxx";
Connection connection=null;
PreparedStatement pstmt = null;
try {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println("驱动加载成功!!!");
Log.d(TAG, "驱动加载成功!");
}
catch (Exception e){
e.printStackTrace();
Log.d(TAG, "驱动加载失败!");
}
try {
//2、获取与数据库的连接
connection = DriverManager.getConnection(url, user, password);
//3.sql语句
String sql = "insert into user (user_name, password) values (?, ?)";
//4.获取并执行用于向数据库发送sql语句的pstmt
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "tinh");
pstmt.setString(2,"2021214111");
pstmt.executeUpdate();
System.out.println("连接数据库成功!!!");
Log.d(TAG, "连接数据库成功!");
}catch (SQLException se) {
Log.d(TAG, "连接数据库失败1!");
se.printStackTrace();
}finally {
//5.释放资源
if(pstmt != null){
try {
pstmt.close();
}catch (SQLException se){
se.printStackTrace();
}
}
if (connection != null){
try {
connection.close();
}catch (SQLException se){
se.printStackTrace();
}
}
}
}
}
2.6.2 MainActivity.java
文件
package com.example.myapplication2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//数据库连接:不能在主线程中连接
new Thread(new Runnable() {
@Override
public void run() {
DBConnection.link();
}
}).start();
}
}
2.6.3 activity_main.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.6.4 AndroidManifest.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication2"
android:networkSecurityConfig="@xml/network_security_config"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2.7 验证连接
运行程序,查看日志,如果打印出如下语句,则连接成功:
或者直接在Navicat
中查看表中数据的变化:
2.8 可能遇到的错误
2.8.1 网络请求出错:
No Network Security Config specified, using platform default
2.8.2 数据库配置(时区调整):
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException
原因分析:【】
解决办法:修改
mysql
时区【】
2.9 附录
其他说明:华为云和腾讯云连接唯一的区别就是IP和数据库名不一样
通过创建Statement对象并调用Statement对象的相关方法可以执行SQL 语句
Statement 类主要是用于运行静态 SQL 语句并返回它所生成结果的对象
通过 Connection 对象的 createStatement() 方法能够创建一个Statement对象,比如:
Statement statament = connection.createStatement();
调用Statement对象的方法执行SQL,返回结果集。比如下面执行查询语句:
String sql = "SELECT *FROM studentinfo;";
ResultSet resultSet = statement.executeQuery(sql);
还可以调用execuUpdate()方法用来数据的更新,包含建表、插入和删除等操作,比如向staff表中插入一条数据的代码:
statement.excuteUpdate( “INSERT INTO staff(name, age, sex,address, depart, worklen,wage)” + ” VALUES (‘Tom1’, 321, ‘M’, ‘china’,’Personnel’,’3′,’3000′ ) “) ;
使用PreparedStatement和CreateStatement的区别
https://blog.csdn.net/qq_35462323/article/details/106398779)
【参考教程】(该教程较为简略,但大致思路可以参考):
- 点赞
- 收藏
- 关注作者
评论(0)