0
BASES DE DATOS CON JAVA

BASES DE DATOS CON JAVA

FUNDAMENTOS

CARNEL,JOHN

63,50 €
IVA inclós
No disponible, consulti'ns
Editorial:
ANAYA, COMERCIAL GRUPO
Any d'edició:
2002
ISBN:
978-84-415-1362-4
Pàgines:
960
Col·lecció:
VARIAS
63,50 €
IVA inclós
No disponible, consulti'ns
Afegir a favorits

Introducción

¿A quién va dirigido este libro?

¿De qué trata este libro?

Sección I: Java, SQL y Bases de datos

Sección II: Exploración de JDBC

Parte III: Paso de objetos a relaciones

Sección IV: Bases de datos y Java en la empresa

Sección V: Apéndices

Qué necesita para utilizar este libro

Convenciones empleadas

Cómo funciona

Obtener el código fuente

Díganos lo que piensa

Erratas

Configuración del entorno Java

Instalación del JDK

Definir la variable JAVA_HOME

Definir la variable PATH

Definir la variable CLASSPATH

Estructura de los directorios para los ejemplos





1. Bases de datos relacionales y Java



Datos persistentes

Persistencia en Java

Ficheros planos

Serialización de objetos

Bases de datos relacionales

Asociaciones relacionales

Structured Query Language

Cómo interactúa Java con bases de datos

JDBC

SQLJ

EJB

JDO

Características de un RDBMS

Transacciones

Acceso concurrente

Lenguajes propietarios

Elección del RDBMS para este libro

Cloudscape

Instalación de Cloudscape

Otros aspectos útiles de Cloudscape

Instalación de la base de datos de ejemplo

Oracle

Microsoft SQL Server

IBM

Bases de datos de código libre

Bases de datos personales

Resumen





2. JDBC: Técnicas básicas



Terminología y conceptos

SQL y JDBC

Relacionar JDBC con ODBC

El paquete JDBC

Versiones de JDBC

JDBC 1.x

JDBC 2.0

El núcleo del API JDBC 2.0

El paquete opcional del API JDBC 2.0

JDBC 3.0

Cómo funciona JDBC

Preparación

Cargar el driver

Establecer una conexión

URLs y JDBC

Conexión con otras bases de datos

Statements y ResultSets

Acceder a datos en un ResultSet

Obtener los metadatos de un resultado

El programa JDBC básico

Gestión de errores

SQLException

El Mensaje de la Excepción

El Estado SQL

Código de Error del Fabricante

Encadenar excepciones SQL

Advertencias SQL

Resumen





3. Consultas y manipulación de datos en SQL



Una sencilla historia de SQL

¿Qué es SQL?

SQL y la teoría de conjuntos

Acceso a datos mediante SELECT

Estructura básica del comando SELECT

Especificar las columnas

Seleccionar registros no repetidos

Dar formato a SQL

Cálculos

Construcción de fórmulas

Especificar los nombres de columna

Expresiones con funciones

Tipos de datos en SQL

Tipos de datos y cálculos

Ordenar datos

Obtener sólo los primeros n registros

Aplicar condiciones a una sentencia SELECT

Indicar varias condiciones

Búsquedas aproximadas

Consideraciones especiales sobre los valores Null

Gestionar los valores Null

Uso de grupos con funciones estadísticas

Restricciones de campos con GROUP BY

Uso de HAVING con GROUP BY

Realizar consultas con varias tablas

Sintaxis alternativa para las uniones internas

Cómo funcionan las uniones internas

Uniones cruzadas

Cómo funcionan las uniones cruzadas

Uniones externas

Unión externa izquierda

Unión externa derecha

Unión externa completa

Sintaxis alternativa para las uniones externas

Uso de tablas dinámicas

Resumen





4. Creación de tablas y modificación de datos con SQL



Crear y modificar tablas con SQL

Crear tablas

Limitación de clave principal

Limitación de clave externa

La limitación CHECK

Valores por defecto

Modificar tablas con SQL

Añadir nuevas columnas o eliminar columnas

Añadir limitaciones

Eliminar limitaciones

Eliminar tablas

Añadir, modificar y eliminar datos

Añadir datos a las tablas

Inserciones en varias filas

Eliminar datos de las tablas

DELETE frente a TRUNCATE

DELETE y las claves externas

Actualizar los datos de las tablas

