news 2026/2/16 10:20:18

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【案例共创】基于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创建应用连接的全部流程了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!