【案例共创】基于IDEA连接云开发环境并结合GaussDB构建JAVA程序抽奖小应用

本案例由开发者:小草飞上天提供

一、概述

1. 案例介绍

本案例通过本地IDEA连接华为云开发环境,通过本地的IDEA进行远程编程并连接GaussDB数据库来构建抽奖小程序应用。

GaussDB 是华为自研的企业级分布式关系型数据库,具备强大的分布式事务能力、同城多可用区部署、数据零丢失保障、PB级存储扩展等特性。它支持高可用、高安全、弹性伸缩、一键部署、备份恢复和监控告警,适用于对性能、可靠性和扩展性有高要求的企业级应用场景。

华为开发者空间是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。

2. 适用对象

  • 企业
  • 个人开发者
  • 高校学生

3. 案例时间

本案例总时长预计60分钟。

4. 案例流程

说明: 1. 用户进入华为开发者空间云开发环境; 2. 通过CLI工具连接云开发环境; 3. 获取GaussDB实例并配置; 4. 编写应用代码并连接数据库,构建抽奖应用程序。

5. 资源总览

本案例预计花费0.8元。

资源名称规格单价(元)时长(分钟)
华为开发者空间 - 云开发环境鲲鹏通用计算增强型 kc1 | 2vCPUs | 4G | HCE免费60
GaussDBgaussdb.opengauss.xe.dn.s6.xlarge.x864.ha|4 vCPUs | 16 GB免费60
虚拟私有云VPC标配免费60
弹性公网IP按流量计费 5Mbit/s0.8元/GB60

二、配置云开发环境

本案例中,使用华为云《开发者空间云开发环境使用指导》的“三、PC端创建和管理云开发环境”章节完成cli工具安装、环境配置、创建云开发环境、开机、建立隧道连接的功能。

三、IntelliJ IDEA直连云开发环境

参考《本地IntelliJ IDEA 基于华为开发者空间云开发环境的应用开发》的“三、本地IDE直连云开发环境完成上传下载”中的“1.下载IntelliJ IDEA并连接远程开发环境”章节完成IntelliJ IDEA直连云开发环境。

四、获取GaussDB数据库实例并配置

4.1 获取GaussDB数据库实例

默认情况下GaussDB数据库实例已开通,如未开通可参考:购买GaussDB实例

在GaussDB数据库实例的基础信息页修改安全组,开放22端口与8000端口:

新建数据库,数据库名称:PrizeDrawDB,其他参数默认即可:

4.2 修改GaussDB数据库密码验证方式

进入GaussDB数据库控制台,进入GaussDB实例,点击参数管理,修改GaussDB的密码验证参数 password_encryption_type 为 1,并点击保存生效。

在弹出窗口输入YES,点击确定按钮:

五、使用云开发环境完成抽奖小应用开发

5.1 新建远程项目

项目名称:PrizeDrawApp;

Location:/home/developer;

Build system:Maven;

JDK默认即可。

java项目创建完成后,则可以看到相应的代码目录:

5.2 添加postgresql依赖包

在pom.xml中添加依赖:

<dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version> <!-- 使用适合您环境的版本 -->
        </dependency>
    </dependencies>

点击Sync All Maven Projects,同步Maven项目,下载依赖:

5.3 编写项目代码

替换Main.java中的代码:

Main.java完整代码:

package org.example;

import java.sql.*;
import java.util.Random;
import java.util.Scanner;

public class Main {

    // 数据库连接信息 - 请替换为您的实际信息
    private static final String JDBC_URL = "jdbc:postgresql://xx.xx.xx.xx:8000/xxxx";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "xxxx";

    // 奖品配置
    private static final String[] PRIZES = {
            "谢谢参与",
            "优惠券10元",
            "优惠券50元",
            "华为云代金券100元",
            "华为手机",
            "华为笔记本电脑"
    };

    // 奖品概率(总和100)
    private static final int[] PRIZE_PROBABILITY = {40, 30, 15, 10, 4, 1};

    private static Connection connection;
    private static Scanner scanner = new Scanner(System.in);
    private static Random random = new Random();

