Usar Apache Derby como base de datos

Puede ver una versión activa de este post en mi nuevo blog. He decidido dejar de publicar en este blog por éstas razones. Su filosofía es la misma que éste, pero espero no tener los problemas que me he encontrado aquí.

En este post vamos a aprender a usar Apache Derby como base de datos para nuestra aplicación Java. Seguiremos paso por paso un ejemplo de uso muy sencillo. Veamos:

Instalación

Lo primero que deberemos hacer es descargar la última versión de Apache Derby: página de descarga. La descarga recomendada sería la distribución binaria, que incluye las librerías, documentación y herramientas de ayuda.

Acto seguido descomprimimos la distribución a un directorio de nuestra elección, por ejemplo:

C:\Archivos de programa\Java\derby-10.6

Para poder usar derby, deberemos configurar nuestro entorno, es decir, deberemos establecer ciertas variables de entorno con los valores adecuados para poder ejecutar derby en nuestro PC. Suponiendo que vamos a usar Windows como sistema operativo, deberemos establecer las siguientes variables de entorno:

set DERBY_HOME=C:\Archivos de programa\Java\derby-10.6
set PATH=%DERBY_HOME%\bin;%PATH%

De esta forma conseguiremos tener accesibles los ejecutables de las herramientas proporcionadas por derby.

A partir de ahora, para poder utilizar derby en nuestros programas Java, sólo será necesario tener accesible la librería derby.jar en el classpath de nuestro programa.

Código de ejemplo

De acuerdo, ya sabemos lo que tenemos que hacer para poder usar derby. Pero, ¿cómo lo usamos?. A continuación vamos a estudiar varios fragmentos de código que nos permitirán crear una base de datos, crear una sencilla tabla en nuestra base de datos, insertar datos y realizar consultas. Para ello se presupone un conocimiento básico de lenguaje SQL. Si quieres aprender un poco más sobre él puedes aprender un poco en SQL Tutorial de W3C.

Crear una base de datos

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class CreateDataBase {

  public static void main(String[] args) {
    String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    String dbName = "/DerbyDB/ExampleDB";
    String dbParam = "create=true"; //la base de datos se creará si no existe todavía
    String connectionURL = "jdbc:derby:" + dbName + ";" + dbParam;
    Connection conn = null;

    try{
      Class.forName(driver);
    } catch(java.lang.ClassNotFoundException e) {
      e.printStackTrace();
    }

    try {
      conn = DriverManager.getConnection(connectionURL);

      Statement st = conn.createStatement();
      String sqlCreateTableUsers =
             "CREATE TABLE users ( " +
             "FirstName VARCHAR(20) NOT NULL, " +
             "LastName VARCHAR(20) NOT NULL, " +
             "idUser INTEGER NOT NULL CONSTRAINT idUser_PK PRIMARY KEY " +
             ")";
      // la sentencia SQL crea una tabla con 3 campos
      st.execute(sqlCreateTableUsers);

      System.out.println("La base de datos '" + dbName + "' se ha creado correctamente");
    }  catch (Throwable e)  {
      System.out.println("Error al crear la base de datos '" + dbName + "'");
      e.printStackTrace();
    } finally {
      try { conn.close(); }
      catch (Throwable t){}
    }
  }
}

Para ejecutar scripts SQL y realizar otras consultas, derby proporciona la herramienta ij, el uso de la cual lo podemos aprender de la siguiente guía: getting started with derby 10.6 (inglés).
Como el nombre de la base de datos es /DerbyDB/ExampleDB, la base de datos será creada en el directorio

C:\DerbyDB\ExampleDB

Insertar datos

Con el siguiente código seremos capaces de introducir datos en nuestra tabla:

String driver = "org.apache.derby.jdbc.EmbeddedDriver";
String dbName = "/DerbyDB/ExampleDB";
String connectionURL = "jdbc:derby:" + dbName;
Connection conn = null;

try{
  Class.forName(driver);
} catch(java.lang.ClassNotFoundException e) {
  e.printStackTrace();
}

try {
  conn = DriverManager.getConnection(connectionURL);

  Statement st = conn.createStatement();
  st.executeUpdate("INSERT INTO users VALUES('Jose', 'Olmedo', 1)");
  st.executeUpdate("INSERT INTO users VALUES('Maria', 'Hoz', 2)");

  System.out.println("Se han insertado dos registros");
} catch (Throwable e)  {
  System.out.println("Ha fallado la insercion de dos registros");
  e.printStackTrace();
} finally {
  try { conn.close(); }
  catch (Throwable t){}
}

Realizar consultas

Con el siguiente código, realizamos una consulta a nuestra tabla y mostramos por consola la información en ella almacenada:

String driver = "org.apache.derby.jdbc.EmbeddedDriver";
String dbName = "/DerbyDB/ExampleDB";
String connectionURL = "jdbc:derby:" + dbName;
Connection conn = null;