Proceso transaccional

Resumen





5. Conceptos de diseño de bases de datos relacionales



Comprender cómo se hacen las cosas

El diseño conceptual

Entidades, atributos y valores

Desarrollo del diseño lógico

Interacciones y relaciones entre entidades

Entidades y relaciones en la base de datos

Definir las relaciones

Claves principales

Sobre el orden de las columnas

Claves externas

Relaciones uno a uno

Relaciones de uno a muchos

Integridad referencial

El proceso de normalización

Primera forma normal

Segunda forma normal

Tercera forma normal

Forma normal de Bryce-Codd

Cuarta forma normal

Quinta forma normal

¿Hasta dónde debe normalizar?

Integridad de datos

Diseño físico y ajuste

Uso de índices

Uso de vistas y procedimientos almacenados

Vistas

Procedimientos almacenados

Alarmas

Ajuste del rendimiento

Pruebas de carga

Optimización de consultas y procedimientos

Crear y mantener estadísticas

Resumen





6. Estudio de un caso: Diseñar la base de datos Music Store



El problema

Reunir los requisitos

Diseño de Music Store: el diseño de la lógica

Establecer interacciones entre entidades

Diseñar la base de datos Music Store: el diseño físico

¿Qué sistema de gestión de bases de datos (DBMS)?

Convenciones de nombres

Diseñar la base de datos

Los diagramas ERD

El área tipo pedidos de clientes

Tablas del modelo de datos

Las tablas del área tipo discos

Recordings

AudioStyles

Las tablas del área tipo tiendas

Tablas del área tipo cliente

Customers

Las tablas del área tipo pedidos

CustomerOrders

CustomerOrderItems

Poblar las tablas con datos de muestra

Insertar valores

Utilizar secuencias

Utilizar columnas auto numeradas

Actualizar valores

Eliminar valores

Construir soporte para consultas, vistas y procedimientos almacenados

Construir una vista de los inventarios

Un procedimiento almacenado para todos los valores del inventario

Utilizar un activador para generar valores secuenciados

Resumen





7. Desarrollo de una aplicación JDBC



Modelar objetos

Escenas de aplicación

Elegir un driver

Tipo 1: El driver puente JDBC-ODBC

Ventajas del driver puente

Desventajas del puente

Tipo 2: Driver API Nativo / parte java

Ventajas

Inconvenientes

Tipo 3: Driver protocolo de red/ todo Java

Ventajas

Inconvenientes

Tipo 4: Driver protocolo nativo/todo Java

Ventajas

Inconvenientes

Arquitecturas de aplicación

Protocolos de red para Windows NT y 98

Consideraciones en la selección de los driver JDBC

Utilizar datos relacionales en nuestra aplicación

¿Dónde se originan los datos?

Acceso directo a los datos

Crear una capa de persistencia de datos

Elegir nuestra aproximación

Utilizar un ResultSet

Ventajas

Limitaciones

Utilizar un RowSet

Ventajas

Limitaciones

Transformar un ResultSet en una representación de un objeto Java

Ventajas

Limitaciones

Transformar el ResultSet en una representación XML

Ventajas

Limitaciones

Tomando decisiones de un modo más sencillo

Integración de objetos y bases de datos relacionales

Integración entre los tipos de datos Java y SQL

Integrar datos relacionales en objetos Java

Una estrategia mejor de integración

Resumen





8. Conectar con una base de datos



La clase DriverManager

El método getConnection()

Asignar la desconexión por tiempo de registro (login timeout)

Identificar operaciones con el driver JDBC

Conexiones

La clase Store

Continuación de la clase Store

Problemas con la clase Store01

Cerrar recursos

Duplicar el código de Connection

Utilizar ConnectionFactory

Implementar la flexibilidad

DataSources

Un vistazo al directorio

Utilizar un DataSource

Resumen





9. Utilizar las interfaces Statement y ResulSet



Utilizar objetos Statement

Ejecutar un Statement

Modificar datos utilizando un objeto Statement

Mejoras

Actualizar varias columnas

Actualizar columnas selectivamente

Métodos findByXXX

Utilizar objetos ResultSet

Recuperar datos de las columnas de un tipo específico

Trabajar con valores null

Trabajar con tipos especiales de datos

Restricciones del ResultSet

Movimientos a través de un ResultSet

Crear un objeto ResultSet arrastrable

