«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Aurora PostgreSQL Mastery: пуленепробиваемые модели Java и DAO, которые заставят вашу команду плакать от радости

Aurora PostgreSQL Mastery: пуленепробиваемые модели Java и DAO, которые заставят вашу команду плакать от радости

Опубликовано 8 ноября 2024 г.
Просматривать:417

Слушайте, программисты. Я собираюсь поделиться некоторыми знаниями, которые превратят вашу игру Aurora PostgreSQL из любительского часа в высшую лигу. Мы говорим о моделях Java и средствах доступа к базам данных, которые заставят ваших старших разработчиков плакать от радости, а ваши администраторы баз данных купят вам пиво или нет (зависит от того, сколько вам лет).

Почему это важно:

  1. Производительность: Небрежные модели и DAO могут превратить вашу молниеносную Аврору в ленивца на успокоительных.
  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 для идентификатора, Instant для меток времени).
  • Он самостоятельно проверяет и обновляет пароль.

2. Интерфейс ДАО

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);
}

Почему это круто:

  • Все четко и по делу.
  • Он использует необязательный для потенциально отсутствующих результатов.
  • Он включает в себя сочетание базового 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. Используйте пул соединений

Аврора может обрабатывать множество соединений, но не будьте расточительны. Используйте 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 для тестирования и превосходными возможностями аварийного переключения при обработке соединений.

Итог:

Создание надежных моделей Java и DAO для Aurora PostgreSQL — это не просто написание работающего кода. Речь идет о создании надежного, эффективного и готового к любым задачам уровня данных.

Помните, что ваши модели и 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], чтобы удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3