最新案例動態,請查閲 《【案例共創】基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用》。小夥伴快來領取華為開發者空間進行實操吧!
本案例由開發者:小草飛上天提供
一、概述
1. 案例介紹
本案例通過本地IDEA連接華為雲開發環境,通過本地的IDEA進行遠程編程並連接GaussDB數據庫來構建抽獎小程序應用。
GaussDB 是華為自研的企業級分佈式關係型數據庫,具備強大的分佈式事務能力、同城多可用區部署、數據零丟失保障、PB級存儲擴展等特性。它支持高可用、高安全、彈性伸縮、一鍵部署、備份恢復和監控告警,適用於對性能、可靠性和擴展性有高要求的企業級應用場景。
華為開發者空間是為全球開發者打造的專屬開發者空間,致力於為每位開發者提供一台雲主機、一套開發工具和雲上存儲空間,匯聚昇騰、鴻蒙、鯤鵬、GaussDB、歐拉等華為各項根技術的開發工具資源,並提供配套案例指導開發者從開發編碼到應用調測,基於華為根技術生態高效便捷的知識學習、技術體驗、應用創新。
2. 適用對象
- 企業
- 個人開發者
- 高校學生
3. 案例時間
本案例總時長預計60分鐘。
4. 案例流程
説明:
- 用户進入華為開發者空間雲開發環境;
- 通過CLI工具連接雲開發環境;
- 獲取GaussDB實例並配置;
- 編寫應用代碼並連接數據庫,構建抽獎應用程序。
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創建應用連接的全部流程了。