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.
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/writeUTF | Tipos primitivos en binario; leer en el mismo orden |
|---|---|
| ObjectOutputStream.writeObject | Serializar; la clase implementa Serializable |
| transient | Atributo que no se serializa |
| serialVersionUID | Versión de la clase serializada |
| RandomAccessFile(f, "rw") | seek(pos) para ir a un registro de tamaño fijo |
| Posición del registro n | n × tamaño del registro |
XML y JSON
| DOM | Árbol completo en memoria: DocumentBuilder.parse(f) |
|---|---|
| SAX / StAX | Lectura por eventos para ficheros grandes |
| JAXB @XmlRootElement | Objeto ↔ XML con anotaciones |
| Jackson ObjectMapper | readValue(json, Clase.class) · writeValueAsString(obj) |
| Gson | new Gson().toJson(obj) · fromJson(json, Clase.class) |
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 JDBCEntidad 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.cp | Acceder a un campo de un tipo compuesto |
| ObjectDB / db4o | Guardan objetos Java sin mapeo a tablas |
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-db | Guardan documentos XML y se consultan con XQuery |
|---|---|
| XQuery Update | insert node, replace value of node, delete node |
| XML:DB API | Colecciones y recursos desde Java |
Componentes de acceso a datos
| DAO | Interfaz con las operaciones de una entidad (CRUD) |
|---|---|
| Repositorio | Colección de objetos de dominio; JpaRepository en Spring |
| DTO | Objeto plano para mover datos entre capas |
| Pool de conexiones | Reutilizar conexiones abiertas (HikariCP) |
| JavaBean | Constructor vacío, atributos privados, getters y setters, Serializable |
apuntesdam.com/subject/acceso-datos/chuleta
Chuletas de otras asignaturas
Entornos de DesarrolloProgramaciónLenguajes de MarcasBases de DatosSistemas InformáticosDesarrollo de InterfacesProgramación Multimedia y Dispositivos MóvilesProgramación de Servicios y ProcesosSistemas de Gestión EmpresarialDesarrollo Web en Entorno ClienteDesarrollo Web en Entorno ServidorDespliegue de Aplicaciones WebDiseño de Interfaces Web