Modificar datos utilizando un ResultSet

Crear un ResultSet actualizable

Métodos para actualizar un ResultSet

Novedades en JDBC 3.0

Resumen





10. Uso de metadatos



¿Qué son los metadatos?

DatabaseMetaData

Obtener la lista de una tabla

Uso de metadatos para obtener el esquema

ResultSetMetaData

Resumen





11. Uso de RowSets



Introducción a los RowSets

La interfaz RowSet

La clase CachedRowSets

La clase JdbcRowSet

WebRowSet

Resumen





12. Sentencias Preparadas



La interfaz PrepareStatement

Novedades en JDBC 3.0. ParameterMetaData

Tipos de datos SQL-99

Tipos integrados (built-in)

Tipos definidos por usuario

Tipos estructurados

Tipo distinct

Tipos construidos

Tipos locator

Novedades en JDBC 3.0

Métodos de la interfaz PrepareStatement

Resumen





13. Sentencias de llamada y procedimientos almacenados



Procedimientos almacenados

Encapsulación y reutilización

Control de transacciones

Estandarización

Requisitos de los procedimientos

Nombres

Parámetros IN

Parámetros OUT

Parámetros INOUT

Utilización de los parámetros

Tipo de los parámetros

Ejemplos de procedimientos

Ejemplo: Función almacenada

Soporte de procedimientos almacenados en bases de datos

Sentencias de llamada

Crear una sentencia de llamada

Utilizar placeholders

Actualizaciones en bloque

Obtener un ResultSet

Novedades en JDBC 3.0

Resumen





14. Transacciones



¿Qué son las transacciones?

Tamaño de las transacciones

Requisitos de las transacciones

Concurrencia en la base de datos

Bloqueos exclusivos y compartidos

Bloqueos de lectura y bloqueos de escritura

El bloqueo a nivel de tabla frente al bloqueo a nivel de fila

Bloqueo optimista y pesimista

Bloqueos mortales

El impacto de los bloqueos sobre el rendimiento

Niveles de aislamiento de las transacciones

Lectura no confirmada

Lectura confirmada

Lectura repetible

Serializable

Resumen del aislamiento

¿Qué niveles de aislamiento están soportados?

Control de transacciones en JDBC

Métodos de conexión para el control de transacciones

Transacciones y procedimientos almacenados

Actualizaciones en bloque

Transacciones distribuidas

Nuevo en JDBC 3.0: los puntos de almacenamiento

Utilización de transacciones en Music Store

Resumen





15. Conceptos de integración de objetos y bases de datos relacionales



Aplicación de la base de datos Recording

Integración de objetos y bases de datos relacionales

Ejemplo de implementación de una integración

Usar la clase Recording con columnas autonumeradas en Cloudscape

Aumentar la aplicación Recording

Añadir relaciones

Añadir una jerarquía de clases de Java

Resumen





16. Arquitectura de integración de objetos y bases de datos relacionales



Un vistazo a la integración de datos con JLF

Objetos de datos integrados

Integradores de datos

Archivos de propiedad de localización de datos

Integración de la tabla Recordings

Esquema de la base de datos para la clase Recording

Implementación de la clase Recording

Archivo de propiedad de localización de datos

Una aplicación compleja de la integración de datos JLF

Añadir una relación uno con uno

Añadir una relación uno con muchos

Implementación de la clase CustomerTrackedRecording

Ampliación de la implementación de la clase Customer

Ampliación de la implementación de la clase Recording

Implementación de la clase CustomerTrackingType

Añadir una jerarquía de objetos

Implementación de la clase VolumeCustomer

Implementación de la clase FrecuentBuyer

Implementación de la clase Corporation

Implementación de la clase NonProfitCorporation

Prueba con TestCustomerTracking

Dónde ir desde aquí: Opciones de integración de objetos y bases de datos relacionales

Resumen





17. Depuración y registro



Depuración eficaz

Manejo de excepciones

Olvidarse de liberar los recursos

Problemas de rendimiento

Técnicas de depuración

Registrar en System.out y System.err

Registro de excepciones

Seguimiento de recursos

Registro de los cronometrajes del rendimiento

Ventajas del registro en System.out y System.err

Limitaciones del registro en System.out y System.err

Ejecución de un depurador interactivo local

Manejo de excepciones

Seguimiento de recursos

