一、概述
1. 案例介绍
本案例通过本地 IDEA 连接华为云开发环境,通过本地的 IDEA 进行远程编程并连接 GaussDB 数据库来构建抽奖小程序应用。
GaussDB 是华为自研的企业级分布式关系型数据库,具备强大的分布式事务能力、同城多可用区部署、数据零丢失保障、PB 级存储扩展等特性。它支持高可用、高安全、弹性伸缩、一键部署、备份恢复和监控告警,适用于对性能、可靠性和扩展性有高要求的企业级应用场景。
华为开发者空间是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。
2. 适用对象
3. 案例时间
本案例总时长预计 60 分钟。
4. 案例流程
说明:
用户进入华为开发者空间云开发环境;
通过 CLI 工具连接云开发环境;
获取 GaussDB 实例并配置;
编写应用代码并连接数据库,构建抽奖应用程序。
5. 资源总览
本案例预计花费 0.8 元。
二、配置云开发环境
本案例中,使用华为云《开发者空间云开发环境使用指导》的“三、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 创建应用连接的全部流程了。
评论