本案例由开发者:小草飞上天提供
一、概述
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 |
| GaussDB | gaussdb.opengauss.xe.dn.s6.xlarge.x864.ha|4 vCPUs | 16 GB | 免费 | 60 |
| 虚拟私有云VPC | 标配 | 免费 | 60 |
| 弹性公网IP | 按流量计费 5Mbit/s | 0.8元/GB | 60 |
二、配置云开发环境
本案例中,使用华为云《开发者空间云开发环境使用指导》的“三、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万+

被折叠的 条评论
为什么被折叠?