Registro de los cronometrajes del rendimiento

Ventajas de la depuración interactiva local

Limitaciones de la depuración interactiva local

Ejecución de un depurador interactivo remoto

Depuración remota de los problemas típicos de aplicaciones Java de bases de datos

Ventajas de la depuración interactiva remota

Limitaciones de la depuración interactiva remota

Instrumentación de las aplicaciones

Pasos para instrumentar una aplicación

Criticidades de los eventos del sistema

Granularidad del registro

Estándares de instrumentación

Implementación de un esquema de registro

Instrumentación con JLF

Registro de excepciones

Seguimiento de recursos

Registro de los cronometrajes del rendimiento

Ventajas de la instrumentación de las aplicaciones

Limitaciones de la instrumentación de las aplicaciones

Resumen





18. DataSources de JDBC



Conceptos y terminología del DataSource

DataSources

Tipos de DataSources

¿Cómo funciona un DataSource?

Utilización del DataSource

Descripción de los directorios

Creación y utilización de un DataSource

Adaptación a Cloudscape

Pool de conexiones

Pool de conexiones personalizado

El pool de conexiones en la empresa

¿Qué más podemos hacer con un DataSource?

Resumen





19. J2EE y aplicaciones Java de bases de datos



El entorno de desarrollo

Una introducción a J2EE

Introducción a los componentes de J2EE

Tecnologías componentes

Los API de servicio

Explotar las características de los contenedores J2EE

Aplicaciones de bases de datos en la Web

Utilizar servlets

Simplificar el desarrollo de una base de datos con JSP

Una ojeada a JSP

JavaBeans

Integrar JavaBean en JSP

La página search.html

El pool de conexión

Enterprise JavaBeans

Revisión de EJB

Clasificación de los EJB

Contenedores EJB

Gestión de transacciones

Estructura de EJB

Persistencia gestionada por contenedor

Persistencia gestionada por bean

Desplegar un bean

Los EJB en la aplicación Music Store

¿Cuál es el método de persistencia más apropiado?

Implementar la clase Recording como un EJB

La aplicación cliente

La interfaz remota

La interfaz local

La implementación del bean

El descriptor de despliegue

Resumen





20. Exportar datos relacionales a XML



Analizadores XML

Los distintos tipos de analizadores XML

Bajar el analizador Xerces

Instalación del analizador XML

Integrar XML con bases de datos relacionales

Teoría relacional revisada

Integrar una sola tabla con XML

Ejecutar el ejemplo SimpleXMLData

Integrar una relación uno con muchos con XML

Utilizar una estrategia basada en contenido

Integración de una relación muchos con muchos en XML

Utilizar una estrategia basada en enlace

Estrategia basada en contenido vs. basada en enlace

Elementos vs. Atributos

Resumen





21. Utilizar XSLT



Introducción a XSLT

¿Cómo funciona XSLT?

XSLT y SQL

XSLT, XML y la transformación

Procesadores XSLT

Bajar el procesador de XSLT Xalan

Instalar el procesador de XSLT Xalan

Ejemplo 1: Transformar XML en HTML

Ejemplo 2: Transformar XML en un archivo plano

Sintaxis básica de XSLT

Buscar en un documento XML utilizando XPath

Problemas habituales con las consultas XPath en XSLT

Realizar un bucle a través de un documento XML

Aplicar lógica condicional en XSLT

Aplicaciones prácticas de XSLT

La pantalla de resumen de los pedidos de clientes

OrderSummary.jsp

CustomerOrder.java

orderSummary.xsl

¿Cuál es la gran cosa?

Resumen





22. La arquitectura modelo-vista-controlador



Los defectos de una aplicación normal

Arquitecturas de aplicación visitadas

Arquitectura de 2 capas

Arquitectura de 3 capas

Arquitectura de n capas

Arquitectura de aplicaciones: lecciones aprendidas

Introducción a la arquitectura MCV

Detalles de la arquitectura MVC

Controlador

controller.jsp

RequestHandler.java

Modelo

Anatomía de un modelo

The CustomerList EJB

Vista

La hoja de estilo customerList.xsl

Construir pantallas mejores

Construir el EJB AddressMaintenance

EJB AddressMaintenance

Construir los bean de entidad Customer y PostalCodes

Desplegar el EJB de entidad Customers

Desplegar el EJB de entidad PostalCodes

