最新案例動態,請查閲 《【案例共創】基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用》。小夥伴快來領取華為開發者空間進行實操吧!

本案例由開發者:小草飛上天提供

一、概述

1. 案例介紹

本案例通過本地IDEA連接華為雲開發環境,通過本地的IDEA進行遠程編程並連接GaussDB數據庫來構建抽獎小程序應用。

GaussDB 是華為自研的企業級分佈式關係型數據庫,具備強大的分佈式事務能力、同城多可用區部署、數據零丟失保障、PB級存儲擴展等特性。它支持高可用、高安全、彈性伸縮、一鍵部署、備份恢復和監控告警,適用於對性能、可靠性和擴展性有高要求的企業級應用場景。

華為開發者空間是為全球開發者打造的專屬開發者空間,致力於為每位開發者提供一台雲主機、一套開發工具和雲上存儲空間,匯聚昇騰、鴻蒙、鯤鵬、GaussDB、歐拉等華為各項根技術的開發工具資源,並提供配套案例指導開發者從開發編碼到應用調測,基於華為根技術生態高效便捷的知識學習、技術體驗、應用創新。

2. 適用對象

  • 企業
  • 個人開發者
  • 高校學生

3. 案例時間

本案例總時長預計60分鐘。

4. 案例流程

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System

説明:

  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工具安裝、環境配置、創建雲開發環境、開機、建立隧道連接的功能。

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_02

三、IntelliJ IDEA直連雲開發環境

參考《本地IntelliJ IDEA 基於華為開發者空間雲開發環境的應用開發》的“三、本地IDE直連雲開發環境完成上傳下載”中的“1.下載IntelliJ IDEA並連接遠程開發環境”章節完成IntelliJ IDEA直連雲開發環境。

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_開發環境_03

四、獲取GaussDB數據庫實例並配置

4.1 獲取GaussDB數據庫實例

默認情況下GaussDB數據庫實例已開通,如未開通可參考:購買GaussDB實例

在GaussDB數據庫實例的基礎信息頁修改安全組,開放22端口與8000端口:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_04

新建數據庫,數據庫名稱:PrizeDrawDB,其他參數默認即可:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_數據庫_05

4.2 修改GaussDB數據庫密碼驗證方式

進入GaussDB數據庫控制枱,進入GaussDB實例,點擊參數管理,修改GaussDB的密碼驗證參數 password_encryption_type 為 1,並點擊保存生效。

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_數據庫_06

在彈出窗口輸入YES,點擊確定按鈕:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_數據庫_07

五、使用雲開發環境完成抽獎小應用開發

5.1 新建遠程項目

項目名稱:PrizeDrawApp;

Location:/home/developer;

Build system:Maven;

JDK默認即可。

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_開發環境_08

java項目創建完成後,則可以看到相應的代碼目錄:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_09

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項目,下載依賴:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_10

5.3 編寫項目代碼

替換Main.java中的代碼:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_11

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 運行代碼

運行代碼後,先選擇用户註冊,再選擇開始抽獎:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_12

若出現以下錯誤:

Invalid or unsupported by client SCRAM mechanisms

則需要重置密碼:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_開發環境_13

重置密碼後,回到數據庫參數管理界面,點擊高風險參數,輸入password_lock_time搜索,將password_lock_time的值改為0並保存。

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_System_14

即可重新登錄。

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

代碼運行成功之後,我們在數據庫SQL查詢頁面,可以看到代碼中創建的用户表和抽獎記錄表:

基於IDEA連接雲開發環境並結合GaussDB構建JAVA程序抽獎小應用_開發環境_15

至此就完成了從雲開發環境到GaussDB創建應用連接的全部流程了。