    public static void main(String[] args) {
        try {
            // 初始化数据库
            initDatabase();

            System.out.println("=== 欢迎来到华为云幸运抽奖系统 ===");

            while (true) {
                System.out.println("\n请选择操作:");
                System.out.println("1. 用户注册");
                System.out.println("2. 开始抽奖");
                System.out.println("3. 查看我的中奖记录");
                System.out.println("4. 退出");
                System.out.print("请输入选择: ");

                int choice = scanner.nextInt();
                scanner.nextLine(); // 消耗换行符

                switch (choice) {
                    case 1:
                        registerUser();
                        break;
                    case 2:
                        drawPrize();
                        break;
                    case 3:
                        viewRecords();
                        break;
                    case 4:
                        System.out.println("感谢使用,再见!");
                        return;
                    default:
                        System.out.println("无效的选择,请重新输入!");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResources();
        }
    }

    // 初始化数据库
    private static void initDatabase() throws Exception {
        Class.forName("org.postgresql.Driver");
        connection = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);

        // 创建用户表
        String createUserTable = "CREATE TABLE IF NOT EXISTS users (" +
                "id SERIAL PRIMARY KEY, " +
                "username VARCHAR(50) UNIQUE NOT NULL, " +
                "phone VARCHAR(20) UNIQUE NOT NULL, " +
                "register_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP" +
                ")";

        // 创建抽奖记录表
        String createRecordTable = "CREATE TABLE IF NOT EXISTS prize_records (" +
                "id SERIAL PRIMARY KEY, " +
                "user_id INTEGER REFERENCES users(id), " +
                "prize_name VARCHAR(100) NOT NULL, " +
                "draw_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP" +
                ")";

        try (Statement stmt = connection.createStatement()) {
            stmt.execute(createUserTable);
            stmt.execute(createRecordTable);
            System.out.println("数据库初始化完成");
        }
    }

    // 用户注册
    private static void registerUser() throws SQLException {
        System.out.println("\n=== 用户注册 ===");
        System.out.print("请输入用户名: ");
        String username = scanner.nextLine();

        System.out.print("请输入手机号: ");
        String phone = scanner.nextLine();

        String sql = "INSERT INTO users (username, phone) VALUES (?, ?)";
        try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
            pstmt.setString(1, username);
            pstmt.setString(2, phone);
            pstmt.executeUpdate();
            System.out.println("注册成功!");
        } catch (SQLException e) {
            System.out.println("注册失败: " + e.getMessage());
        }
    }

    // 抽奖
    private static void drawPrize() throws SQLException {
        System.out.println("\n=== 幸运抽奖 ===");
        System.out.print("请输入您的手机号: ");
        String phone = scanner.nextLine();

        // 查询用户ID
        Integer userId = getUserIdByPhone(phone);
        if (userId == null) {
            System.out.println("未找到该用户,请先注册!");
            return;
        }

        // 随机抽奖
        int prizeIndex = getRandomPrizeIndex();
        String prize = PRIZES[prizeIndex];

        // 记录中奖信息
        String sql = "INSERT INTO prize_records (user_id, prize_name) VALUES (?, ?)";
        try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
            pstmt.setInt(1, userId);
            pstmt.setString(2, prize);
            pstmt.executeUpdate();
        }

        System.out.println("\n恭喜您!");
        System.out.println("您获得了: " + prize);
        System.out.println("奖品已记录到您的账户");
    }

    // 根据概率随机获取奖品索引
    private static int getRandomPrizeIndex() {
        int randomNum = random.nextInt(100) + 1;
        int range = 0;

        for (int i = 0; i < PRIZE_PROBABILITY.length; i++) {
            range += PRIZE_PROBABILITY[i];
            if (randomNum <= range) {
                return i;
            }
        }

        return 0; // 默认返回"谢谢参与"
    }

    // 根据手机号获取用户ID
    private static Integer getUserIdByPhone(String phone) throws SQLException {
        String sql = "SELECT id FROM users WHERE phone = ?";
        try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
            pstmt.setString(1, phone);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return rs.getInt("id");
            }
        }
        return null;
    }

    // 查看中奖记录
    private static void viewRecords() throws SQLException {
        System.out.println("\n=== 我的中奖记录 ===");
        System.out.print("请输入您的手机号: ");
        String phone = scanner.nextLine();

        Integer userId = getUserIdByPhone(phone);
        if (userId == null) {
            System.out.println("未找到该用户,请先注册!");
            return;
        }

        String sql = "SELECT prize_name, draw_time FROM prize_records WHERE user_id = ? ORDER BY draw_time DESC";
        try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
            pstmt.setInt(1, userId);
            ResultSet rs = pstmt.executeQuery();

            System.out.println("\n中奖记录:");
            System.out.println("-----------------------------");
            boolean hasRecord = false;

            while (rs.next()) {
                hasRecord = true;
                String prize = rs.getString("prize_name");
                Timestamp time = rs.getTimestamp("draw_time");
                System.out.printf("奖品: %-15s 时间: %tF %tT%n", prize, time, time);
            }

            if (!hasRecord) {
                System.out.println("暂无中奖记录,快去抽奖吧!");
            }
            System.out.println("-----------------------------");
        }
    }

    // 关闭资源
    private static void closeResources() {
        try {
            if (connection != null) connection.close();
            if (scanner != null) scanner.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

注意:JDBC_URL中的xx.xx.xx.xx要替换成数据库绑定的弹性公网IP,xxxx要替换成数据库名称;PASSWORD中的xxxx要替换成登录数据库的密码。

5.4 运行代码

运行代码后,先选择用户注册,再选择开始抽奖:

若出现以下错误:

Invalid or unsupported by client SCRAM mechanisms

则需要重置密码:

重置密码后,回到数据库参数管理界面,点击高风险参数,输入password_lock_time搜索,将password_lock_time的值改为0并保存。

即可重新登录。

注意:代码中需要重新配置新密码。

代码运行成功之后,我们在数据库SQL查询页面,可以看到代码中创建的用户表和抽奖记录表:

至此就完成了从云开发环境到GaussDB创建应用连接的全部流程了。

六、反馈改进建议

如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值