PostalCodes ejb-jar.xml

Desplegar el EJB CustomerList

EJB AddressMaintenance

Construir addressMaintenance.xsl

Desplegar el archivo addressMaintenance.xsl

Ejecutar la aplicación MVC de mantenimiento de direcciones

Algunos pensamientos finales

Resumen





A. Conectar con la base de datos Music Store



Conectar con Oracle

Una breve nota sobre las versiones de Oracle

Bajar Personal Oracle 8i

Instalar Personal Oracle 8i 8.1.7.0.0

Establecer un escuchador

Probar la instalación de Personal Oracle

Bajar la base de datos Music Store

Los scripts de Oracle

The Oracle_Create.sql Script

Drivers JDBC de Oracle

El driver JDBC/OCI de Oracle

El driver JDBC Thin de Oracle

Utilizar el driver JDBC Thin

Conectar con Cloudscape utilizando el driver RMI-JDBC

Conectar con Access

Establecer la base de datos

Utilizar el Bridge JDBC-ODBC

Depurar





B. Instalación del servidor de aplicaciones JBoss y el contenedor Web Tomcat



Instalación del servidor de aplicaciones JBoss

Localización del programa de instalación de JBoss

Desempaquetar los archivos de JBoss

Ejecución de JBoss

Iniciar JBoss con Tomcat

Configuración del JDBC en JBoss

Instalación de un driver JDBC en JBoss

Creación de un pool de conexiones JBoss

Instalación de Tomcat como aplicación autónoma

Iniciar el Tomcat

Detener el Tomcat





C. Pequeño manual de XML



¿Qué es un lenguaje de marcas?

Etiquetas y elementos

Atributos

¿Qué es XML?

Cómo se procesan los documentos XML

Los bloques de construcción básicos de XML

La declaración XML

Elementos

Atributos

Datos de carácter

Sector CDATA

Referencias de entidad

Instrucciones de procesamiento

Comentarios

Contexto del nombre o namespaces

Documet Type Definition DTD

La declaración autónoma

Declaraciones de elementos

Contenido elemento

Ejemplo 1:

Ejemplo 2:

Ejemplo 3:

Contenido mixto

Contenido solo texto

El modelo de contenido EMPTY

Modelo de contenido ANY

Declaraciones de atributos

El atributo tipo CDATA

El atributo tipo ID

El atributo de tipo IDREF

El tipo de atributo IDREFS

El atributo tipo ENTITY

El atributo tipo ENTITIES

El atributo tipo NMTOKEN

El atributo tipo NMTOKENS

Conjunto enumerado de valores

Declaración de atributos de notación

#REQUIRED

#IMPLIED

Declaraciones de valores por defecto

Declaraciones de valores #FIXED

Declaraciones de notación

Declaración de entidades

Entidades internas

Entidades externas

Entidades de parámetros

Entidades no analizadas

Secciones condicionales

Pensando en árboles

Un vistazo a la tecnología

Esquemas XML

El Document Object Model (DOM)

Simple API para XML (SAX)

XPATH





D. Soporte, erratas y p2p.wrox.com



Los foros en línea de p2p.wrox.com

Cómo inscribirse para recibir soporte

Por qué ofrece este sistema el mejor soporte

Comprobar las erratas en línea en www.wrox.com

Encontrar una errata en el sitio Web

Añadir una errata

Soporte a clientes

Redacción

Los autores

Lo que no podemos contestar

Cómo decirnos exactamente lo que piensa





Índice alfabético

Java es un potente y versátil lenguaje de programación que puede trabajar en todo tipo de entornos, desde servidores de aplicaciones middle-tier hasta clientes Web. Independientemente del tipo de aplicación que usted desarrolle y del tipo de máquina en la que se ejecute el código, su aplicación seguramente tendrá que acceder a datos almacenados en algún tipo de base de datos. Las bases de datos relacionales son la elección obvia en la mayor parte de las empresas, y han evolucionado espectacularmente en los últimos años hasta convertirse en potentes sistemas de gestión de bases de datos.



Este libro pretende mostrar cómo funcionan las bases de datos relacionales, y cómo emplear la interfaz JDBC para utilizarlas en sus programas Java. Se recogen desde los fundamentos básicos de SQL y dichas bases, hasta el desarrollo de sofisticadas aplicaciones de bases de datos en Java con soporte para otras tecnologías como XML y XSLT, con las que podrá programar en entornos corporativos con calidad profesional.



