」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Aurora PostgreSQL 掌握:讓您的團隊喜極而泣的防彈 Java 模型和 DAO

Aurora PostgreSQL 掌握:讓您的團隊喜極而泣的防彈 Java 模型和 DAO

發佈於2024-11-08
瀏覽:460

听着,代码骑师。我即将提供一些知识,帮助您将 Aurora PostgreSQL 游戏从业余游戏转变为大联盟游戏。我们谈论的是 Java 模型和数据库访问器,它们会让您的高级开发人员喜极而泣,而您的 DBA 是否会给您买啤酒(取决于您的年龄)。

为什么这很重要:

  1. 性能:草率的模型和 DAO 可以将你快如闪电的 Aurora 变成服用镇静剂的树懒。
  2. 可维护性:做好这一点,将来您将发送一封感谢信。如果出错,你将在凌晨 3 点进行调试。
  3. 可扩展性:这些模式是您轻松处理数百万条记录的门票。
  4. 成本效率:高效的代码意味着更低的 Aurora 成本。您的首席财务官甚至可能知道您的名字。

Aurora PostgreSQL 模型和 DAO 的黄金法则:

  1. 模型不仅仅是愚蠢的数据容器:你的模型应该为他们的生活而工作,而不仅仅是坐在那里看起来很漂亮。
  2. DAO 是数据库的保镖:它们决定什么进入、什么退出以及如何发生。
  3. 拥抱 JDBC 的力量:Aurora PostgreSQL 可以流利地使用 JDBC。学会说回来。
  4. 为意外做好准备:奥罗拉是可靠的,但墨菲定律是不败的。像专业人士一样处理这些异常。

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

现在,让我们来分解一下:

1. 模型

public class User {
    private UUID id;
    private String email;
    private String hashedPassword;
    private Instant createdAt;
    private Instant updatedAt;

    // Constructors, getters, and setters omitted for brevity

    public boolean isPasswordValid(String password) {
        // Implement password hashing and validation logic
    }

    public void updatePassword(String newPassword) {
        this.hashedPassword = // Hash the new password
        this.updatedAt = Instant.now();
    }

    // Other business logic methods
}

为什么有效:

  • 这不仅仅是一个数据包。它具有封装业务逻辑的方法。
  • 它使用适当的数据类型(UUID 表示 ID,Instant 表示时间戳)。
  • 它处理自己的密码验证和更新。

2.DAO接口

public interface UserDao {
    Optional findById(UUID id);
    List findByEmail(String email);
    void save(User user);
    void update(User user);
    void delete(UUID id);
    List findRecentUsers(int limit);
}

为什么如此震撼:

  • 简洁明了。
  • 它使用Optional来表示可能不存在的结果。
  • 它包括基本 CRUD 和更复杂的操作的组合。

3. DAO 的实施

public class AuroraPostgresUserDao implements UserDao {
    private final DataSource dataSource;

    public AuroraPostgresUserDao(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public Optional findById(UUID id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        try (Connection conn = dataSource.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setObject(1, id);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    return Optional.of(mapResultSetToUser(rs));
                }
            }
        } catch (SQLException e) {
            throw new DatabaseException("Error finding user by ID", e);
        }
        return Optional.empty();
    }

    @Override
    public void save(User user) {
        String sql = "INSERT INTO users (id, email, hashed_password, created_at, updated_at) VALUES (?, ?, ?, ?, ?)";
        try (Connection conn = dataSource.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setObject(1, user.getId());
            pstmt.setString(2, user.getEmail());
            pstmt.setString(3, user.getHashedPassword());
            pstmt.setTimestamp(4, Timestamp.from(user.getCreatedAt()));
            pstmt.setTimestamp(5, Timestamp.from(user.getUpdatedAt()));
            pstmt.executeUpdate();
        } catch (SQLException e) {
            throw new DatabaseException("Error saving user", e);
        }
    }

    // Other method implementations...

    private User mapResultSetToUser(ResultSet rs) throws SQLException {
        return new User(
            (UUID) rs.getObject("id"),
            rs.getString("email"),
            rs.getString("hashed_password"),
            rs.getTimestamp("created_at").toInstant(),
            rs.getTimestamp("updated_at").toInstant()
        );
    }
}

为什么这是天才:

  • 它使用准备好的语句来防止SQL注入。
  • 它通过 try-with-resources 正确处理资源管理。
  • 它在 Java 类型和 PostgreSQL 类型之间正确映射。
  • 它抛出一个自定义异常,以便更好地处理堆栈上的错误。

百万美元的秘诀:

1.使用连接池

Aurora 可以处理大量连接,但不要浪费。使用 HikariCP 或类似的连接池。

2.批量操作的批量操作

当需要插入或更新多条记录时,请使用批量操作。

