单Android Studio实现虚拟机与主机数据库连接/日报2025312
今天植树节,那植一下技术吧。
注:本人为初学者,博客内容仅供参考,所用数据纯属虚构,如有雷同纯属巧合,欢迎沟通交流!!!
AS前、后端开发连接计算机MYSQL数据库
首先自然是数据库:
先是建立了一个数据库dbnewcourse
然后建表
create table course(
id int(8) PRIMARY KEY AUTO_INCREMENT,
name varchar(20),
teacher ENUM('王建民', '刘立嘉', '刘丹', '杨子光', '张云霞', '武永亮', '高飞', '孙静', '黄荣峰') NOT NULL,
loc ENUM('一教', '二教', '三教', '基教') NOT NULL
);
之后创建一个AS工程,就取名为NewCourseDemo!//使用的是groovy

接下来是正戏!
1.在项目根目录下的 build.gradle 文件中添加 MySQL 依赖项:
implementation("mysql:mysql-connector-java:5.1.47")

在dependencies下插入语句后sync now进行jar包的一个导入
2.在 AndroidManifest.xml 文件中添加 Internet 权限:
<uses-permission android:name="android.permission.INTERNET" />

如上
3.创建一个JDBCHelper
package com.example.newcoursedemo;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCHelper {
// MySql数据库的MySQL 数据库的连接 URL,包括主机名、端口号和数据库名称。
static String url = "jdbc:mysql://10.0.2.2:3306/dbnewcourse";
// MySql数据库的用户名。
static String name = "root";
// MySQL 数据库的密码。
static String psw = "123456";
public static Connection getCon() {
Connection con = null;
try {
// 加载 MySQL JDBC 驱动程序。
Class.forName("com.mysql.jdbc.Driver");
// 使用 DriverManager.getConnection 方法尝试建立与 MySQL 数据库的连接
con = (Connection) DriverManager.getConnection(url,name,psw);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return con;
}
}
需要注意的是
“ static String url = "jdbc:mysql://10.0.2.2:3306/login";”这句中,
Android 模拟器默认会将 localhost 或 127.0.0.1 指向模拟器自身,而不是你的主机。
所以!选择使用主机的特殊 IP 地址 10.0.2.2,这是 Android 模拟器预留的地址,用于访问主机的 localhost。
数据库名和密码写自己的

4.编写activity_main.xml
目录:app->res->layout->activity_main.xml
就写三个文本框一个按钮吧
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入课程名"/>
<EditText
android:id="@+id/teacher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入任课教师"/>
<EditText
android:id="@+id/loc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入上课地点"/>
<Button
android:id="@+id/confirm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="提交"></Button>
</androidx.appcompat.widget.LinearLayoutCompat>
大体这样,流式布局初学不求多好看了

5.功能实现
在MainActivity中写读取和写入数据库操作
package com.example.newcoursedemo;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MainActivity extends AppCompatActivity {
private EditText name, teacher, loc;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化视图
name = findViewById(R.id.name);
teacher = findViewById(R.id.teacher);
loc = findViewById(R.id.loc);
btn = findViewById(R.id.confirm); // 修改为布局文件中的 ID
// 注册按钮点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 开启一个新线程用来执行数据库操作
new Thread(new Runnable() {
@Override
public void run() {
// 获取数据库连接
Connection con = JDBCHelper.getCon();
if (con == null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "数据库连接失败", Toast.LENGTH_SHORT).show();
}
});
return;
}
// 准备一个 SQL 查询语句来检查课程是否存在
String sqlStr = "select * from course where name=?";
try {
PreparedStatement ps = (PreparedStatement) con.prepareStatement(sqlStr);
// 设置查询参数
ps.setString(1, name.getText().toString());
// 进行查询
ResultSet rs = ps.executeQuery();
// 判断课程是否存在
if (rs.next()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "课程已存在", Toast.LENGTH_SHORT).show();
}
});
} else {
// 插入新课程
String sqlStr1 = "insert into course(id,name,teacher,loc) values(null,?,?,?)";
try {
PreparedStatement ps1 = (PreparedStatement) con.prepareStatement(sqlStr1);
// 设置插入参数
ps1.setString(1, name.getText().toString());
ps1.setString(2, teacher.getText().toString());
ps1.setString(3, loc.getText().toString());
// 执行插入操作
int rows = ps1.executeUpdate();
// 判断插入是否成功
if (rows > 0) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "提交成功", Toast.LENGTH_SHORT).show();
//finish(); // 结束当前 Activity
}
});
}
} catch (SQLException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "提交失败", Toast.LENGTH_SHORT).show();
}
});
}
}
} catch (SQLException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "查询失败", Toast.LENGTH_SHORT).show();
}
});
}
}
}).start();
}
});
}
}
//绝对不能这么开发,会似人的XP
6.连接虚拟机测试
少女(大嘘)祈祷中……


完结撒花。

浙公网安备 33010602011771号