Apuntes DAM

Chuleta de Acceso a Datos

Ficheros, JDBC, JPA/Hibernate, bases objeto-relacionales y MongoDB desde Java, con el código que más se repite.

Ponte a prueba con un simulacro

Ficheros con NIO

Path p = Path.of("datos", "clientes.csv");List<String> lineas = Files.readAllLines(p, StandardCharsets.UTF_8);Files.write(p, lineas);                          // sobrescribetry (Stream<String> s = Files.lines(p)) {        // grande: línea a línea  long n = s.skip(1).filter(l -> l.endsWith(";Sevilla")).count();}Files.createDirectories(p.getParent());try (Stream<Path> it = Files.walk(Path.of("."))) { … }
Tema: Manejo de Ficheros

Binarios, objetos y acceso aleatorio

DataOutputStream.writeInt/writeUTFTipos primitivos en binario; leer en el mismo orden
ObjectOutputStream.writeObjectSerializar; la clase implementa Serializable
transientAtributo que no se serializa
serialVersionUIDVersión de la clase serializada
RandomAccessFile(f, "rw")seek(pos) para ir a un registro de tamaño fijo
Posición del registro nn × tamaño del registro
Tema: Manejo de Ficheros

XML y JSON

DOMÁrbol completo en memoria: DocumentBuilder.parse(f)
SAX / StAXLectura por eventos para ficheros grandes
JAXB @XmlRootElementObjeto ↔ XML con anotaciones
Jackson ObjectMapperreadValue(json, Clase.class) · writeValueAsString(obj)
Gsonnew Gson().toJson(obj) · fromJson(json, Clase.class)
Tema: Manejo de Ficheros

JDBC

String url = "jdbc:postgresql://localhost:5432/tienda";try (Connection c = DriverManager.getConnection(url, user, pass);     PreparedStatement ps = c.prepareStatement(       "INSERT INTO productos(nombre, precio) VALUES (?, ?)",       Statement.RETURN_GENERATED_KEYS)) {  c.setAutoCommit(false);  for (Producto p : lista) {    ps.setString(1, p.nombre()); ps.setBigDecimal(2, p.precio());    ps.addBatch();  }  ps.executeBatch();  c.commit();}

executeQuery → ResultSet · executeUpdate → filas afectadas · CallableStatement para procedimientos. Nunca concatenar datos en el SQL.

Tema: Conectores JDBC

Entidad JPA

@Entity @Table(name = "pedidos")public class Pedido {  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;  @Column(nullable = false) private LocalDate fecha;  @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cliente_id")  private Cliente cliente;  @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, orphanRemoval = true)  private List<Linea> lineas = new ArrayList<>();}
Tema: Mapeo Objeto-Relacional (Hibernate/JPA)

EntityManager y JPQL

EntityManager em = emf.createEntityManager();em.getTransaction().begin();em.persist(pedido);                      // nuevo → gestionadoPedido p = em.find(Pedido.class, 7L);    // por clavep.setFecha(LocalDate.now());             // se guarda al hacer commitem.remove(p);em.getTransaction().commit(); List<Pedido> l = em.createQuery(    "SELECT p FROM Pedido p JOIN FETCH p.cliente WHERE p.fecha >= :d", Pedido.class)  .setParameter("d", desde).getResultList();

Estados: nuevo, gestionado, separado (detached) y eliminado. JOIN FETCH evita el problema N+1.

Tema: Mapeo Objeto-Relacional (Hibernate/JPA)

Objeto-relacional y orientadas a objetos

CREATE TYPE direccion AS (calle TEXT, cp TEXT)Tipo compuesto en PostgreSQL
telefonos TEXT[]Columna array
CREATE TABLE b (…) INHERITS (a)Herencia de tablas
(cliente).direccion.cpAcceder a un campo de un tipo compuesto
ObjectDB / db4oGuardan objetos Java sin mapeo a tablas
Tema: BD Objeto-Relacionales y Orientadas a Objetos

MongoDB desde Java

try (MongoClient cli = MongoClients.create("mongodb://localhost:27017")) {  MongoCollection<Document> col = cli.getDatabase("tienda").getCollection("productos");  col.insertOne(new Document("nombre", "Teclado").append("precio", 25));  for (Document d : col.find(Filters.gt("precio", 20)).sort(Sorts.ascending("precio")))    System.out.println(d.toJson());  col.updateOne(Filters.eq("nombre", "Teclado"), Updates.inc("stock", 5));}
Tema: Bases de Datos Documentales

Bases XML nativas

BaseX · eXist-dbGuardan documentos XML y se consultan con XQuery
XQuery Updateinsert node, replace value of node, delete node
XML:DB APIColecciones y recursos desde Java
Tema: Bases de Datos Documentales

Componentes de acceso a datos

DAOInterfaz con las operaciones de una entidad (CRUD)
RepositorioColección de objetos de dominio; JpaRepository en Spring
DTOObjeto plano para mover datos entre capas
Pool de conexionesReutilizar conexiones abiertas (HikariCP)
JavaBeanConstructor vacío, atributos privados, getters y setters, Serializable
Tema: Componentes de Acceso a Datos

Chuletas de otras asignaturas