public void saveUsers(List users) {
    String sql = "INSERT INTO users (id, email, hashed_password, created_at, updated_at) VALUES (?, ?, ?, ?, ?)";
    try (Connection conn = dataSource.getConnection();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {
        for (User user : users) {
            pstmt.setObject(1, user.getId());
            pstmt.setString(2, user.getEmail());
            pstmt.setString(3, user.getHashedPassword());
            pstmt.setTimestamp(4, Timestamp.from(user.getCreatedAt()));
            pstmt.setTimestamp(5, Timestamp.from(user.getUpdatedAt()));
            pstmt.addBatch();
        }
        pstmt.executeBatch();
    } catch (SQLException e) {
        throw new DatabaseException("Error batch saving users", e);
    }
}

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

3.利用Aurora的只读副本

使用单独的数据源进行读取操作以分散负载。

4. 不要忽视交易

将事务用于需要原子性的操作。

public void transferMoney(UUID fromId, UUID toId, BigDecimal amount) {
    String debitSql = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
    String creditSql = "UPDATE accounts SET balance = balance   ? WHERE id = ?";
    try (Connection conn = dataSource.getConnection()) {
        conn.setAutoCommit(false);
        try (PreparedStatement debitStmt = conn.prepareStatement(debitSql);
             PreparedStatement creditStmt = conn.prepareStatement(creditSql)) {
            debitStmt.setBigDecimal(1, amount);
            debitStmt.setObject(2, fromId);
            debitStmt.executeUpdate();

            creditStmt.setBigDecimal(1, amount);
            creditStmt.setObject(2, toId);
            creditStmt.executeUpdate();

            conn.commit();
        } catch (SQLException e) {
            conn.rollback();
            throw new DatabaseException("Error transferring money", e);
        } finally {
            conn.setAutoCommit(true);
        }
    } catch (SQLException e) {
        throw new DatabaseException("Error managing transaction", e);
    }
}

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

5. 使用 Aurora 特定的功能

利用 Aurora 的快速克隆进行测试,及其在连接处理中卓越的故障转移功能。

底线:

为 Aurora PostgreSQL 创建坚如磐石的 Java 模型和 DAO 不仅仅是编写有效的代码。它是关于打造一个强大、高效且可以满足您的任何需求的数据层。

请记住,您的模型和 DAO 是应用程序的基础。把它们做好,你就为成功做好了准备。如果弄错了,你就会在流沙上建造。

现在停止阅读并开始编码。您的 Aurora PostgreSQL 数据库正在等待被驯服。

版本聲明 本文轉載於:https://dev.to/nislamov/aurora-postgresql-mastery-bulletproof-java-models-and-daos-thatll-make-your-team-weep-with-joy-1jkb?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Python 物件導向程式設計簡介
    Python 物件導向程式設計簡介
    Python 编程语言 Python 是一种解释型、面向对象的编程语言。由于其高级内置数据结构和动态类型,它在快速开发新应用程序以及编写脚本代码以组合用不同语言编写的现有组件方面很受欢迎。 Python简单易学的语法强调可读性,从而降低了长期程序维护的成本和复杂性。它支持各种包含代...
    程式設計 發佈於2024-11-08
  • 最佳軟體比較中的頂級數據科學工具
    最佳軟體比較中的頂級數據科學工具
    介绍 到 2024 年,数据科学将通过使用复杂的分析、人工智能和机器学习推动决策,继续改变业务。随着对熟练数据科学家的需求不断增加,对能够加快操作、提高生产力并提供可靠见解的强大工具的需求也在增加。但是,有这么多可用的选项,目前哪种软件最适合专业人士? 这项比较研究探讨了 2024...
    程式設計 發佈於2024-11-08
  • 我如何將應用程式效能提高到
    我如何將應用程式效能提高到
    ⌛ 回顾时间 在我的上一篇博客中,我谈到了如何在短短 2 周内将应用程序大小从 75MB 减少到 34MB(查看!)。但这还不是全部,我还将我们应用程序的整体性能提高了 80%?. 让我们来看看如何!! ?传说 经过简单的一轮浏览后,我发现我们的应用程序中存在一些导...
    程式設計 發佈於2024-11-08
  • 為什麼 MySQL 會拋出「警告:mysql_fetch_assoc 參數無效」錯誤?
    為什麼 MySQL 會拋出「警告:mysql_fetch_assoc 參數無效」錯誤?
    MySQL 警告:mysql_fetch_assoc 的參數無效問題:嘗試從MySQL 檢索資料時資料庫時,遇到以下錯誤訊息:mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource解釋:The mysql...
    程式設計 發佈於2024-11-08
  • Django 查詢集可以透過模型屬性過濾嗎?
    Django 查詢集可以透過模型屬性過濾嗎?
    按模型屬性過濾 Django 查詢集Django 模型上的查詢通常使用標準過濾器根據預定義字段值選擇特定實例。但是,如果您需要根據模型中定義的自訂屬性進行過濾,該怎麼辦? 您可以透過模型屬性篩選查詢集嗎? 不幸的是,Django 的過濾器主要運行在資料庫級別,將它們轉換為 SQL 命令以有效地檢索資...
    程式設計 發佈於2024-11-08
  • 儘管配置正確,為什麼我無法在 Laravel 中發送 TLS 電子郵件?
    儘管配置正確,為什麼我無法在 Laravel 中發送 TLS 電子郵件?
    無法發送TLS 電子郵件:解決Laravel 證書驗證錯誤儘管啟用了不太安全的Gmail 設定並正確配置了Laravel 的.env 文件,您在傳送TLS 電子郵件時遇到憑證驗證失敗。錯誤訊息表示 SSL 操作失敗且無法驗證伺服器憑證。 要解決此問題,如果您的作業系統沒有自動管理受信任的憑證儲存區,...
    程式設計 發佈於2024-11-08
  • 使用 Wasmtime 和 Wasm3 將 Golang 編譯為 Wasm 時出現錯誤如何解決?
    使用 Wasmtime 和 Wasm3 將 Golang 編譯為 Wasm 時出現錯誤如何解決?
    使用Wasmtime 和Wasm3 將Golang 編譯為Wasm 時出現錯誤使用GOOS=js 將Golang 程式碼編譯為WebAssembly (WARCasm) GO =wasm go使用Wasmtime 或Wasm3 執行時,build -o main.wasm 可能會導致錯誤。讓我們調查...
    程式設計 發佈於2024-11-08
  • 如何存取 Iframe 的當前位置?
    如何存取 Iframe 的當前位置?
    訪問iframe 的當前位置:挑戰和解決方法跨源資源共享(CORS) 法規在嘗試檢索iframe 時帶來了重大挑戰iframe 的當前位置。此安全措施可防止駐留在不同來源的 JavaScript 程式碼直接存取頁面的 URL。 雖然使用JavaScript 存取iframe 的URL 不可行,但有其...
    程式設計 發佈於2024-11-08
  • Spring Security 與 JWT
    Spring Security 與 JWT
    In this article, we will explore how to integrate Spring Security with JWT to build a solid security layer for your application. We will go through ea...
    程式設計 發佈於2024-11-08
  • Google Sheets:如何花數小時建立 SUMIFS
    Google Sheets:如何花數小時建立 SUMIFS
    大家好!今天我想分享一个我创建的超级有用的脚本,用于解决日常生活中的常见问题。 如果您曾经尝试在 Google 表格中对“持续时间”求和,您可能已经注意到,SUMIF 和 SUMIFS 公式无法根据特定条件对事件或产品的持续时间求和。根据您需要执行的计算类型,这可能会成为一个障碍。但别担心! Goo...
    程式設計 發佈於2024-11-08
  • 如何將 Boehm 的垃圾收集器與 C++ 標準函式庫整合?
    如何將 Boehm 的垃圾收集器與 C++ 標準函式庫整合?
    整合 Boehm 垃圾收集器和 C 標準庫要將 Boehm 保守垃圾收集器與 C標準庫集合無縫集成,有兩種主要方法:重新定義運算符::new此方法涉及重新定義運算符::new以使用Boehm的GC。但是,它可能與現有 C 程式碼衝突,並且可能無法在不同編譯器之間移植。 明確分配器參數您可以使用而不是...
    程式設計 發佈於2024-11-08
  • WordPress 遷移外掛程式終極指南
    WordPress 遷移外掛程式終極指南
    迁移 WordPress 网站就像收拾房子搬到新房子一样。确保所有内容(内容、主题、插件、媒体文件甚至数据库)完美移动且没有任何损坏的挑战似乎令人望而生畏。但就像搬家公司让搬家变得更容易一样,WordPress 迁移插件简化了将网站从一台主机移动到另一台主机的复杂过程。 无论您是切换主机、从本地开发...
    程式設計 發佈於2024-11-08
  • 如何使用穩健的解決方案來增強 PHP 中的 HTML 抓取
    如何使用穩健的解決方案來增強 PHP 中的 HTML 抓取
    PHP 中強大的HTML 抓取解決方案由於其挑剔和脆弱的性質,在PHP 中使用正則表達式進行HTML抓取可能具有挑戰性。若要獲得更強大、更可靠的方法,請考慮使用專門建置的 PHP 套件。 強烈推薦的選項之一是 PHP Simple HTML DOM Parser。該庫擅長處理 HTML(包括無效標籤...
    程式設計 發佈於2024-11-08
  • 如何偵測 Go 標準輸入 (Stdin) 中的資料可用性?
    如何偵測 Go 標準輸入 (Stdin) 中的資料可用性?
    使用Go 檢測標準輸入(Stdin) 中的資料可用性在Go 中,可以使用以下技術檢查標準輸入流(os.Stdin) 中的資料:驗證其檔案大小。它的工作原理如下:os.Stdin 可以像任何常規文件一樣對待,允許我們檢查其屬性。為此,我們使用 os.Stdin.Stat() 檢索 FileInfo 物...
    程式設計 發佈於2024-11-08
  • Wasp:Web 開發中 Django 的 JavaScript 答案
    Wasp:Web 開發中 Django 的 JavaScript 答案
    Wasp v Django: Building a full stack application just got a lot easier Hey, I’m Sam, a backend engineer with a lot of experience with Django....
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3