单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.连接虚拟机测试
少女(大嘘)祈祷中……

完结撒花。

posted @ 2025-03-12 21:24  花落水无痕  阅读(65)  评论(0)    收藏  举报