Friday, July 29, 2011

Creando la Base de Datos




Para hacer a nuestra aplicación persistente, necesitamos usar algún tipo de almacenamiento, en este tutorial emplearemos un servidor de bases de datos relacionales, para ser más específicos usaremos MySQL 5.

La aplicación es bastante simple, por lo que emplearemos únicamente una tabla para almacenar nuestros datos. La tabla la creamos con el siguiente script SQL:

CREATE SCHEMA IF NOT EXISTS `springtutorial` DEFAULT CHARACTER SET utf8 ;
USE `springtutorial` ;

CREATE  TABLE `springtutorial`.`movies` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`title` VARCHAR(45) NULL DEFAULT NULL ,
`director` VARCHAR(45) NULL DEFAULT NULL ,
`actors` VARCHAR(100) NULL DEFAULT NULL ,
`duration` INT(11) NULL DEFAULT NULL ,
PRIMARY KEY (`id`) )
AUTO_INCREMENT = 3;

Una vez creada nuestra base de datos vamos a empezar a realizar nuestras entidades. Las entidades son clases que representan a una tabla en una base de datos, éstas son especificadas por el estandar JPA (Java Persistence API) a través de implementaciones como Hibernate o TopLink.

Para tener  soporte de Hibernate en nuestro proyecto tenemos que editar el pom.xml y agregar las siguientes dependencias:
<dependency>
   <groupid>org.hibernate</groupid>
   <artifactid>hibernate-core</artifactid>
   <version>3.6.2.Final</version>
</dependency>
<dependency>
   <groupid>javassist</groupid>
   <artifactid>javassist</artifactid>
   <version>3.10.0.GA</version>
</dependency>

<dependency>
   <groupid>org.springframework</groupid>
   <artifactid>spring-orm</artifactid>
   <version>${org.springframework-version}</version>
</dependency>


Ahora empezaremos a mapear nuestra tabla para poder manejar libremente instancias de esa clase que representarán a un registro en la base de datos.

//Imports omitidos

@Entity
@Table(name="movies")
public class Movie {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String title;
private String director;
private String actors;
private Integer duration; 
//Getters y Setters
}
Una vez escrito el código presionamos: Ctrl + Shit + O para agregar automáticamente los imports necesarios. El anterior es un mapeo muy básico de los datos, a continuación detallo lo que hace cada anotación:
  • @Entity : Indica que ésta clase está mapeando hacia una tabla en una base de datos, aunque todavía no sabemos hacía que tabla lo hace.
  • @Table : Ya que sabemos que ésta clase es una entidad, indicamos hacía que tabla lo hace.
  • @Id : Pasando a las anotaciones que tienen efecto sobre los campos (columnas en la BD), tenemos esta anotación. Cada entidad debe de tener una "identificación" que regularmente es la llave primaria en la tabla, aunque puede ser también una llave compuesta por dos o más columnas de la tabla.
  • @GeneratedValue : Ahora que ya conocemos el campo que distingue a un registro de otro, debemos indicar cómo se obtiene este valor. Previamente en nuestra tabla definimos que el campo "id" sería autoincrementado; por lo anterior la técnica que usaremos es "Automática".
  • Nota: Los nombres de los campos deben coincidir con los nombres de las columnas en la tabla, sin embargo para mejor lectura del código y ayudar a la comprensión podemos hacer uso de la anotación @Column mediante la cual podemos indicar el nombre de la columna a la cual mapea.
Cabe mencionar que dentro de Eclipse (y STS) se tiene la opción de crear un proyecto de JPA, mediante el cuál se puede hacer un proceso de "ingeniería inversa" y generar las entidades directamente de la base de datos. Personalmente no recomiendo este método ya que, si bien funciona en mapeos básicos, al momento de tener relaciones entre tablas empieza a tener errores en los mapeos.
Ahora que ya tenemos la capa que mapea empezaremos a construir la siguiente capa, llamada "DAO", que tiene como propósito simplificar las operaciones de creación, lectura, actualización y borrado de registros.

3 comments:

  1. It's fun when you understand the code better than the language that's explaining it.

    ReplyDelete
  2. I have planned to make the english version of this tutorial, I hope to make a few more posts in english though is not my mother language.

    ReplyDelete
  3. Unfortunately its not my case hahaha

    ReplyDelete