"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Aurora PostgreSQL Mastery: modelos Java e DAOs à prova de balas que farão sua equipe chorar de alegria

Aurora PostgreSQL Mastery: modelos Java e DAOs à prova de balas que farão sua equipe chorar de alegria

Publicado em 2024-11-08
Navegar:980

Ouçam, codificadores. Estou prestes a transmitir alguns conhecimentos que transformarão seu jogo Aurora PostgreSQL de amador para grande liga. Estamos falando de modelos Java e acessadores de banco de dados que farão seus desenvolvedores seniores chorarem de alegria e seus DBAs comprarem uma cerveja para você ou não (depende de quantos anos você tem).

Por que isso é importante:

  1. Desempenho: Modelos desleixados e DAOs podem transformar sua Aurora veloz em uma preguiça de sedativos.
  2. Manutenção: Faça isso direito e, no futuro, você enviará uma nota de agradecimento. Se errar, você estará depurando às 3 da manhã.
  3. Escalabilidade: esses padrões são o seu ingresso para lidar com milhões de registros sem suar a camisa.
  4. Eficiência de custos: Código eficiente significa custos Aurora mais baixos. Seu CFO pode até saber seu nome.

As regras de ouro dos modelos Aurora PostgreSQL e DAOs:

  1. Modelos não são apenas contêineres de dados estúpidos: Seus modelos devem trabalhar para ganhar a vida, não apenas ficar sentados com uma aparência bonita.
  2. DAOs são os seguranças do seu banco de dados: Eles decidem o que entra, o que sai e como isso acontece.
  3. Abrace o poder do JDBC: Aurora PostgreSQL fala JDBC fluentemente. Aprenda a responder.
  4. Prepare-se para o Inesperado: Aurora é confiável, mas a Lei de Murphy está invicta. Lide com essas exceções como um profissional.

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

Agora, vamos detalhar:

1. O modelo

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
}

Por que isso funciona:

  • Não é apenas um saco de dados. Possui métodos que encapsulam a lógica de negócios.
  • Ele usa tipos de dados apropriados (UUID para ID, Instant para carimbos de data e hora).
  • Ele cuida da validação e atualização de sua própria senha.

2. A interface 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);
}

Por que isso é demais:

  • É limpo e direto ao ponto.
  • Ele usa Opcional para resultados potencialmente ausentes.
  • Inclui uma combinação de CRUD básico e operações mais complexas.

3. A implementação do 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()
        );
    }
}

Por que isso é genial:

  • Ele usa instruções preparadas para evitar injeção de SQL.
  • Ele lida adequadamente com o gerenciamento de recursos com try-with-resources.
  • Ele mapeia entre tipos Java e tipos PostgreSQL corretamente.
  • Ele lança uma exceção personalizada para melhor tratamento de erros na pilha.

As dicas de um milhão de dólares:

1. Use pool de conexões

Aurora pode lidar com muitas conexões, mas não desperdice. Use HikariCP ou similar para pool de conexões.

2. Operações em lote para ações em massa

Quando você precisar inserir ou atualizar muitos registros, use operações em lote.

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. Aproveite as réplicas de leitura do Aurora

Use um DataSource separado para operações de leitura para distribuir a carga.

4. Não ignore as transações

Use transações para operações que precisam ser atômicas.

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. Use recursos específicos do Aurora

Aproveite a clonagem rápida do Aurora para testes e seus recursos superiores de failover no gerenciamento de conexões.

Conclusão:

Criar modelos Java e DAOs sólidos para Aurora PostgreSQL não envolve apenas escrever código que funcione. Trata-se de criar uma camada de dados que seja robusta, eficiente e pronta para tudo o que você fizer.

Lembre-se de que seus modelos e DAOs são a base de seu aplicativo. Acerte-os e você estará se preparando para o sucesso. Se errar, você estará construindo em areia movediça.

Agora pare de ler e comece a codificar. Seu banco de dados Aurora PostgreSQL está esperando para ser domesticado.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/nislamov/aurora-postgresql-mastery-bulletproof-java-models-and-daos-thatll-make-your-team-weep-with-joy-1jkb?1 Qualquer violação, entre em contato com [email protected] para excluir
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3