Bases de datos con Java es ideal para el programador que tiene unos ciertos conocimientos de Java que quiera aplicar y mejorar sus capacidades para construir aplicaciones de bases de datos en Java, o la interfaz de programación JDBC. En el caso de conocer poco Java, las explicaciones del texto le permitirán comprender los conceptos que se tratan, especialmente si procede de otro lenguaje como C o C++.

Articles relacionats

  • FANTASMA
    FANTASMA
    PÉREZ DE LAS HERAS, NEREA
    ¿CÓMO TE DESPIDES DE UNA PARTE DE TU CUERPO? UN RELATO ÍNTIMO Y UNIVERSAL SOBRE LA PÉRDIDA Y LA IDENTIDAD«Este duelo es un milagro en todos los sentidos. [...] Siento la inmensa fortuna de haber coincidido en la misma época que esta mente y este libro.»Sabina Urraca«Nerea Pérez de las Heras toma el camino menos evidente, que es donde suele encontrarse la literatura. [...] Un li...
    Disponibilitat inmediata

    19,90 €

  • CLAUS I LUCAS
    CLAUS I LUCAS
    KRISTOF, AGOTA
    Un clàssic modern. Una lliçó d’escriptura. Una lectura memorable i devastadora. Els bessons Claus i Lucas viuen en un país ocupat per forces estrangeres. Són enviats a una ciutat fronterera, fugint de la Guerra —una guerra—, que s’apropa al seu final. La seva àvia, una dona cruel i abjecta que viu en una caseta ruïnosa dels afores, els acollirà de mala gana. Els nois respondran...
    Disponibilitat inmediata

    24,95 €

  • LA VIDA NO SÓN MATEMÀTIQUES
    LA VIDA NO SÓN MATEMÀTIQUES
    OLIVER, JOAN MIQUEL
    Un retrat d'una vida molt poc matemàtica que cal veure amb tota la seva infinitat de matisos i colors. En aquests setanta-set microrelats o coverbos, Joan Miquel Oliver reflexiona sobre la condició humana, el pas del temps i la vida quotidiana, i ens fa viatjar a una Mallorca perduda a través dels seus records d'infantesa i d'adolescència, sempre amb la música de rerefons. A La...
    Disponibilitat inmediata

    21,90 €

  • EL TER. UNA BIOGRAFIA
    EL TER. UNA BIOGRAFIA
    DOT, ANNA
    El Ter. Una biografia és el relat d'una biògrafa que es proposa escriure la vida del riu que travessa el seu poble. A mesura que segueix el curs del Ter, la biògrafa s'endinsa en l'aventura de narrar la vida d'aquest riu més enllà dels límits que ella coneix Com s'escriu la biografia d'un riu? Quines paraules es necessiten per explicar la seva vida? El Ter. Una biografia explic...
    Disponibilitat inmediata

    22,90 €

  • EL ÚLTIMO CINE DE BARRIO
    EL ÚLTIMO CINE DE BARRIO
    ESCOBAR, MARIO
    CUANDO LAS LUCES SE APAGAN, LOS SUEÑOS NOS ILUMINAN. Vuelve uno de los autores españoles más leídos internacionalmente con más de un millón de ejemplares vendidos. UNA HISTORIA DE AMOR, PÉRDIDA Y ESPERANZA EN TIEMPOS DE GUERRA. Principios del siglo XX. En un Madrid vibrante donde los primeros cines abren sus puertas, el pequeño Rodolfo crece fascinado por la luz temblorosa del ...
    Disponibilitat inmediata

    22,90 €

  • ROMANCERO GITANO (EDICIÓN ILUSTRADA)
    ROMANCERO GITANO (EDICIÓN ILUSTRADA)
    GARCÍA LORCA, FEDERICO / ROS, ILU
    Cuando se cumplen 90 años sin Lorca, su Romancero gitano cobra una nueva vida bajo la mirada única de Ilu Ros, la aclamada autora de Federico. «Una nueva mirada a la sensibilidad de Lorca a través de la expresividad del dibujo».Edurne Portela Desde su publicación en 1928, el Romancero gitano no ha dejado de fascinar a generaciones de lectores por la oscura belleza de las metáf...
    Disponibilitat inmediata

    22,90 €