try{
  Class.forName(driver);
} catch(java.lang.ClassNotFoundException e) {
  e.printStackTrace();
}

try {
  conn = DriverManager.getConnection(connectionURL);

  Statement st = conn.createStatement();
  ResultSet rs=st.executeQuery("SELECT * FROM users");
  while (rs.next()){
    Integer idUser = rs.getInt("idUser");
    String first = rs.getString("FirstName");
    String last = rs.getString("LastName");
    System.out.println(idUser + " se llama: " + first + " " + last);
  }
  rs.close();
} catch (Throwable e)  {
  System.out.println("Ha fallado la consulta de datos");
  e.printStackTrace();
} finally {
  try { conn.close(); }
  catch (Throwable t){}
}

Espero que este post os sirva para poder utilizar derby como base de datos.

Para ejecutar scripts sql y realizar otras consultas contra una bbdd derby, existe la herramienta ij. El uso de esta herramienta lo podemos aprender de la siguiente guía: getting started with derby 10.6 (ingles).

Anuncios

Etiquetas: , , ,

30 responses to “Usar Apache Derby como base de datos”

  1. Omar HF says :

    Hola Que tan recomendable sería utilizar Derby para almacenamiento de catálogos o información estática para una aplicación en producción de alta demanda? Saludos!

    • txingo says :

      Hola Omar, si es una aplicación con muchos usuarios no creo que derby sea la solución adecuada. Creo que para eso MySQL sería mejor. Hay muchas bases de datos profesionales que cumplirán mejor el papel que necesitas.
      Derby es una base de datos para pequeños proyectos, así la veo yo.

  2. Otto says :

    Hay alguna vista grafica de apache derby, similar a Mysql o puedo crear la BD, Tablas y Consultas desde alguna linea de comando?
    Gracias.

  3. Otto says :

    Vi que ij es pura linea de comando, sin embargo:
    1. EXISTE ALGUNA INTERFAZ GRAFICA?
    2. En netbeans existe Java DB, hice una Base de datos, pero solo puedo hacer tablas, insert, select, update, PERO como hago un BACKUP.
    3. Como manejo la concurrencia, las transferencias, los usuarios, etc…
    NO LO LEI EN EL MANUAL, Gracias Txingo.

    • txingo says :

      Hola Otto,
      1. Como bien dices en tu punto dos, puedes utilizar Netbeans como interfaz gráfica para usar la base de datos.
      2. Para hacer un backup, puedes hacer simplemente una copia del directorio donde derby crea la base de datos. Derby es una base de datos que almacena toda la información dentro de un directorio, así que es muy sencillo hacer una copia de seguridad.
      3. Los temas de los que quieres saber más son conceptos avanzados, y la verdad, no sé si derby es la base de datos adecuada para usar dichos conceptos. Por ejemplo, derby no soporta varias conexiones simultáneas, luego no podemos hablar de concurrencia. Sobre los demás conceptos, lo siento, no te puedo ayudar.
      Saludos.

  4. Otto says :

    EXISTE ALGUNA DEMO, O UNA PRESENTACIÓN SOBRE COMO FUNCIONA APACHE DERBY, QUE EMPRESAS LA USARAN.

  5. Keily says :

    Disculpen mi atrevimiento pero soy una estudiante de informática y necesito aprender Apache derby por favor diganme si me pueden ayudar

  6. santos says :

    gracias es un muy buen post, amigo una pregunta:
    que debo hacer para que cuando cree el jar de la aplicacion, la base de datos tambien se integre al programa.
    me explico mejor:
    Cuando compilo con net beans me genera una carpeta llamada dist: esta contiene las librerias(carpeta lib) y el ejetutable(jar) y desearia que ahi quede la base de datos, asi solo llevo esto a otro equipo y funciona correctamente.
    no se si lo has hecho o me podrias indicar donde obtengo algo relacionado con derby y java en este sentido.
    gracias.

    • santos says :

      para que la base de datos quede dentro del proyecto tan solo debia colocar en ves de:
      String dbName = “/DerbyDB/ExampleDB”;
      esto:
      String dbName = “ExampleDB”;

      y asi cuando se ejecute crea la base en la misma hubicacion del ejecutable .

      de nuevo muchas gracias por toda la informacion.

  7. Yorman Urdaneta says :

    Hola no te imaginas lo mucho que me gustaria que me respondiras el comentario tengo un proble necesito hacer relaciones join en sql y necesito tener campos auto incrementable la ayuda que te pido es que me aclares si en sql plano se puede hacer auto incremento si se puede dime como, pues se Mysql y la sintaxis es diferente. y alcara de verdad no permite sintaxis mysql tine que ser sql puro ? como auto incremento la clave id auto_increment mysql ? Bueno gracias

    • txingo says :

      Hola Yorman,
      Todo lo que necesites saber sobre el SQL que admite derby lo puedes encontrar en el manual de referencia. El link es para la versión 10.6, pero actualmente derby va por la versión 10.9.
      Para contestar más concretamente a tu pregunta, en este enlace puedes ver la creación de una tabla cuya columna clave id es autoincrementable. En derby, para hacer un campo autoincrementable se utilizan las palabras reservadas GENERATED ALWAYS AS IDENTITY.

      • Yorman Urdaneta says :

        Muchas gracias por tu respuesta llevo una semana con esto de dery y ya lo manejo bien exceptuando la sintaxis sql que me a echo parecer un verdadero novato bueno gracias mi siguiente progleba es que mi programa es multihilo por doquier y cuando ejecuto la clase de BaseDeDatos tengo problemas pues las tablas se crean nuevamente donde se encuantre una intancia instancia de la misma ya que no reconose este sentencia create table if not exists bien leere tu manual y no logro resolver te preguntare y de nuevo mucha mucha mucha gracias eres una gran ayuda…

  8. José Luis says :

    Hola que tal
    antes que nada felicitarte por el post que está muy bueno.
    Tengo una duda con los còdigos de “Insertar datos” y “Realizar consultas”, la pregunta es cómo utilizo esos códigos, creo una nueva clase, los copio al final del codigo de “Crear una base de datos” (en la misma clase) o como?..soy nuevo en java así que agradezco de antemano tu pronta respuesta.
    Saludos

    José dese Guatemala

    • txingo says :

      Hola José,
      En principio el código está pensado para poder ser utilizado de forma independiente, de forma que podrías tener clases distintas.
      Normalmente, se suele agrupar en una misma clase el código que te permita realizar consultas e insertar datos sobre una misma entidad, por ejemplo, en la clase UserDatabase, tendrías dos métodos: insertUser y queryUser (para insertar y consultar usuarios respectivamente).
      Espero haberte aclarado tu duda.

      • José Luis says :

        ok! te agradezco tu respuesta, pero los códigos de “Insertar Datos” y “Realizar consultas” yo los copio a Netbeans y no pasa nada, bueno mas bien me marca una infinidad de errores!, mi duda es cómo hago que funcionen esos códigos???, el codígo de “Crear base de datos” anda de maravilla pero los otros dos no sé como hacerlos funcionar, agradezco tu respuesta

  9. os says :

    y el metodo para eliminar??

  10. LuisCaam says :

    disculpa sabes cuantas base de datos puede soportar apache derby, y cuantas tablas… quisiera saber mas de sus caracteristicas particulares! GRACIAS!

    • rchavarria says :

      Hola,
      Pues la verdad es que no conozco esas limitaciones, no sé cuántas bases de datos ni cuántas tablas puedes crear. En la documentación de Derby 10.10 puede que encuentres la información que buscas, pero en mi opinión, si necesitas varias bases de datos y muchas tablas en cada una, te recomendaría otras herramientas: como MariaDB o PostgreSQL.

  11. yuly says :

    necesito ayuda es ke estoy trabajando netbeans con base de datos derby pero cuando voy hacer las consultas me bota error y dice que la consulta a fallado y que el esquema admin no existe admin es el usuario cuando cree la base de datos en derby pero no se porq me sale ese error

    • rchavarria says :

      Que hay yuly! Puedes revisar la documentación oficial de Apache Derby, en concreto el inicio rápido te dará una idea de los pasos iniciales que deberías dar.
      También he encontrado este tutorial sobre cómo usar Derby con Netbeans, pero no lo he probado, por lo que no te puedo asegurar que consigas resultados, lo siento.
      Si quieres más ayuda, te agradecería que siguiéramos con la conversación en mi nuevo blog, Usar Apache Derby como base de datos. Escribe un comentario en el post similar a éste y cuéntame más detalles del error que tienes.

  12. martific says :

    Tengo que hacer una aplicación Java de escritorio de comparación de tablas, alguna de ellas con mas de 6 millones de registros. La base de datos tiene que ser embebida. ¿Crees que la mejor solución puede ser utilizar Derby o sino cuál?. También me han comentado la posibilidad de utilizar hibernate. Gracias

    • rchavarria says :

      Hola Martific, como base de datos embebida Derby está muy bien. Es sencilla y muy fácil de trabajar con Java. Lo que no tengo tan claro es utilizar una base de datos embebida para el volumen de datos que vas a manejar. Si por alguna razón, Derby no cumple con lo que necesitas, quizá puedas echarle un vistazo a HSQLDB. No te sabría decir si es mejor o peor que Derby, pero al menos tienes alguna alternativa.
      Espero haberte sido de ayuda, te deseo lo mejor con tu proyecto.

  13. jael says :

    COMO PUEDO SABER QUE CAMPOS TIENE UNA TABLA?

  14. Moises says :

    buen aporte gracias capo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: