"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Dominio de Aurora PostgreSQL: modelos Java y DAO a prueba de balas que harán llorar de alegría a su equipo

Dominio de Aurora PostgreSQL: modelos Java y DAO a prueba de balas que harán llorar de alegría a su equipo

Publicado el 2024-11-08
Navegar:594

Escuchen, codificadores. Estoy a punto de compartir algunos conocimientos que transformarán su juego Aurora PostgreSQL de una hora amateur a una gran liga. Estamos hablando de modelos Java y accesores a bases de datos que harán que tus desarrolladores senior lloren de alegría y que tus DBA te inviten a una cerveza o no (depende de la edad que tengas).

Por qué esto es importante:

  1. Rendimiento: Los modelos descuidados y los DAO pueden convertir tu veloz Aurora en un perezoso con sedantes.
  2. Mantenibilidad: Hazlo bien y en el futuro enviarás una nota de agradecimiento. Si lo haces mal, estarás depurando a las 3 a.m.
  3. Escalabilidad: Estos patrones son su boleto para manejar millones de registros sin sudar.
  4. Eficiencia de costos: un código eficiente significa menores costos de Aurora. Es posible que su director financiero incluso sepa su nombre.

Las reglas de oro de los modelos y DAO de Aurora PostgreSQL:

  1. Los modelos no son solo contenedores de datos tontos: Tus modelos deben trabajar para ganarse la vida, no quedarse ahí sentados luciendo bonitos.
  2. Los DAO son los que protegen su base de datos: deciden qué entra, qué sale y cómo sucede.
  3. Aproveche el poder de JDBC: Aurora PostgreSQL habla JDBC con fluidez. Aprende a responderlo.
  4. Prepárese para lo inesperado: Aurora es confiable, pero la Ley de Murphy está invicta. Maneja esas excepciones como un profesional.

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

Ahora, analicémoslo:

1. El 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 qué funciona esto:

  • No es solo una bolsa de datos. Tiene métodos que encapsulan la lógica empresarial.
  • Utiliza tipos de datos apropiados (UUID para ID, Instant para marcas de tiempo).
  • Maneja su propia validación y actualización de contraseña.

2. La interfaz 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 qué esto es genial:

  • Es limpio y va al grano.
  • Utiliza Opcional para resultados potencialmente ausentes.
  • Incluye una combinación de CRUD básico y operaciones más complejas.

3. La implementación de 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 qué esto es genial:

  • Utiliza declaraciones preparadas para evitar la inyección de SQL.
  • Maneja adecuadamente la gestión de recursos con try-with-resources.
  • Se asigna correctamente entre los tipos de Java y los tipos de PostgreSQL.
  • Lanza una excepción personalizada para un mejor manejo de errores en la pila.

Los consejos del millón de dólares:

1. Utilice la agrupación de conexiones

Aurora puede manejar muchas conexiones, pero no desperdicies. Utilice HikariCP o similar para agrupar conexiones.

2. Operaciones por lotes para acciones masivas

Cuando necesites insertar o actualizar muchos registros, utiliza operaciones por lotes.

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. Aproveche las réplicas de lectura de Aurora

Utilice una fuente de datos separada para operaciones de lectura para distribuir la carga.

4. No ignores las transacciones

Utilice transacciones para operaciones que deban 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. Utilice funciones específicas de Aurora

Aproveche la clonación rápida de Aurora para realizar pruebas y sus capacidades superiores de conmutación por error en el manejo de su conexión.

La conclusión:

Crear modelos Java sólidos y DAO para Aurora PostgreSQL no se trata solo de escribir código que funcione. Se trata de crear una capa de datos que sea sólida, eficiente y esté lista para cualquier cosa que le arrojes.

Recuerde, sus modelos y DAO son la base de su aplicación. Hágalo bien y se estará preparando para el éxito. Si te equivocas, estarás construyendo sobre arenas movedizas.

Ahora deja de leer y comienza a codificar. Su base de datos Aurora PostgreSQL está esperando ser domesticada.

Declaración de liberación Este artículo se reproduce en: https://dev.to/nislamov/aurora-postgresql-mastery-bulletproof-java-models-and-daos-thatll-make-your-team-weep-with-joy-1jkb?1 Cualquiera infracción, comuníquese con [email protected] para eliminar
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3