SlideShare una empresa de Scribd logo
1 de 43
Descargar para leer sin conexión
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
TEMARIO DE CURSO
PROGRAMACIÓN JAVA SE
CAPÍTULO 16
PERSISTENCIA.
BASES DE DATOS EN JAVA
© Iñaki Martín
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional.
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏Para poder trabajar con BBDD, hay que hacer algunas configuraciones en el entorno de trabajo IDE que
estemos usando, y en el entorno del ordenador.
๏Necesitamos antes de nada:
‣ Un gestor BD instalado: Se debe tener el gestor con su BD tablas, etc, y arrancado. Podemos conecta
Java con la mayoría de los gestores del mercado (MySql, MariaDb, Oracle, PosgresSQL, Microsoft SQL
Server, DB2,...) En los ejemplos de este curso se usa MySql como modelo de bbdd, y como gestor,
podemos tenerlo arrancado desde XAMMP o herramientas similares
‣ Hay que obtener y añadir el driver al proyecto. Un driver son unas librerías (fichero con extension .jar, que
son clases java ya compiladas) que contienen los métodos de acceso al gestor de BD elegido.
• Obtener el driver: Si usamos MySql, el driver se puede descargar desde https://dev.mysql.com/
downloads/connector/j/5.1.html
(puede que la descarga sea un fichero zip, descomprimirlo y buscar el fichero jar, será algo asi como: mysql-connector-java-5.1.46.jar )
• Copiar el driver en algún directorio del proyecto. Esto no es obligatorio, pero si util, pues si el driver no
esta en el mismo workspace, se puede eliminar y afectaría al proyecto.
Yo personalmente las librerías las copio en el mismo proyecto, en un directorio libs o librerías, a la misma altura que el directorio src
• Añadir el driver al proyecto, esto es, decirle al proyecto que incorpore el driver como un fichero mas del
proyecto. Suele añadirse como cualquier otra librería. En Eclipse:
> propiedades del proyecto > java build path > Libraries > add external .jar > (elegir el jar con el driver).
Configuración de entorno
Configuración de entorno
2
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ Con la configuración indicada anteriormente, se puede crear y ejecutar un proyecto con bbd sin pegas
๏ Sin embargo, lo único que se ha hecho hasta ahora has sido incluir el driver para que el proyecto compile, en
el entorno de un equipo. Si el proyecto siempre se va a ejecutar en ese mismo workspace de Eclipse, no hay
problema
๏ El problema viene si el proyecto se exporta para usarse en otro eclipse, o por ejemplo, en un entorno de
producción. En este caso, el driver ha de existir en el nuevo entorno, para que el programa funcione, con lo
que pueden darse dos casos
‣ Que el entorno destino tenga el driver. Por ejemplo, si la aplicación se despliega (instala) en un
APPServer, que éste también tenga el driver para que funcione la aplicación
‣ Suministrar al APPServer el driver junto a la aplicación.
Esta ultima opción, que el Driver se “añada” a la aplicación y así vaya conjuntamente con ella, se puede
hacer en Eclipse configurando que lleve en el APPServer el driver junto a la aplicación. Esto se hace en
añadiendo el driver al java buildpath del proyecto, de este modo:
> propiedades del proyecto > deployment assembly > add > Java BuildPath Entries > (seleccionar el driver a incluir en
el despliegue)
Configuración de entorno
Configuración para despliegue de una aplicación
3
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ En toda aplicación que utilice JDBC para acceder a una base de datos, se distinguen tres fases o pasos a realizar en
el código de la aplicación:
1. Conexión con la base de datos. Consiste a su vez en dos subtareas:
a. Cargar el driver
b. Crear la conexión
2. Ejecución de sentencias SQL (bien sean de consulta o manipulación)
Si la sentencia es de consulta, además de ejecutar la sentencia, hay que procesar el resultado de la consulta
3. Cierre de la conexión
Ejecución de sentencias SQL
1 - Conexión con la base de datos
Fases de una app Java-JDBC
1.a Carga del driver
4
๏ Esta acción era necesaria hasta Java6. Desde Java6 en adelante, solo es necesario añadir el driver al java
buildpath del proyecto, como se explica en el punto anterior.
La responsable de poder eliminar este paso ha sido la API JDBC incorporada en Java 6 (JDBC 4.0)
๏ Si se trabaja con versiones anteriores a Java6 , es necesario decirle al proyecto qué driver tiene que usar, e
inicializarlo. Esto se realiza mediante el método estático forName() de la Clase Class, cuyo formato es:
Class.forName(String clase_driver)
Este método localiza, lee y enlaza dinámicamente el driver, devolviendo un objeto Class asociado a la clase indicada.
๏ Cuidado, la llamada a forName() puede provocar una excepción de tipo ClassNotFoundException.
Class.forName("com.mysql.jdbc.Driver"); // para un driver mysql
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // para un driver sun jdbc
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ Se lleva a cabo con el método estático getConnection() de la clase DriverManager del API JDBC. El
método getConnection() devuelve un objeto que implementa la interfaz Connection, la cual proporciona
varios métodos para manejar la conexión.
๏ El formato de este método es:
Connection.getConnection(String urlconexion)
๏ El string urlconexion representa la dirección de la base de datos a la que se desea acceder, y su formato es:
jdbc:subprotocolo:base_datos donde,
- subprotocolo depende del tipo de driver utilizado y
- base_datos es el nombre de la base de datos.
๏ getConnection tiene varias versiones sobrecargadas, las mas importantes;
Connection.getConnection(String urlconexion)
Connection.getConnection(String urlconexion, String usuario, String password)
๏ Al igual que sucede con la mayoría de los métodos de API JDBC, getConnection() puede provocar una
excepción de tipo SQLException que habrá que capturar.
1.b Creación de la conexión
5
// Para un driver JDBC-MYSQL con base de datos "agenda", usuario "root" y sin password (tipo XAMMP)
Connection miConexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", “root", "");
// Para un driver JDBC-ODBC y bbdd empresa
Connection miConexion =DriverManager.getConnection("jdbc:odbc:empresa");
// Para un driver JDBC-ORACLE con base de datos "info", usuario "luis" y password "12345"
Connection miConexion = DriverManager.getConnection(“jdbc:oracle:thin:@miservidor:1521:info”,“luis","12345");
// Para un driver JDBC-SQLITE con base de datos “mibasededatos.db"
Connection miConexion = DriverManager.getConnection(“jdbc:sqlite:C:/directorio1/db/mibasededatos.db”);
jdbc:mysql://localhost:3306/agenda_java
Ejemplo: jdbc
subprotocolo base de datos, en este caso con url de
acceso y con puerto, mas nombre de
base de datos (agenda_java)
Ejecución de sentencias SQL
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ Paso 1: crear la sentencia SQL que se desee ejecutar como un String. Ejemplos:
๏ Paso 2: crear un objeto de la interfaz Statement, con el objeto Connection antes creado, aplicando el método
createStatement()
๏ Paso 3: Aplicar el String con al sentencia en los distintos métodos de la interfaz Statement.
2 . Ejecución de sentencias SQL
6
Connection miConexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", "root", "");
Statement sentencia = miConexion.createStatement();
String orden = "create table personas";
String orden2 = "Update empleados set salario= salario*1.1");
String orden3 = "Update empleados set salario= " + nuevosalario - impuestos );
String orden4 = "SELECT nombre FROM empleados WHERE salario> " + tope );
CLASE DEVUELVE METODOS DESCRIPCION
Statement boolean .execute(String orden)
VALIDO TANTO PARA CONSULTAS COMO SENTENCIAS DE ACTUALIZACION (DCL, DDL, DML)
Envía a la base de datos la sentencia SQL proporcionada como parámetro en un String.
Si se trata de una consulta de acción (Insert, Update o Delete), el método devolverá false si no se
generan resultados (si falla)
Cuando es una consulta de selección (Select), el método devolverá true si funciona correctamente.
Statement int .executeUpdate(String sqlupdate)
VALIDO SOLO PARA SENTENCIAS DE ACTUALIZACION (DCL, DDL)
Envía una sentencia de acción a la base de datos
Actua casi igual que execute, solo que ahora devuelve el número de registros afectados por la acción.
Statement Resulset .executeQuery(String consulta)
VALIDO SOLO PARA SENTENCIAS DE CONSULTA (DML)
Envía una consulta de selección de registros a la base de datos, devolviendo un objeto ResultSet
Un objeto Resulset almacena el resultado de una select, luego almacena filas y columnas
Resulset tiene métodos para poder navegar por dichas filas y columnas .
Connection miConexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", "root", "");
Statement sentencia = miConexion.createStatement();
sentencia.execute(orden2);
int filasactualizadas = sentencia.executeUpdate(orden3);
ResultSet resultado = sentencia.executeQuery(orden4);
Ejecución de sentencias SQL
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
✓ Ante nada, hay que obtener un ResultSet .
‣ Un objeto ResultSet almacena el resultado de una select, luego almacena filas y columnas.
‣ ResultSet proporciona métodos para poder navegar por dichas filas y columnas.
‣ Un objeto ResultSet se obtiene al ejecutar el método executeQuery() del objeto Statement:
✓ Después se puede recorrer el ResultSet
De forma predeterminada, este objeto ResultSet posee la característica de ser de sólo avance y sólo lectura.
‣ Cuando se crea el objeto, un cursor queda apuntando delante del primer registro del ResultSet
‣ Para moverse por los registros, ResultSet proporciona el método next().
‣ La llamada a next() mueve el cursor al siguiente registro del conjunto,
devolviendo como resultado un boolean que indica si la nueva posición apuntada se corresponde
con un registro (true), o si el cursor se ha salido del conjunto (false).
‣ Utilizando next() con un while se puede ir avanzando por todos los registros del ResultSet
‣ ResultSet tiene más métodos para extraer el contenido de los campos una vez que el cursor se
posiciona en cada uno de los registros, o para acciones diversas sobre el ResultSet.
3 . Manipulación de registros de un ResutlSet
7
ResultSet resultado = sentencia.executeQuery("select nombre,edad from empleados");
Alicia 82
Ana 32
Carlota 18
Blas 34
Marina 15
Luis 56
Cursor
ResultSet
Alicia 82
Ana 32
Carlota 18
Blas 34
Marina 15
Luis 56
Cursor
tras un
next()
while(res.next())
{
//instrucciones
}
ResultSet
๏ Si la sentencia sql es de actualización, los métodos execute() y executeUpdate() efectúan la actualización y termina la
ejecución de la sentencia.
๏ Si la sentencia sql es de consulta, un executeQuery(), se devuelve un objeto ResultSet con la respuesta de la consulta,
que hay que procesar, con estas acciones:
Ejecución de sentencias SQL
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
✓ Una vez posicionado en un registro, se extraen los datos de cada campo del registro
‣ Para ello se usan otros métodos de ResultSet , según se desee leer por la posición del campo o por su nombre:
8
ResultSet res = sentencia.executeQuery("select nombre,edad from empleados");
while ( res.next() ) {
String elnombre = res.getString("nombre");
int laedad =res.getInt("edad");
System.out.println("Nombre:"+ elnombre + " Edad: "+laedad);
}
NOTA: Se muestran ejemplos de int, double y String, pero existen métodos similares para Date y Object y los long,
char, y otros tipos primitivos)
CLASE DEVUELVE METODOS DESCRIPCION
ResultSet int getInt( int posicion ) Devuelve un int correspondiente al campo de posicion pos en el registro
ResultSet double getDouble( int posicion ) Devuelve un double correspondiente al campo de posicion pos en el registro
ResultSet String getString( int posicion ) Devuelve un String correspondiente al campo de posicion pos en el registro
ResultSet int getInt( String nombrecampo ) Devuelve un String correspondiente al campo de nombre nombrecampo
ResultSet double getDouble( String nombrecampo ) Devuelve un String correspondiente al campo de nombre nombrecampo
ResultSet String getString(String nombrecampo ) Devuelve un String correspondiente al campo de nombre nombrecampo
ResultSet res = sentencia.executeQuery("select nombre,edad from empleados");
while ( res.next() ) {
String elnombre = res.getString(0);
int laedad =res.getInt(1);
System.out.println("Nombre:"+ elnombre + " Edad: "+laedad);
}
Alicia 82
Ana 32
Carlota 18
Blas 34
Marina 15
Luis 56
Extrayendo los campos por el nombre del campo:
Extrayendo los campos por la posición del campo en el registro:
ResultSet
Ejecución de sentencias SQL
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
✓ Además de los métodos vistos, existen otros métodos para actuar en el ResultSet
4 . Cierre de la conexión
9
CLASE DEVUELVE METODOS DESCRIPCION
ResultSet boolean isFirst() Devuelve true si el cursor apunta al primer registro
ResultSet double isBeforeFirst() Devuelve true si el cursor apunta antes del primer registro
ResultSet String isLast() Devuelve true si el cursor apunta al úlitmo registro
ResultSet isAfterLast()
Devuelve true si el cursor apunta detrás del ultimo registro, esto es, si ya se ha pasado por
todos los registros del resultset, bien por haberlos recorrido, bien por que la ejecución del
resultset no dio ningún registro
ResultSet int getRow() Devuelve la posición del registro actual, siendo "1" la posición del primer registro
ResultSet void updateString(pos, dato)
Modifica, en el registro del cursor, el valor del campo de posicion pos con el valor dato
Hay métodos similares para otros tipos de datos: updateInt, updateBoolean, ...
Necesita para confirmar el cambio ejecutar posteriormente updateRow()
ResultSet void updateRow() Hace efectivos los cambios del resultSet en la bbdd
ResultSet void moveToInsertRow()
Mueve el resultSet a un registro especial vacio, que sirve para crear nuevos registros.
Se modifica el nuevo registro con updateXXX(), y se ha de acabar con insertRow()
ResultSet void insertRow() Inserta el registro especial como un nuevo registro en el resultSet
๏ Se cierra una conexión mediante el método close() de la interfaz Connection:
๏ La interfaz Statement también dispone de un método close() para liberar el objeto Statement,
Este método debe ejecutarse antes de cerrar la conexión, si no, daría error.
๏ En cualquier caso, cuando se cierra una conexión, todos los objetos Statement que queden abiertos serán
cerrados automáticamente.
miConexion.close();
Ejecución de sentencias SQL
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ Ejemplo de ejecución de una sentencia de actualización
10Ejecución de sentencias SQL: ejemplo
class PruebasJDBC_SentenciaActualizacion {
static Connection vCon = null;
static String usuario = "root";
static String password = "";
static String urlDeConexion = "jdbc:mysql://localhost:3306/agenda_java";
public static void main(String[] args) {
try {
// FASE 1.1 - Cargamos primero el driver (solo necesario antes de Java6)
Class.forName("com.mysql.jdbc.Driver");
// FASE 1.2 - Establecemos la conexion con la base de datos
vCon = DriverManager.getConnection(urlDeConexion, usuario, password);
// FASE 2 - Creamos la sentencia SQL,
// A partir del connection se crea un objeto statement,
// y se guarda en el objeto la consulta
Statement st = vCon.createStatement();
String tsql = "Insert into contactos (nombre,direccion,telefono) "
+ "values('JUANCHO','ARENAL 3','53345333')";
// Ejecutamos la instruccion
st.execute(tsql);
// FASE 3 - Manipulacion de resultados (en este caso no hay)
} catch (ClassNotFoundException | SQLException ex) { // capturamos las dos excepciones juntas
ex.printStackTrace();
} finally {
try {
// FASE 4 - Cierre de la conexion
if (vCon != null) {
vCon.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 11Ejecucion de sentencias SQL: ejemplo
class PruebasJDBC_SentenciaConsulta {
static Connection vCon = null;
static String usuario = "root";
static String password = "";
static String urlDeConexion = "jdbc:mysql://localhost:3306/agenda_java";
public static void main(String[] args) {
try {
// FASE 1.1 - Cargamos primero el driver (solo necesario antes de Java6)
Class.forName("com.mysql.jdbc.Driver");
// FASE 1.2 - Establecemos la conexion con la base de datos
vCon = DriverManager.getConnection(urlDeConexion, usuario, password);
// FASE 2 - Creamos la sentencia SQL, A partir del connection se crea
// un objeto statement, y se guarda en el objeto la consulta
Statement st = vCon.createStatement();
// FASE 3 - Manipulacion de resultados
// Ejecutamos la instruccion y recogemos en un ResultSet los registros
String sqlConsulta = "select nombre, edad from contactos";
ResultSet res = st.executeQuery(sqlConsulta);
while ( res.next() ) {
String elnombre = res.getString("nombre");
int laedad =res.getInt("edad");
System.out.println("Nombre:"+ elnombre + " Edad: "+laedad);
}
} catch (SQLException ex) {
} finally {
try {
// FASE 4 - Cierre de la conexion
if (vCon != null) {
vCon.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
๏ Ejemplo de ejecución de una sentencia de consulta
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ El método execute de un objeto Statement realmente
1º compila la instrucción y
2º la ejecuta.
๏ Si el método debe ejecutar la misma consulta 10 veces, no deberíamos tener que perder recursos y tiempo
compilándola siempre, las 10 veces. Para eso usamos un objeto de la interfaz PreparedStatement
๏ Este objeto hace un precompilado para poder ejecutar la instrucción varias veces con diferentes
parámetros.
๏ Evidentemente, toda virtud se pierde si siempre de han de usar los mismos valores, con lo que la ventaja
está en poder cambiar solo los parámetros de la consulta, con instrucciones sql parametrizadas.
Consultas preparadas
Consultas preparadas
12
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 13
2. Crear Statement
‣ Ahora hay que hacer estos cambios:
- en vez de Statement se debe usar PreparedStatement,
- en vez de createStatement será prepareStatement() (cuidado, es prepare, no "prepared", sin la "d" final)
‣ Además, este método lleva ahora un argumento, un String, que es la sentencia preparada en el paso
anterior:
// Ejemplos de ejecutor sin usar modo preparado
String sql="Insert into personas (nombre,email,telefono) values('Pepe','pepemd@gmail.com', 91121222)";
Statement st = vCon.createStatement();
// Ejemplo con ejecutor para usar en modo preparado
String sqlpreparada="Insert into personas (nombre,email,telefono) values(?,?,?)";
PreparedStatement ps = vCon.prepareStatement(sqlpreparada);
Consultas preparadas
Cambios para convertir una Statement en una PreparedStatement
1. Cambiar la instrucción sql
Sustituimos los valores literales a almacenar en la tabla, por interrogantes (?)
// Ejemplos de sentencias sin modo preparado
String sql="Insert into personas (nombre,email,telefono) values('Pepe','pepemd@gmail.com', 91121222)";
String sql="Insert into personas (nombre,email,telefono) values('"+varNombre+"','"+varEmail+"',"+varTlfn+")";
// Ejemplo con la sentencia en modo preparado
String sqlpreparada="Insert into personas (nombre,email,telefono) values(?,?,?)";
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 14
3. Ejecución de la sentencia.
Lo que antes era invocar a execute(), ahora es igual pero con un paso previo: hay que dar valores a los ?
(I) Damos valor a los ? puestos en la sentencia preparada.
Usamos métodos setXXX (int posicion, valor).
Hay un setXXX por cada tipo primitivo, y por las clases básicas Java. En nuestro ejemplo:
Advertir que se usa setString(...) para dar valores a un campo String, o setInt(...) para un campo int....
(II) Se efectua ahora ya si el execute()
Al igual que con Statement, existen en PreparedStatement, junto a execute() los correspondientes
executeQuery() y executeUpdate().
No es necesario volver a pasar la cadena con la sentencia SQL como argumento, pues ya se ha
pasado a la hora de crear el PreparedStatement
//Aqui se va valor a las variables que son los parametros. Esto se puede haber hecho antes, claro
String varNombre = "Pepe";
String varEmail = "pepecmd@gmail.com";
int varTlfn = 91121222;
ps.setString(1,varNombre); // Eso quiere decir, "el ? numero 1 lo sustituyes por varNombre"
ps.setString(2,varEmail); // Eso quiere decir, "el ? numero 2 lo sustituyes por varMail"
ps.setInt(3, varTlfn); // Eso quiere decir, "el ? numero 3 lo sustituyes por varTlfn"
ps.execute();
Consultas preparadas
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 15
Connection vCon = DriverManager.getConnection(urlDeConexion, usuario, password);
// Creacion de String sql no preparado
String tsql = "Insert into contactos (nombre,direccion,telefono) values('JUANCHO','ARENAL 3',91115533)";
// Creacion de Statement no preparado
Statement st = vCon.createStatement();
// Ejecutamos la instruccion
st.execute(tsql);
Connection vCon = DriverManager.getConnection(urlDeConexion, usuario, password);
// Creacion de String sql preparado
String tsql = "Insert into contactos (nombre,direccion,telefono) values(?,?,?)";
// Creacion de Statement preparada
PreparedStatement ps = vCon.prepareStatement(tsql);
// Ejecutamos la instruccion
String varNombre = "Pepe";
String varEmail = "pepecmd@gmail.com";
int varTlfn = 91121222;
ps.setString(1,varNombre); // Eso quiere decir, "el ? numero 1 lo sustituyes por varNombre"
ps.setString(2,varEmail); // Eso quiere decir, "el ? numero 2 lo sustituyes por varMail"
ps.setInt(3, varTlfn); // Eso quiere decir, "el ? numero 3 lo sustituyes por varTlfn"
st.execute();
๏ Ejemplo de ejecución de una sentencia de actualización SIN sentencia preparada
๏ Ejemplo de ejecución de una sentencia de actualización CON sentencia preparada
Consultas preparadas
Ejemplos con PreparedStatement
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ executeQuery() se crea un ResultSet de tipo "Fordward only", solo se puede consultar avanzando desde el principio.
๏ Igualmente, los ResultSet pueden ser de consulta, o también de actualización: pueden modificarse y hacer efectivos los
cambios en la base de datos.
๏ Si se desea recorrer arriba y abajo el resultSet, o hacerlo actualizable, hay usar otra versión del método
createStatement() que recibe como argumentos dos enteros (vale tb para PreparedStatement):
‣ 1- El primero indica el tipo de ResultSet. Se codifica con constantes de la propia clase ResultSet:
‣ 2- El segundo dice si el resultset es de lectura o lectura/escritura. Se codifica también con constantes de ResultSet:
๏ Los tipo SCROLL consumen muchos recursos al tener la conexión abierta y en continua consulta.
๏ Los UPDATABLE son totalmente desaconsejados por ser muy ineficientes.
ReseltSet desplazables y actualizables
Resulset Desplazables y actualizables
16
CLASE CONSTANTE DESCRIPCION
ResultSet TYPE_FORDWARD_ONLY
• Valor por defecto.
• No es un resultSet desplazable, solo se puede avanzar en el acceso a los registros.
• No es sensible a los cambios hechos en la base de datos mientras se consulta (si la base de
datos cambia durante la consulta, el resulSet no muestra los cambios)
ResultSet TYPE_SCROLL_SENSITIVE
• Si es un resultSet desplazable, se puede avanzar y retroceder en el acceso a los registros.
• Es sensible a los cambios hechos en la base de datos mientras se consulta (si la base de datos
cambia durante la consulta, el resulSet SI muestra los cambios)
ResultSet TYPE_SCROLL_INSENSITIVE
• Si es un resultSet desplazable, se puede avanzar y retroceder en el acceso a los registros.
• No es sensible a los cambios hechos en la base de datos mientras se consulta (si la base de
datos cambia durante la consulta, el resulSet no muestra los cambios)
CLASE CONSTANTE DESCRIPCION
ResultSet CONCUR_READ_ONLY • Valor por defecto.
• No permite actualizar el resultSet
ResultSet CONCUR_UPDATABLE • Permite actualizar el resultSet
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏ Pasar un objeto de java.util.Date a a un tipo java.sql.Date
๏ Pasar un objeto de java.sql.Date a a un tipo java.util.Date


๏ Todo lo dicho para conversiones de java.sql.date vale igual para conversiones de java.sql.timestamp.
Fechas en SQL
Fechas en SQL
Conversiones entre clases Date de UTIL y SQL
17
๏ Java dispone (al menos) dos clases Date distintas:
‣ java.util.Date: Date normal en proyectos. Almacena minutos, segundos y milisegundos.
‣ java.sql.Date: Date que concuerda con los campos fecha de SQL.
Se debe usar pues en querrás don PrepareStatement, si son fechas, no se pude usar java.util.Date
No almacena minutos ni segundos. Si se desea una clase de SQL que sí almacene minutos, segundos y mas, usar java.sql.TimeStamp:
java.util.Date dateutil = new java.util.Date();
java.sql.Date datesql = new java.sql.Date(dateutil.getTime());
// opcion 1, la mas correcta
java.util.Date dateutilnueva1 = new java.util.Date(datesql.getTime());
// opcion 2, la mas simple, con casting implícito
java.util.Date dateutilnueva2 = datesql;
// EJEMPLOS DE CONVERSIONES ENTRE DATE DE UTIL Y DATE DE SQL
// No hacemos import de las clases Date, pues no sabriamos cual usar si usamos las dos a la vez
// Usamos el nombre canónico de la clase para usarla
java.util.Date dateutil = new java.util.Date();
java.sql.Date datesql = new java.sql.Date(dateutil.getTime());
java.util.Date dateutilnueva1 = new java.util.Date(datesql.getTime());
java.util.Date dateutilnueva2 = datesql;
System.out.println("Date original en util:nt"+dateutil);
System.out.println("Date en sql (convertida desde util):nt"+datesql);
System.out.println("Date nueva 1 en util (convertida desde sql):nt"+dateutilnueva1);
System.out.println("Date nueva 2 en util (convertida desde sql con casting implicito):nt"+dateutilnueva2);
consola
Date original en util:
Tue Apr 03 13:46:19 CEST 2018
Date en sql (convertida desde util):
2018-04-03
Date nueva 1 en util (convertida desde sql):
Tue Apr 03 13:46:19 CEST 2018
Date nueva 2 en util (convertida desde sql con casting implicito):
2018-04-03
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
• Un procedimiento almacenado es un programa sql almacenado en la base de datos.
• Para escribir estos programas se usa el lenguaje extendido que cada gestor de bbdd provee para ampliar el sql
estándar con elementos de control y funciones extendidas (para Oracle el lenguajes es pl/Sql, para DB2 es SQL PL,
para Sybase y Microsoft SSQL Server es Transact-SQL...)
• Para usar procedimientos almacenados en una base de datos, en java se usa la interface CallableStatement
-- Ejemplo de un procedimiento almacenado, imaginemos guardado junto con una bbdd.
-- El procedimiento almacenado se llamará "librostema"
CREATE DEFINER=`root`@`localhost` PROCEDURE `librostema`(IN t integer)
BEGIN
select titulo from libros where idTema=t;
END
• En este procedimiento almacenado se espera un parámetro de entrada, y ninguno de salida (podría tener además del
IN de la definición, algunos OUT que se cargan en la ejecución del procedimiento)
• Para crear un objeto de CallableStratement,se usa el método .prepareCall de la interfaz Connection
prepareCall("llamadaalprocedimiento")
• aunque también se puede usar consultas parametrizadas :
Procedimientos almacenados
Procedimientos almacenados
18
Connection cn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/libros","root", "root");
int tema = 1;
CallableStatement cs = cn.prepareCall("{call librostema ("+id+") }");
Connection cn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/libros","root", "root");
int tema = 1;
CallableStatement cs = cn.prepareCall("{call librostema (?) }");
cs.setInt(1,id);
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
• Para procesar parámetros de salida de un procedimiento almacenado, se usa el mismo formato que para
entrada en la llamada al procedimiento, y luego hay que registrar el parámetro de salida, de este modo
.registerOutParameter(ordendelparametro, Tiporvar variable)
donde el Tipovar de define usando la clase Types, que tiene unas constantes con todos los tipos de sql. No se
va a crear objeto de esta clase, solo llamar a sus constantes (p.e., para integer es INTEGER, para String la
variable es VARCHAR
• Luego, tras la ejecución del procedimiento, se usaran los métodos getXXX para recuperar el valor devuelto (los
get son idénticos a sus homólogos setXXX, dependen del tipo)
19Procedimientos almacenados
.registerOutParameter( 2, Types.INTEGER);
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 20Procedimientos almacenados
public static void main(String[] args) {
Connection cn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/libros", "root", "");
cn.setAutoCommit(false);
int id = 1;
// CallableStatement cs=cn.prepareCall("{call librostema("+id+")}");
CallableStatement cs = cn.prepareCall("{call librostema(?)}");
cs.setInt(1, id);
ResultSet rs = cs.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
cs = cn.prepareCall("{call actualizarPrecios(?,?)}");
cs.setInt(1, id);
cs.registerOutParameter(2, Types.INTEGER); // registramos parametro de salida
cs.execute();
int result = cs.getInt(2);// recuperamos valor parametro salida
System.out.println("registros afectados: " + result);
cn.commit();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (SQLException ex) {
try {
cn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
ex.printStackTrace();
} finally {
if (cn != null) {
try { // paso 4:
cn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
• Son una serie de operaciones que se consideran una única unidad de trabajo, o se ejecutan todas o ninguna. Si
todas ellas no se confirman, se deshacen las previamente realizadas a la no confirmada.
• En Java las transacciones se definen a nivel de objetos., con la clase Connection
• Java internamente hace commit o rollback en cada operación execute independiente (commit si va bien ,
rollback si encuentra error), así que para realizar varias operaciones controladas en una transacción, hay que
negar esta funcionalidad, y poner el commit automático de java a false
• Métodos de Connection:
• .setAutoCommit(boolean bb) – activa o desactiva la confirmación automática de Java.
• .commit() - método que confirma a la base de datos todas las operaciones pendientes, para que haga
efectivos los cambios
• .rollback() - deshace operaciones realizadas
En realidad no hace falta estrictamente poner el rollback en el catch, pues cuando un objeto Connection (con autocommit a false) se destruye, se
ejecuta un rollback automáticamente si no hay un commit especifico previo ("una transacción confirmada es una transacción denegada"). Pero es
recomendable usarlo para poder controlar explícitamente el momento del rollback por si además hay que realizar otra operaciones.
• Lo dicho de este control de commit-rollback vale también para procedimientos almacenados.
Transacciones
Transacciones
21
try{
Connection cn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/libros","root", "root");
cn.setAutoCommit(false)
// (instrucciones de actualización de la bbdd)
cn.commit();
…
catch{SQLException exx){
cn.rollback();
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
๏Los Metadatos nos dan información sobre la estructura de la base de datos.
๏Usamos la clase ResultSet, que tiene un método llamado
.getMetadata()
que devuelve un objeto de la clase ResultSetMetadata. Esta clase tiene sus métodos para extraer información:
• .getColumnCount()
• .getColumnName(int ordinaldecolumna)
• .getColumnType(int ordinaldecolumna) – devuelve un integer, comparable con las constantes de tipos Sql
(ver documentacion SQL)
• .getColumnTypeName(int ordinaldecolumna) – devuelve un String con el nombre del tipo de dato. Estos
valores dependen del tipo de bbdd...
๏El objeto resultSet da información no de la tabla, sino del resultado del resultSet.
Metadatos de una BBDD
Metadatos de una BBDD
22
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
1. Instalar el software en Eclipse para poder usar Hibernate en cualquier proyecto java:
2. Añadir el repositorio de JBoss, que es el oficial para descargar e instalar Hibernate.
3. En Work with escribir la URL desde la que bajar Hibernate. Ejemplo para Eclipse Neon:
http://download.jboss.org/jbosstools/neon/stable/updates/ (sustituir neon por la version Eclipse deseada)
o desde la pagina inicial de todas las versiones:
http://download.jboss.org/jbosstools
4. Pulsar Add y dar nombre a nuestro plugin, por ejemplo, Hibernate.
5. Pulsamos OK y dejar que se cargue el listado de software disponible
Hibernate. Configuración inicial de Eclipse (I)
Configuracion de entorno Eclipse Hibernate (I)
23
Esta tarea se debe realizar una única vez,
para configurar Eclipse y que pueda trabajar
en el futuro con proyectos en Hibernate
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
6. Una vez descargado el software disponible, elegir para instalar
JBoss Data Services Development —> Hibernate.
7. Aceptar términos de licencia y esperar a que realice la descarga. Cuando lo haya hecho pedirá reiniciar, y para
comprobar si se ha instalado correctamente, ir a Window —> Open Perspective.
Si existe la opción de elegir la perspectiva Hibernate, es que está bien descargado.
Hibernate. Configuración inicial de Eclipse (II) 24
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
8. Descargar e instalar drivers de BBDD (este proceso se puede realizar conjuntamente con el resto de librerías
de Hibernate, como se hace mas adelante, pero al ser posible usar estos drivers sin Hibernate, explicamos
como se configura independientemente).
En este ejemplo usamos un driver MySql, pero es idéntico proceso on cualquier otro modelo de SGBD
9. Buscar y descargar el driver MySql (p.e. mysql-connector-java-5.1.36-bin.jar )
10.Guardar el fichero en un carpeta que sirva para todos los futuros proyectos, y a configurar el driver para que se
use en cualquier proyecto Java de Eclipse. Se puede hacer la configuración solo para un proyecto, en tal caso,
proceder como se explica más adelante con el resto de librerías de Hibernate.
11.Crear una carpeta en nuestro equipo (p.e. libJava) y copiar el driver MySql descargado en dicha carpeta.
12.Agregar el driver como una librería propia de Eclipse. Ir a
Window —> Preferences —> Data Management —> Driver Definition.
Hibernate. Configuración inicial de Eclipse (III) 25
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
13.Pulsar Add y realizar la siguiente configuración:
✤ En la pestaña Name/Type
• elegir el Vendor Filter MySQL,
• como Database seleccionar la versión 5.1.
✤ En la pestaña JAR List referenciar el conector que
hemos dejado en el anterior paso.
• Puede que ya se tenga un archivo con el
conector de MySQL.En tal caso eliminarlo
(seleccionar y marcar Remove JAR/Zip...).
• Pulsar sobre Add JAR/Zip y elegir el conector/
driver que se guardo en la carpeta libJava del
equipo.
Aceptar los cambios pulsando OK
26Hibernate. Configuración inicial de Eclipse (IV)
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos Hibernate. Configuración en cada proyecto (I)
Configuracion de entorno Eclipse Hibernate para un proyecto específico
1. Configurar los pasos siguientes para cualquier proyecto en que deseemos usar Hibernate
2. Sobre las opciones del botón derecho, elegir Build Path —> Add libraries
3. Elegimos el tipo de librería Connectivity Driver Definition, pulsar Next, y en la definición de drivers disponible
marcamos MySQL JDBC Driver y pulsamos Finish.
27
Esta tarea se debe
realizar en cada uno de
los proyectos que vayan
a usar Hibernate
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
4. Crear, dentro de nuestro proyecto, una nueva carpeta (llamada p.e. libs). Ir al proyecto, sobre el botón derecho,
New —> Folder , y dar el nombre elegido
5. Agregar en esta carpeta las librerías Hibernate, usando copiar o pegar o arrastrándolas desde nuestro equipo
(la librerías se pueden descargar de http://hibernate.org/orm/ )
28Hibernate. Configuración en cada proyecto (II)
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
6. Referenciar las librerías copiadas al proyecto (no basta con incluirlas en la carpeta): sobre el proyecto, con el
botón derecho elegir Build Path —> Configure Build Path
7. Ir a la pestaña Libraries y elegir la opción Add JARs, seleccionar todos los ficheros de la carpeta libs y
aceptar.
29Hibernate. Configuración en cada proyecto (III)
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos Hibernate: Hibernate Configuration File
1. Sobre el proyecto, botón derecho y elegir
New —> Other —> Hibernate Configuration file
2. Indicar que se guarde en una carpeta, por ejemplo, src del proyecto
3. Pulsamos Next y configurar la conexion:
4. En Session Factory name indicar el nombre de la sesión (poner
cualquiera, p.e. SesionHibernateCRUDPelis)
5. En Database dialect seleccionar MySQL.
6. Como Driver class elegimos com.mysql.jdbc.Driver.
7. En Connection URL indicar la URL de conexión. Se ofrecen varios
modelos de ejemplo, si es local, p.e., podemos usar como conexión una
base de datos local ya predefinida (con lo que se pasa directamente la
URL aquí) o usar el campo Default Schema para indicar la base de datos
con la que conectar. En este ejemplo usaremos una base de datos local,
con lo que la conexión será “jdbc:mysql://localhost/ejemplo".
8. Indicar el usuario y contraseña de la conexión. En este ejemplo de
conexión local, User será root y Password vacía.
9. Finalizar con Finish.
Ficheros de configuración Hibernate: Hibernate Configuration File
30
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
1. Sobre el proyecto, botón derecho y elegir
New —> Other —> Hibernate Console Configuration
2. Indicar el nombre que se desea dar al fichero de configuración, en el ejemplo, ConsoleHibernateCRUDPelis
3. Dejar el resto de parámetros por defecto
4. Finalizar con Finish.
Ficheros de configuración Hibernate: Hibernate Console File
31Hibernate: Hibernate Console File
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
Ficheros de configuración Hibernate: Hibernate Reverse Engineer From JDBC Connection
Este paso se realiza si se desea crear clases java a partir de los datos de la base de datos.
1. Sobre el proyecto, botón derecho, New —> Other —> Hibernate —> Hibernate Reverse Engineering File.
2. Indicar la ruta donde se almacenará el fichero de configuración de la ingeniería inversa (p.e. src )
3. Pulsar Next y configurar que tablas se desea que se traduzcan a clases/objetos.
• Indicar que consola se usará (elegir la creada en el punto anterior en el campo Console Configuration).
• Pulsar Refresh.
• Se muestran las bases de datos y sus respectivas tablas. Elegir las que se desee y pulsar en Include.
32Hibernate: Hibernate Reverse Engineer
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos Hibernate: ejecutar ingeniería inversa (I)
Ficheros de configuración Hibernate: Ejecurar ingenieria inversa (I)
1. Elegir Run —> Hibernate Code Generation —> Hibernate Code Generation Configurations
2. Hacer doble click sobre Hibernate Code Generation y aparecerá una nueva configuración.
3. En la pestaña Main indicar:
• En Name indicar el nombre de esta configuración, en el ejemplo
CONFIGURATION_HIBERNATE_CRUD_PELIS
• Seleccionar en Console configuration la consola previamente creada previamente,
ConsoleHibernateCRUDPelis
• Marcar el checkbox de Reverse engineer from JDBC Connection
• En Output directory indicar la ruta de creación de las clases,
• Indicar el nombre del paquete también (si no existe se creará).
33
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
4. Pulsar sobre Setup de reveng.xml y aparecerá un mensaje preguntando si se desea crear un fichero nuevo o
elegir uno que ya exista. Escogemos elegir uno existente, y elegimos el creado anteriormente, en nuestro caso
hibernate.reveng.xml
Esta pestaña quedará así:
34Hibernate: ejecutar ingeniería inversa (II)
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
5. Seleccionar ahora la pestaña Exporters, y marcar al menos las opciones:
• Domain code (.java)
• Hibernate XML Mappings (.hbm.xml)
• Hibernate XML Configuration (.cfg.xml)
6. Aplicar cambios
7. Pulsar Run para que se ejecute la ingeniería inversa
35Hibernate: ejecutar ingeniería inversa (III)
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
• Si se desea se puede configurar Hibernate sin usar los asistentes explicados en los puntos anteriores,
simplemente creando a mano los ficheros XXXX.cfg.xml, XXXX.hbm.xml y XXXX.reveng.xml (si se desea
hacer ingeniería inversa)
1. Fichero Hibernate XML Configuration ( xxxxxx.cfg.xml)
2. Fichero Hibernate Reverse Engineering File ( xxxxxx.reveng.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >
<hibernate-reverse-engineering>
<table-filter match-schema="PeliculasDB" match-name=".*"/>
</hibernate-reverse-engineering>
Hibernate: configuración manual (I)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="HibernateCRUDPelis">
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/PeliculasDB</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.search.autoregister_listeners">false</property>
<mapping class="inicio/tablapeliculas" package="inicio" resource="inicio/tablapeliculas.hbm.xml" />
</session-factory>
</hibernate-configuration>
Configuracion de entorno Eclipse Hibernate para un proyecto específico: Codificación manual (I)
36
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos
Configuracion de entorno Eclipse Hibernate para un proyecto específico: Codificación manual (II)
3. Fichero Hibernate XML Mappings (.hbm.xml)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 16-feb-2017 22:33:52 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="inicio.tablapeliculas" table="tablapeliculas">
<id name="titulo" type="java.lang.String">
<column name="TITULO" />
<generator class="assigned" />
</id>
<property name="genero" type="java.lang.String">
<column name="GENERO" />
</property>
<property name="duracion" type="int">
<column name="DURACION" />
</property>
<property name="actorprincipal" type="java.lang.String">
<column name="ACTORPRINCIPAL" />
</property>
</class>
</hibernate-mapping>
37Hibernate: configuración manual (II)
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos Hibernate: Ejemplo completo (I) 38
Codigo Java para gestion con Hibernate: Ejemplo completo de proyecto de gestion de Base de Datos
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity // NECESARIO AÑADIR ANOTACIONES PARA CADA ENTIDAD DE LA BBDD
@Table(name = “tablapeliculas") // NECESARIO AÑADIR ANOTACIONES PARA CADA TABLA DE LA BBDD
public class tablapeliculas {
@Column(name = “titulo") // NECESARIO AÑADIR ANOTACIONES PARA CADA CAMPO (COLUMN) DE LA BBDD
String titulo;
@Column(name = "genero")
String genero;
@Column(name = "duracion")
int duracion;
@Column(name = "actorprincipal")
String actorprincipal;
public tablapeliculas() { // NECESARIO UN CONSTRUCTOR VACIO
}
public tablapeliculas(String titulo, String genero, int duracion, String actorprincipal) {
super();
this.titulo = titulo;
this.genero = genero;
this.duracion = duracion;
this.actorprincipal = actorprincipal;
}
// GETTERS Y SETTERS
public String getTitulo() { return titulo; }
public void setTitulo(String titulo) { this.titulo = titulo; }
public String getGenero() { return genero; }
public void setGenero(String genero) { this.genero = genero; }
public int getDuracion() { return duracion; }
public void setDuracion(int duracion) { this.duracion = duracion; }
public String getActorprincipal() {return actorprincipal; }
public void setActorprincipal(String actorprincipal) {this.actorprincipal = actorprincipal; }
@Override
public String toString() {
return "tablapeliculas{" + "titulo='" + titulo + ''' + ", genero='" + genero + ''' +
", duracion=" + duracion +", actorprincipal='" + actorprincipal + ''' + '}';
}
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 39Hibernate: Ejemplo completo (II)
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class GestionDBHibernate {
SessionFactory factory;
public GestionDBHibernate() {
factory = new Configuration().configure().buildSessionFactory();
}
// ALTA REGISTRO
public Integer anadirPelicula(tablapeliculas tablapeli) {
Session session = factory.openSession();
Transaction tx = null;
Integer pelicontrol = null;
try {
tx = session.beginTransaction();
String pe = (String) session.save(tablapeli);
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
return pelicontrol;
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 40Hibernate: Ejemplo completo (III)
// BORRAR REGISTRO
public boolean bajaPelicula(String titulo) {
boolean sepudoborrar = false;
if (!titulo.equals("")) {
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
tablapeliculas peli = (tablapeliculas) session.get(tablapeliculas.class, titulo);
if (peli != null) {
session.delete(peli);
tx.commit();
sepudoborrar = true;
}
} catch (HibernateException e) {
if (tx != null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
return sepudoborrar;
}
// LISTADO REGISTRO
public ArrayList<tablapeliculas> listapelis() {
List listapelis = null;
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
listapelis = session.createQuery("FROM tablapeliculas").list();
tx.commit();
} catch (HibernateException e) {
if (tx != null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return (ArrayList<tablapeliculas>) listapelis;
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 41Hibernate: Ejemplo completo (IV)
// RECUPERAR UN REGISTRO
public tablapeliculas consultaPelicula(String titulo) {
Session session = factory.openSession();
Transaction tx = null;
tablapeliculas peli = null;
try {
tx = session.beginTransaction();
peli = (tablapeliculas) session.get(tablapeliculas.class, titulo);
tx.commit();
} catch (HibernateException e) {
if (tx != null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return peli;
}
// ACTUALIZAR UN REGISTRO
public void actualizaPelicula(tablapeliculas pPeli) {
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
tablapeliculas peli = (tablapeliculas) session.get(tablapeliculas.class,
pPeli.getTitulo());
peli.setGenero(parampeli.getGenero());
peli.setDuracion(parampeli.getDuracion());
peli.setActorprincipal(parampeli.getActorprincipal());
session.update(peli);
tx.commit();
} catch (HibernateException e) {
if (tx != null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 42Hibernate: Ejemplo completo (V)
public class Inicio {
static String t, g, a;
static int d;
public static void main(String[] args) {
GestionDBHibernate gdbh = new GestionDBHibernate();
int opcion = 0;
do {
System.out.println("MENU");
System.out.println("1.- Alta nueva pelicula");
System.out.println("2.- Baja pelicula");
System.out.println("3.- Consulta una pelicula");
System.out.println("4.- Consulta todas las peliculas");
System.out.println("5.- Modificacion de una pelicula");
System.out.println("0.- Salir");
opcion = leerInt("");
switch (opcion) {
case 1:
System.out.println("ALTA DE PELICULA");
t = leerString("Indique el titulo de la pelicula");
g = leerString("Indique el genero de la pelicula");
d = leerInt("Indique la duracion de la pelicula");
a = leerString("Indique el actor principal de la pelicula");
tablapeliculas tablapeli = new tablapeliculas(t, g, d, a);
gdbh.anadirPelicula(tablapeli);
break;
case 2:
System.out.println("BAJA DE PELICULA");
t = leerString("Indique el titulo de la pelicula");
boolean sepudoborrar = gdbh.bajaPelicula(t);
if (!sepudoborrar) {
System.out.println("Titulo inexistente");
}
break;
case 3:
System.out.println("CONSULTA UNA PELICULA");
t = leerString("Indique el titulo de la pelicula");
tablapeliculas pel = gdbh.consultaPelicula(t);
if (pel == null) {
System.out.println("Titulo inexistente");
} else {
System.out.println(pel);
}
break;
TemariodecursoJavaSE©IñakiMartín

16.- Bases de datos 43Hibernate: Ejemplo completo (VI)
case 4:
System.out.println("LISTA DE PELICULAS");
ArrayList<tablapeliculas> listapelis = gdbh.listapelis();
Iterator<tablapeliculas> iterator = listapelis.iterator();
while (iterator.hasNext()) {
tablapeliculas pel2 = iterator.next();
System.out.println(pel2);
}
break;
case 5:
System.out.println("MODIFICACION DE PELICULA");
t = leerString("Indique el titulo de la pelicula a modificar");
tablapeliculas pel5 = gdbh.consultaPelicula(t);
if (pel5 == null) {
System.out.println("Titulo inexistente");
} else {
System.out.println("Datos actuales de la pelicula:");
System.out.println(pel5);
System.out.println("Nuevos datos:");
g = leerString("Indique nuevo el genero de la pelicula");
d = leerInt("Indique la nueva duracion de la pelicula");
a = leerString("Indique el nuevo actor principal de la pelicula");
tablapeliculas ta = new tablapeliculas(t, g, d, a);
gdbh.actualizaPelicula(ta);
}
break;
}
} while (opcion != 0);
System.out.println("Fin del programa");
}
public static String leerString(String mensaje) {
System.out.println(mensaje);
Scanner sc = new Scanner(System.in);
return sc.nextLine();
}
public static int leerInt(String mensaje) {
System.out.println(mensaje);
Scanner sc = new Scanner(System.in);
return Integer.parseInt(sc.nextLine());
}
}

Más contenido relacionado

La actualidad más candente (20)

Semana 5 Java Swing
Semana 5   Java SwingSemana 5   Java Swing
Semana 5 Java Swing
 
Introducción a java
Introducción a javaIntroducción a java
Introducción a java
 
Semana 3 Herencia en Java
Semana 3   Herencia en JavaSemana 3   Herencia en Java
Semana 3 Herencia en Java
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
 
Jyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc java-cap08 principios poo
Jyoc java-cap08 principios poo
 
Programación 1: modularización
Programación 1: modularizaciónProgramación 1: modularización
Programación 1: modularización
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
 
Guia4 java
Guia4 javaGuia4 java
Guia4 java
 
Comandos de Java
Comandos de JavaComandos de Java
Comandos de Java
 
Comandos Java
Comandos JavaComandos Java
Comandos Java
 
Best Practices
Best PracticesBest Practices
Best Practices
 
Comandos java
Comandos javaComandos java
Comandos java
 
Programación java1
Programación java1Programación java1
Programación java1
 
Uso de Excepciones en JAVA
Uso de Excepciones en JAVAUso de Excepciones en JAVA
Uso de Excepciones en JAVA
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 
Comandos java
Comandos javaComandos java
Comandos java
 

Similar a Jyoc java-cap16 persistencia. bases de datos

Similar a Jyoc java-cap16 persistencia. bases de datos (20)

Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Unidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde javaUnidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde java
 
Java y Bases de Datos
Java y Bases de DatosJava y Bases de Datos
Java y Bases de Datos
 
Java y Bases Datos
Java y Bases DatosJava y Bases Datos
Java y Bases Datos
 
Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
Bases de Datos en en www.fiec.espol.edu.ec
Bases de Datos en  en www.fiec.espol.edu.ecBases de Datos en  en www.fiec.espol.edu.ec
Bases de Datos en en www.fiec.espol.edu.ec
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
Jdbc
JdbcJdbc
Jdbc
 
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-20063. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
 
Jdbc
JdbcJdbc
Jdbc
 
S8-POO-4.2 BDD
S8-POO-4.2 BDDS8-POO-4.2 BDD
S8-POO-4.2 BDD
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
JDBC
JDBCJDBC
JDBC
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbc
 

Más de Jyoc X

Jyoc java-cap22 seguridad
Jyoc java-cap22 seguridadJyoc java-cap22 seguridad
Jyoc java-cap22 seguridadJyoc X
 
Jyoc java-cap20 listas, colas y pilas
Jyoc java-cap20 listas, colas y pilasJyoc java-cap20 listas, colas y pilas
Jyoc java-cap20 listas, colas y pilasJyoc X
 
Jyoc java-cap19 tad (tipos abstractos de datos)
Jyoc java-cap19 tad (tipos abstractos de datos)Jyoc java-cap19 tad (tipos abstractos de datos)
Jyoc java-cap19 tad (tipos abstractos de datos)Jyoc X
 
Jyoc java-cap18 swing y java fx
Jyoc java-cap18 swing y java fxJyoc java-cap18 swing y java fx
Jyoc java-cap18 swing y java fxJyoc X
 
Jyoc java-cap17 persistencia. nio
Jyoc java-cap17 persistencia. nioJyoc java-cap17 persistencia. nio
Jyoc java-cap17 persistencia. nioJyoc X
 
Jyoc java-cap15 persistencia. ficheros xml, j son y pdf
Jyoc java-cap15 persistencia. ficheros xml, j son y pdfJyoc java-cap15 persistencia. ficheros xml, j son y pdf
Jyoc java-cap15 persistencia. ficheros xml, j son y pdfJyoc X
 
Jyoc java-cap14 persistencia. ficheros corrientes
Jyoc java-cap14 persistencia. ficheros corrientesJyoc java-cap14 persistencia. ficheros corrientes
Jyoc java-cap14 persistencia. ficheros corrientesJyoc X
 
Jyoc java-cap13 recursividad
Jyoc java-cap13 recursividadJyoc java-cap13 recursividad
Jyoc java-cap13 recursividadJyoc X
 
Jyoc java-cap11 colecciones
Jyoc java-cap11 coleccionesJyoc java-cap11 colecciones
Jyoc java-cap11 coleccionesJyoc X
 
Jyoc java-cap10 clases complementarias y enumerados
Jyoc java-cap10 clases complementarias y enumeradosJyoc java-cap10 clases complementarias y enumerados
Jyoc java-cap10 clases complementarias y enumeradosJyoc X
 
Jyoc java-cap07 clases y objetos
Jyoc java-cap07 clases y objetosJyoc java-cap07 clases y objetos
Jyoc java-cap07 clases y objetosJyoc X
 
Jyoc java-cap06 la clase string
Jyoc java-cap06 la clase stringJyoc java-cap06 la clase string
Jyoc java-cap06 la clase stringJyoc X
 
Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)Jyoc X
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc X
 
Jyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salidaJyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salidaJyoc X
 

Más de Jyoc X (15)

Jyoc java-cap22 seguridad
Jyoc java-cap22 seguridadJyoc java-cap22 seguridad
Jyoc java-cap22 seguridad
 
Jyoc java-cap20 listas, colas y pilas
Jyoc java-cap20 listas, colas y pilasJyoc java-cap20 listas, colas y pilas
Jyoc java-cap20 listas, colas y pilas
 
Jyoc java-cap19 tad (tipos abstractos de datos)
Jyoc java-cap19 tad (tipos abstractos de datos)Jyoc java-cap19 tad (tipos abstractos de datos)
Jyoc java-cap19 tad (tipos abstractos de datos)
 
Jyoc java-cap18 swing y java fx
Jyoc java-cap18 swing y java fxJyoc java-cap18 swing y java fx
Jyoc java-cap18 swing y java fx
 
Jyoc java-cap17 persistencia. nio
Jyoc java-cap17 persistencia. nioJyoc java-cap17 persistencia. nio
Jyoc java-cap17 persistencia. nio
 
Jyoc java-cap15 persistencia. ficheros xml, j son y pdf
Jyoc java-cap15 persistencia. ficheros xml, j son y pdfJyoc java-cap15 persistencia. ficheros xml, j son y pdf
Jyoc java-cap15 persistencia. ficheros xml, j son y pdf
 
Jyoc java-cap14 persistencia. ficheros corrientes
Jyoc java-cap14 persistencia. ficheros corrientesJyoc java-cap14 persistencia. ficheros corrientes
Jyoc java-cap14 persistencia. ficheros corrientes
 
Jyoc java-cap13 recursividad
Jyoc java-cap13 recursividadJyoc java-cap13 recursividad
Jyoc java-cap13 recursividad
 
Jyoc java-cap11 colecciones
Jyoc java-cap11 coleccionesJyoc java-cap11 colecciones
Jyoc java-cap11 colecciones
 
Jyoc java-cap10 clases complementarias y enumerados
Jyoc java-cap10 clases complementarias y enumeradosJyoc java-cap10 clases complementarias y enumerados
Jyoc java-cap10 clases complementarias y enumerados
 
Jyoc java-cap07 clases y objetos
Jyoc java-cap07 clases y objetosJyoc java-cap07 clases y objetos
Jyoc java-cap07 clases y objetos
 
Jyoc java-cap06 la clase string
Jyoc java-cap06 la clase stringJyoc java-cap06 la clase string
Jyoc java-cap06 la clase string
 
Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)Jyoc java-cap04 vectores (arrays)
Jyoc java-cap04 vectores (arrays)
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 bucles
 
Jyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salidaJyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salida
 

Último

Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.José Luis Palma
 
programa dia de las madres 10 de mayo para evento
programa dia de las madres 10 de mayo  para eventoprograma dia de las madres 10 de mayo  para evento
programa dia de las madres 10 de mayo para eventoDiegoMtsS
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxdanalikcruz2000
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleJonathanCovena1
 
Historia y técnica del collage en el arte
Historia y técnica del collage en el arteHistoria y técnica del collage en el arte
Historia y técnica del collage en el arteRaquel Martín Contreras
 
MAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMarjorie Burga
 
Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoFundación YOD YOD
 
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzel CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzprofefilete
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdfgimenanahuel
 
Herramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdfHerramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdfMARIAPAULAMAHECHAMOR
 
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIARAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIACarlos Campaña Montenegro
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
Movimientos Precursores de La Independencia en Venezuela
Movimientos Precursores de La Independencia en VenezuelaMovimientos Precursores de La Independencia en Venezuela
Movimientos Precursores de La Independencia en Venezuelacocuyelquemao
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.amayarogel
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSjlorentemartos
 
Plan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPEPlan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPELaura Chacón
 
texto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticostexto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticosisabeltrejoros
 

Último (20)

Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.
 
programa dia de las madres 10 de mayo para evento
programa dia de las madres 10 de mayo  para eventoprograma dia de las madres 10 de mayo  para evento
programa dia de las madres 10 de mayo para evento
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
 
La Trampa De La Felicidad. Russ-Harris.pdf
La Trampa De La Felicidad. Russ-Harris.pdfLa Trampa De La Felicidad. Russ-Harris.pdf
La Trampa De La Felicidad. Russ-Harris.pdf
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo Sostenible
 
Historia y técnica del collage en el arte
Historia y técnica del collage en el arteHistoria y técnica del collage en el arte
Historia y técnica del collage en el arte
 
MAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grande
 
Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativo
 
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzel CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf
 
Herramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdfHerramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdf
 
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIARAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
Razonamiento Matemático 1. Deta del año 2020
Razonamiento Matemático 1. Deta del año 2020Razonamiento Matemático 1. Deta del año 2020
Razonamiento Matemático 1. Deta del año 2020
 
Movimientos Precursores de La Independencia en Venezuela
Movimientos Precursores de La Independencia en VenezuelaMovimientos Precursores de La Independencia en Venezuela
Movimientos Precursores de La Independencia en Venezuela
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
 
Unidad 4 | Teorías de las Comunicación | MCDI
Unidad 4 | Teorías de las Comunicación | MCDIUnidad 4 | Teorías de las Comunicación | MCDI
Unidad 4 | Teorías de las Comunicación | MCDI
 
Plan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPEPlan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPE
 
texto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticostexto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticos
 

Jyoc java-cap16 persistencia. bases de datos

  • 1. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos TEMARIO DE CURSO PROGRAMACIÓN JAVA SE CAPÍTULO 16 PERSISTENCIA. BASES DE DATOS EN JAVA © Iñaki Martín Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional.
  • 2. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏Para poder trabajar con BBDD, hay que hacer algunas configuraciones en el entorno de trabajo IDE que estemos usando, y en el entorno del ordenador. ๏Necesitamos antes de nada: ‣ Un gestor BD instalado: Se debe tener el gestor con su BD tablas, etc, y arrancado. Podemos conecta Java con la mayoría de los gestores del mercado (MySql, MariaDb, Oracle, PosgresSQL, Microsoft SQL Server, DB2,...) En los ejemplos de este curso se usa MySql como modelo de bbdd, y como gestor, podemos tenerlo arrancado desde XAMMP o herramientas similares ‣ Hay que obtener y añadir el driver al proyecto. Un driver son unas librerías (fichero con extension .jar, que son clases java ya compiladas) que contienen los métodos de acceso al gestor de BD elegido. • Obtener el driver: Si usamos MySql, el driver se puede descargar desde https://dev.mysql.com/ downloads/connector/j/5.1.html (puede que la descarga sea un fichero zip, descomprimirlo y buscar el fichero jar, será algo asi como: mysql-connector-java-5.1.46.jar ) • Copiar el driver en algún directorio del proyecto. Esto no es obligatorio, pero si util, pues si el driver no esta en el mismo workspace, se puede eliminar y afectaría al proyecto. Yo personalmente las librerías las copio en el mismo proyecto, en un directorio libs o librerías, a la misma altura que el directorio src • Añadir el driver al proyecto, esto es, decirle al proyecto que incorpore el driver como un fichero mas del proyecto. Suele añadirse como cualquier otra librería. En Eclipse: > propiedades del proyecto > java build path > Libraries > add external .jar > (elegir el jar con el driver). Configuración de entorno Configuración de entorno 2
  • 3. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ Con la configuración indicada anteriormente, se puede crear y ejecutar un proyecto con bbd sin pegas ๏ Sin embargo, lo único que se ha hecho hasta ahora has sido incluir el driver para que el proyecto compile, en el entorno de un equipo. Si el proyecto siempre se va a ejecutar en ese mismo workspace de Eclipse, no hay problema ๏ El problema viene si el proyecto se exporta para usarse en otro eclipse, o por ejemplo, en un entorno de producción. En este caso, el driver ha de existir en el nuevo entorno, para que el programa funcione, con lo que pueden darse dos casos ‣ Que el entorno destino tenga el driver. Por ejemplo, si la aplicación se despliega (instala) en un APPServer, que éste también tenga el driver para que funcione la aplicación ‣ Suministrar al APPServer el driver junto a la aplicación. Esta ultima opción, que el Driver se “añada” a la aplicación y así vaya conjuntamente con ella, se puede hacer en Eclipse configurando que lleve en el APPServer el driver junto a la aplicación. Esto se hace en añadiendo el driver al java buildpath del proyecto, de este modo: > propiedades del proyecto > deployment assembly > add > Java BuildPath Entries > (seleccionar el driver a incluir en el despliegue) Configuración de entorno Configuración para despliegue de una aplicación 3
  • 4. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ En toda aplicación que utilice JDBC para acceder a una base de datos, se distinguen tres fases o pasos a realizar en el código de la aplicación: 1. Conexión con la base de datos. Consiste a su vez en dos subtareas: a. Cargar el driver b. Crear la conexión 2. Ejecución de sentencias SQL (bien sean de consulta o manipulación) Si la sentencia es de consulta, además de ejecutar la sentencia, hay que procesar el resultado de la consulta 3. Cierre de la conexión Ejecución de sentencias SQL 1 - Conexión con la base de datos Fases de una app Java-JDBC 1.a Carga del driver 4 ๏ Esta acción era necesaria hasta Java6. Desde Java6 en adelante, solo es necesario añadir el driver al java buildpath del proyecto, como se explica en el punto anterior. La responsable de poder eliminar este paso ha sido la API JDBC incorporada en Java 6 (JDBC 4.0) ๏ Si se trabaja con versiones anteriores a Java6 , es necesario decirle al proyecto qué driver tiene que usar, e inicializarlo. Esto se realiza mediante el método estático forName() de la Clase Class, cuyo formato es: Class.forName(String clase_driver) Este método localiza, lee y enlaza dinámicamente el driver, devolviendo un objeto Class asociado a la clase indicada. ๏ Cuidado, la llamada a forName() puede provocar una excepción de tipo ClassNotFoundException. Class.forName("com.mysql.jdbc.Driver"); // para un driver mysql Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // para un driver sun jdbc
  • 5. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ Se lleva a cabo con el método estático getConnection() de la clase DriverManager del API JDBC. El método getConnection() devuelve un objeto que implementa la interfaz Connection, la cual proporciona varios métodos para manejar la conexión. ๏ El formato de este método es: Connection.getConnection(String urlconexion) ๏ El string urlconexion representa la dirección de la base de datos a la que se desea acceder, y su formato es: jdbc:subprotocolo:base_datos donde, - subprotocolo depende del tipo de driver utilizado y - base_datos es el nombre de la base de datos. ๏ getConnection tiene varias versiones sobrecargadas, las mas importantes; Connection.getConnection(String urlconexion) Connection.getConnection(String urlconexion, String usuario, String password) ๏ Al igual que sucede con la mayoría de los métodos de API JDBC, getConnection() puede provocar una excepción de tipo SQLException que habrá que capturar. 1.b Creación de la conexión 5 // Para un driver JDBC-MYSQL con base de datos "agenda", usuario "root" y sin password (tipo XAMMP) Connection miConexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", “root", ""); // Para un driver JDBC-ODBC y bbdd empresa Connection miConexion =DriverManager.getConnection("jdbc:odbc:empresa"); // Para un driver JDBC-ORACLE con base de datos "info", usuario "luis" y password "12345" Connection miConexion = DriverManager.getConnection(“jdbc:oracle:thin:@miservidor:1521:info”,“luis","12345"); // Para un driver JDBC-SQLITE con base de datos “mibasededatos.db" Connection miConexion = DriverManager.getConnection(“jdbc:sqlite:C:/directorio1/db/mibasededatos.db”); jdbc:mysql://localhost:3306/agenda_java Ejemplo: jdbc subprotocolo base de datos, en este caso con url de acceso y con puerto, mas nombre de base de datos (agenda_java) Ejecución de sentencias SQL
  • 6. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ Paso 1: crear la sentencia SQL que se desee ejecutar como un String. Ejemplos: ๏ Paso 2: crear un objeto de la interfaz Statement, con el objeto Connection antes creado, aplicando el método createStatement() ๏ Paso 3: Aplicar el String con al sentencia en los distintos métodos de la interfaz Statement. 2 . Ejecución de sentencias SQL 6 Connection miConexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", "root", ""); Statement sentencia = miConexion.createStatement(); String orden = "create table personas"; String orden2 = "Update empleados set salario= salario*1.1"); String orden3 = "Update empleados set salario= " + nuevosalario - impuestos ); String orden4 = "SELECT nombre FROM empleados WHERE salario> " + tope ); CLASE DEVUELVE METODOS DESCRIPCION Statement boolean .execute(String orden) VALIDO TANTO PARA CONSULTAS COMO SENTENCIAS DE ACTUALIZACION (DCL, DDL, DML) Envía a la base de datos la sentencia SQL proporcionada como parámetro en un String. Si se trata de una consulta de acción (Insert, Update o Delete), el método devolverá false si no se generan resultados (si falla) Cuando es una consulta de selección (Select), el método devolverá true si funciona correctamente. Statement int .executeUpdate(String sqlupdate) VALIDO SOLO PARA SENTENCIAS DE ACTUALIZACION (DCL, DDL) Envía una sentencia de acción a la base de datos Actua casi igual que execute, solo que ahora devuelve el número de registros afectados por la acción. Statement Resulset .executeQuery(String consulta) VALIDO SOLO PARA SENTENCIAS DE CONSULTA (DML) Envía una consulta de selección de registros a la base de datos, devolviendo un objeto ResultSet Un objeto Resulset almacena el resultado de una select, luego almacena filas y columnas Resulset tiene métodos para poder navegar por dichas filas y columnas . Connection miConexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", "root", ""); Statement sentencia = miConexion.createStatement(); sentencia.execute(orden2); int filasactualizadas = sentencia.executeUpdate(orden3); ResultSet resultado = sentencia.executeQuery(orden4); Ejecución de sentencias SQL
  • 7. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ✓ Ante nada, hay que obtener un ResultSet . ‣ Un objeto ResultSet almacena el resultado de una select, luego almacena filas y columnas. ‣ ResultSet proporciona métodos para poder navegar por dichas filas y columnas. ‣ Un objeto ResultSet se obtiene al ejecutar el método executeQuery() del objeto Statement: ✓ Después se puede recorrer el ResultSet De forma predeterminada, este objeto ResultSet posee la característica de ser de sólo avance y sólo lectura. ‣ Cuando se crea el objeto, un cursor queda apuntando delante del primer registro del ResultSet ‣ Para moverse por los registros, ResultSet proporciona el método next(). ‣ La llamada a next() mueve el cursor al siguiente registro del conjunto, devolviendo como resultado un boolean que indica si la nueva posición apuntada se corresponde con un registro (true), o si el cursor se ha salido del conjunto (false). ‣ Utilizando next() con un while se puede ir avanzando por todos los registros del ResultSet ‣ ResultSet tiene más métodos para extraer el contenido de los campos una vez que el cursor se posiciona en cada uno de los registros, o para acciones diversas sobre el ResultSet. 3 . Manipulación de registros de un ResutlSet 7 ResultSet resultado = sentencia.executeQuery("select nombre,edad from empleados"); Alicia 82 Ana 32 Carlota 18 Blas 34 Marina 15 Luis 56 Cursor ResultSet Alicia 82 Ana 32 Carlota 18 Blas 34 Marina 15 Luis 56 Cursor tras un next() while(res.next()) { //instrucciones } ResultSet ๏ Si la sentencia sql es de actualización, los métodos execute() y executeUpdate() efectúan la actualización y termina la ejecución de la sentencia. ๏ Si la sentencia sql es de consulta, un executeQuery(), se devuelve un objeto ResultSet con la respuesta de la consulta, que hay que procesar, con estas acciones: Ejecución de sentencias SQL
  • 8. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ✓ Una vez posicionado en un registro, se extraen los datos de cada campo del registro ‣ Para ello se usan otros métodos de ResultSet , según se desee leer por la posición del campo o por su nombre: 8 ResultSet res = sentencia.executeQuery("select nombre,edad from empleados"); while ( res.next() ) { String elnombre = res.getString("nombre"); int laedad =res.getInt("edad"); System.out.println("Nombre:"+ elnombre + " Edad: "+laedad); } NOTA: Se muestran ejemplos de int, double y String, pero existen métodos similares para Date y Object y los long, char, y otros tipos primitivos) CLASE DEVUELVE METODOS DESCRIPCION ResultSet int getInt( int posicion ) Devuelve un int correspondiente al campo de posicion pos en el registro ResultSet double getDouble( int posicion ) Devuelve un double correspondiente al campo de posicion pos en el registro ResultSet String getString( int posicion ) Devuelve un String correspondiente al campo de posicion pos en el registro ResultSet int getInt( String nombrecampo ) Devuelve un String correspondiente al campo de nombre nombrecampo ResultSet double getDouble( String nombrecampo ) Devuelve un String correspondiente al campo de nombre nombrecampo ResultSet String getString(String nombrecampo ) Devuelve un String correspondiente al campo de nombre nombrecampo ResultSet res = sentencia.executeQuery("select nombre,edad from empleados"); while ( res.next() ) { String elnombre = res.getString(0); int laedad =res.getInt(1); System.out.println("Nombre:"+ elnombre + " Edad: "+laedad); } Alicia 82 Ana 32 Carlota 18 Blas 34 Marina 15 Luis 56 Extrayendo los campos por el nombre del campo: Extrayendo los campos por la posición del campo en el registro: ResultSet Ejecución de sentencias SQL
  • 9. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ✓ Además de los métodos vistos, existen otros métodos para actuar en el ResultSet 4 . Cierre de la conexión 9 CLASE DEVUELVE METODOS DESCRIPCION ResultSet boolean isFirst() Devuelve true si el cursor apunta al primer registro ResultSet double isBeforeFirst() Devuelve true si el cursor apunta antes del primer registro ResultSet String isLast() Devuelve true si el cursor apunta al úlitmo registro ResultSet isAfterLast() Devuelve true si el cursor apunta detrás del ultimo registro, esto es, si ya se ha pasado por todos los registros del resultset, bien por haberlos recorrido, bien por que la ejecución del resultset no dio ningún registro ResultSet int getRow() Devuelve la posición del registro actual, siendo "1" la posición del primer registro ResultSet void updateString(pos, dato) Modifica, en el registro del cursor, el valor del campo de posicion pos con el valor dato Hay métodos similares para otros tipos de datos: updateInt, updateBoolean, ... Necesita para confirmar el cambio ejecutar posteriormente updateRow() ResultSet void updateRow() Hace efectivos los cambios del resultSet en la bbdd ResultSet void moveToInsertRow() Mueve el resultSet a un registro especial vacio, que sirve para crear nuevos registros. Se modifica el nuevo registro con updateXXX(), y se ha de acabar con insertRow() ResultSet void insertRow() Inserta el registro especial como un nuevo registro en el resultSet ๏ Se cierra una conexión mediante el método close() de la interfaz Connection: ๏ La interfaz Statement también dispone de un método close() para liberar el objeto Statement, Este método debe ejecutarse antes de cerrar la conexión, si no, daría error. ๏ En cualquier caso, cuando se cierra una conexión, todos los objetos Statement que queden abiertos serán cerrados automáticamente. miConexion.close(); Ejecución de sentencias SQL
  • 10. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ Ejemplo de ejecución de una sentencia de actualización 10Ejecución de sentencias SQL: ejemplo class PruebasJDBC_SentenciaActualizacion { static Connection vCon = null; static String usuario = "root"; static String password = ""; static String urlDeConexion = "jdbc:mysql://localhost:3306/agenda_java"; public static void main(String[] args) { try { // FASE 1.1 - Cargamos primero el driver (solo necesario antes de Java6) Class.forName("com.mysql.jdbc.Driver"); // FASE 1.2 - Establecemos la conexion con la base de datos vCon = DriverManager.getConnection(urlDeConexion, usuario, password); // FASE 2 - Creamos la sentencia SQL, // A partir del connection se crea un objeto statement, // y se guarda en el objeto la consulta Statement st = vCon.createStatement(); String tsql = "Insert into contactos (nombre,direccion,telefono) " + "values('JUANCHO','ARENAL 3','53345333')"; // Ejecutamos la instruccion st.execute(tsql); // FASE 3 - Manipulacion de resultados (en este caso no hay) } catch (ClassNotFoundException | SQLException ex) { // capturamos las dos excepciones juntas ex.printStackTrace(); } finally { try { // FASE 4 - Cierre de la conexion if (vCon != null) { vCon.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } } }
  • 11. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 11Ejecucion de sentencias SQL: ejemplo class PruebasJDBC_SentenciaConsulta { static Connection vCon = null; static String usuario = "root"; static String password = ""; static String urlDeConexion = "jdbc:mysql://localhost:3306/agenda_java"; public static void main(String[] args) { try { // FASE 1.1 - Cargamos primero el driver (solo necesario antes de Java6) Class.forName("com.mysql.jdbc.Driver"); // FASE 1.2 - Establecemos la conexion con la base de datos vCon = DriverManager.getConnection(urlDeConexion, usuario, password); // FASE 2 - Creamos la sentencia SQL, A partir del connection se crea // un objeto statement, y se guarda en el objeto la consulta Statement st = vCon.createStatement(); // FASE 3 - Manipulacion de resultados // Ejecutamos la instruccion y recogemos en un ResultSet los registros String sqlConsulta = "select nombre, edad from contactos"; ResultSet res = st.executeQuery(sqlConsulta); while ( res.next() ) { String elnombre = res.getString("nombre"); int laedad =res.getInt("edad"); System.out.println("Nombre:"+ elnombre + " Edad: "+laedad); } } catch (SQLException ex) { } finally { try { // FASE 4 - Cierre de la conexion if (vCon != null) { vCon.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } } } ๏ Ejemplo de ejecución de una sentencia de consulta
  • 12. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ El método execute de un objeto Statement realmente 1º compila la instrucción y 2º la ejecuta. ๏ Si el método debe ejecutar la misma consulta 10 veces, no deberíamos tener que perder recursos y tiempo compilándola siempre, las 10 veces. Para eso usamos un objeto de la interfaz PreparedStatement ๏ Este objeto hace un precompilado para poder ejecutar la instrucción varias veces con diferentes parámetros. ๏ Evidentemente, toda virtud se pierde si siempre de han de usar los mismos valores, con lo que la ventaja está en poder cambiar solo los parámetros de la consulta, con instrucciones sql parametrizadas. Consultas preparadas Consultas preparadas 12
  • 13. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 13 2. Crear Statement ‣ Ahora hay que hacer estos cambios: - en vez de Statement se debe usar PreparedStatement, - en vez de createStatement será prepareStatement() (cuidado, es prepare, no "prepared", sin la "d" final) ‣ Además, este método lleva ahora un argumento, un String, que es la sentencia preparada en el paso anterior: // Ejemplos de ejecutor sin usar modo preparado String sql="Insert into personas (nombre,email,telefono) values('Pepe','pepemd@gmail.com', 91121222)"; Statement st = vCon.createStatement(); // Ejemplo con ejecutor para usar en modo preparado String sqlpreparada="Insert into personas (nombre,email,telefono) values(?,?,?)"; PreparedStatement ps = vCon.prepareStatement(sqlpreparada); Consultas preparadas Cambios para convertir una Statement en una PreparedStatement 1. Cambiar la instrucción sql Sustituimos los valores literales a almacenar en la tabla, por interrogantes (?) // Ejemplos de sentencias sin modo preparado String sql="Insert into personas (nombre,email,telefono) values('Pepe','pepemd@gmail.com', 91121222)"; String sql="Insert into personas (nombre,email,telefono) values('"+varNombre+"','"+varEmail+"',"+varTlfn+")"; // Ejemplo con la sentencia en modo preparado String sqlpreparada="Insert into personas (nombre,email,telefono) values(?,?,?)";
  • 14. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 14 3. Ejecución de la sentencia. Lo que antes era invocar a execute(), ahora es igual pero con un paso previo: hay que dar valores a los ? (I) Damos valor a los ? puestos en la sentencia preparada. Usamos métodos setXXX (int posicion, valor). Hay un setXXX por cada tipo primitivo, y por las clases básicas Java. En nuestro ejemplo: Advertir que se usa setString(...) para dar valores a un campo String, o setInt(...) para un campo int.... (II) Se efectua ahora ya si el execute() Al igual que con Statement, existen en PreparedStatement, junto a execute() los correspondientes executeQuery() y executeUpdate(). No es necesario volver a pasar la cadena con la sentencia SQL como argumento, pues ya se ha pasado a la hora de crear el PreparedStatement //Aqui se va valor a las variables que son los parametros. Esto se puede haber hecho antes, claro String varNombre = "Pepe"; String varEmail = "pepecmd@gmail.com"; int varTlfn = 91121222; ps.setString(1,varNombre); // Eso quiere decir, "el ? numero 1 lo sustituyes por varNombre" ps.setString(2,varEmail); // Eso quiere decir, "el ? numero 2 lo sustituyes por varMail" ps.setInt(3, varTlfn); // Eso quiere decir, "el ? numero 3 lo sustituyes por varTlfn" ps.execute(); Consultas preparadas
  • 15. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 15 Connection vCon = DriverManager.getConnection(urlDeConexion, usuario, password); // Creacion de String sql no preparado String tsql = "Insert into contactos (nombre,direccion,telefono) values('JUANCHO','ARENAL 3',91115533)"; // Creacion de Statement no preparado Statement st = vCon.createStatement(); // Ejecutamos la instruccion st.execute(tsql); Connection vCon = DriverManager.getConnection(urlDeConexion, usuario, password); // Creacion de String sql preparado String tsql = "Insert into contactos (nombre,direccion,telefono) values(?,?,?)"; // Creacion de Statement preparada PreparedStatement ps = vCon.prepareStatement(tsql); // Ejecutamos la instruccion String varNombre = "Pepe"; String varEmail = "pepecmd@gmail.com"; int varTlfn = 91121222; ps.setString(1,varNombre); // Eso quiere decir, "el ? numero 1 lo sustituyes por varNombre" ps.setString(2,varEmail); // Eso quiere decir, "el ? numero 2 lo sustituyes por varMail" ps.setInt(3, varTlfn); // Eso quiere decir, "el ? numero 3 lo sustituyes por varTlfn" st.execute(); ๏ Ejemplo de ejecución de una sentencia de actualización SIN sentencia preparada ๏ Ejemplo de ejecución de una sentencia de actualización CON sentencia preparada Consultas preparadas Ejemplos con PreparedStatement
  • 16. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ executeQuery() se crea un ResultSet de tipo "Fordward only", solo se puede consultar avanzando desde el principio. ๏ Igualmente, los ResultSet pueden ser de consulta, o también de actualización: pueden modificarse y hacer efectivos los cambios en la base de datos. ๏ Si se desea recorrer arriba y abajo el resultSet, o hacerlo actualizable, hay usar otra versión del método createStatement() que recibe como argumentos dos enteros (vale tb para PreparedStatement): ‣ 1- El primero indica el tipo de ResultSet. Se codifica con constantes de la propia clase ResultSet: ‣ 2- El segundo dice si el resultset es de lectura o lectura/escritura. Se codifica también con constantes de ResultSet: ๏ Los tipo SCROLL consumen muchos recursos al tener la conexión abierta y en continua consulta. ๏ Los UPDATABLE son totalmente desaconsejados por ser muy ineficientes. ReseltSet desplazables y actualizables Resulset Desplazables y actualizables 16 CLASE CONSTANTE DESCRIPCION ResultSet TYPE_FORDWARD_ONLY • Valor por defecto. • No es un resultSet desplazable, solo se puede avanzar en el acceso a los registros. • No es sensible a los cambios hechos en la base de datos mientras se consulta (si la base de datos cambia durante la consulta, el resulSet no muestra los cambios) ResultSet TYPE_SCROLL_SENSITIVE • Si es un resultSet desplazable, se puede avanzar y retroceder en el acceso a los registros. • Es sensible a los cambios hechos en la base de datos mientras se consulta (si la base de datos cambia durante la consulta, el resulSet SI muestra los cambios) ResultSet TYPE_SCROLL_INSENSITIVE • Si es un resultSet desplazable, se puede avanzar y retroceder en el acceso a los registros. • No es sensible a los cambios hechos en la base de datos mientras se consulta (si la base de datos cambia durante la consulta, el resulSet no muestra los cambios) CLASE CONSTANTE DESCRIPCION ResultSet CONCUR_READ_ONLY • Valor por defecto. • No permite actualizar el resultSet ResultSet CONCUR_UPDATABLE • Permite actualizar el resultSet
  • 17. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏ Pasar un objeto de java.util.Date a a un tipo java.sql.Date ๏ Pasar un objeto de java.sql.Date a a un tipo java.util.Date 
 ๏ Todo lo dicho para conversiones de java.sql.date vale igual para conversiones de java.sql.timestamp. Fechas en SQL Fechas en SQL Conversiones entre clases Date de UTIL y SQL 17 ๏ Java dispone (al menos) dos clases Date distintas: ‣ java.util.Date: Date normal en proyectos. Almacena minutos, segundos y milisegundos. ‣ java.sql.Date: Date que concuerda con los campos fecha de SQL. Se debe usar pues en querrás don PrepareStatement, si son fechas, no se pude usar java.util.Date No almacena minutos ni segundos. Si se desea una clase de SQL que sí almacene minutos, segundos y mas, usar java.sql.TimeStamp: java.util.Date dateutil = new java.util.Date(); java.sql.Date datesql = new java.sql.Date(dateutil.getTime()); // opcion 1, la mas correcta java.util.Date dateutilnueva1 = new java.util.Date(datesql.getTime()); // opcion 2, la mas simple, con casting implícito java.util.Date dateutilnueva2 = datesql; // EJEMPLOS DE CONVERSIONES ENTRE DATE DE UTIL Y DATE DE SQL // No hacemos import de las clases Date, pues no sabriamos cual usar si usamos las dos a la vez // Usamos el nombre canónico de la clase para usarla java.util.Date dateutil = new java.util.Date(); java.sql.Date datesql = new java.sql.Date(dateutil.getTime()); java.util.Date dateutilnueva1 = new java.util.Date(datesql.getTime()); java.util.Date dateutilnueva2 = datesql; System.out.println("Date original en util:nt"+dateutil); System.out.println("Date en sql (convertida desde util):nt"+datesql); System.out.println("Date nueva 1 en util (convertida desde sql):nt"+dateutilnueva1); System.out.println("Date nueva 2 en util (convertida desde sql con casting implicito):nt"+dateutilnueva2); consola Date original en util: Tue Apr 03 13:46:19 CEST 2018 Date en sql (convertida desde util): 2018-04-03 Date nueva 1 en util (convertida desde sql): Tue Apr 03 13:46:19 CEST 2018 Date nueva 2 en util (convertida desde sql con casting implicito): 2018-04-03
  • 18. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos • Un procedimiento almacenado es un programa sql almacenado en la base de datos. • Para escribir estos programas se usa el lenguaje extendido que cada gestor de bbdd provee para ampliar el sql estándar con elementos de control y funciones extendidas (para Oracle el lenguajes es pl/Sql, para DB2 es SQL PL, para Sybase y Microsoft SSQL Server es Transact-SQL...) • Para usar procedimientos almacenados en una base de datos, en java se usa la interface CallableStatement -- Ejemplo de un procedimiento almacenado, imaginemos guardado junto con una bbdd. -- El procedimiento almacenado se llamará "librostema" CREATE DEFINER=`root`@`localhost` PROCEDURE `librostema`(IN t integer) BEGIN select titulo from libros where idTema=t; END • En este procedimiento almacenado se espera un parámetro de entrada, y ninguno de salida (podría tener además del IN de la definición, algunos OUT que se cargan en la ejecución del procedimiento) • Para crear un objeto de CallableStratement,se usa el método .prepareCall de la interfaz Connection prepareCall("llamadaalprocedimiento") • aunque también se puede usar consultas parametrizadas : Procedimientos almacenados Procedimientos almacenados 18 Connection cn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/libros","root", "root"); int tema = 1; CallableStatement cs = cn.prepareCall("{call librostema ("+id+") }"); Connection cn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/libros","root", "root"); int tema = 1; CallableStatement cs = cn.prepareCall("{call librostema (?) }"); cs.setInt(1,id);
  • 19. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos • Para procesar parámetros de salida de un procedimiento almacenado, se usa el mismo formato que para entrada en la llamada al procedimiento, y luego hay que registrar el parámetro de salida, de este modo .registerOutParameter(ordendelparametro, Tiporvar variable) donde el Tipovar de define usando la clase Types, que tiene unas constantes con todos los tipos de sql. No se va a crear objeto de esta clase, solo llamar a sus constantes (p.e., para integer es INTEGER, para String la variable es VARCHAR • Luego, tras la ejecución del procedimiento, se usaran los métodos getXXX para recuperar el valor devuelto (los get son idénticos a sus homólogos setXXX, dependen del tipo) 19Procedimientos almacenados .registerOutParameter( 2, Types.INTEGER);
  • 20. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 20Procedimientos almacenados public static void main(String[] args) { Connection cn = null; try { Class.forName("com.mysql.jdbc.Driver"); cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/libros", "root", ""); cn.setAutoCommit(false); int id = 1; // CallableStatement cs=cn.prepareCall("{call librostema("+id+")}"); CallableStatement cs = cn.prepareCall("{call librostema(?)}"); cs.setInt(1, id); ResultSet rs = cs.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } cs = cn.prepareCall("{call actualizarPrecios(?,?)}"); cs.setInt(1, id); cs.registerOutParameter(2, Types.INTEGER); // registramos parametro de salida cs.execute(); int result = cs.getInt(2);// recuperamos valor parametro salida System.out.println("registros afectados: " + result); cn.commit(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { try { cn.rollback(); } catch (SQLException e) { e.printStackTrace(); } ex.printStackTrace(); } finally { if (cn != null) { try { // paso 4: cn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
  • 21. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos • Son una serie de operaciones que se consideran una única unidad de trabajo, o se ejecutan todas o ninguna. Si todas ellas no se confirman, se deshacen las previamente realizadas a la no confirmada. • En Java las transacciones se definen a nivel de objetos., con la clase Connection • Java internamente hace commit o rollback en cada operación execute independiente (commit si va bien , rollback si encuentra error), así que para realizar varias operaciones controladas en una transacción, hay que negar esta funcionalidad, y poner el commit automático de java a false • Métodos de Connection: • .setAutoCommit(boolean bb) – activa o desactiva la confirmación automática de Java. • .commit() - método que confirma a la base de datos todas las operaciones pendientes, para que haga efectivos los cambios • .rollback() - deshace operaciones realizadas En realidad no hace falta estrictamente poner el rollback en el catch, pues cuando un objeto Connection (con autocommit a false) se destruye, se ejecuta un rollback automáticamente si no hay un commit especifico previo ("una transacción confirmada es una transacción denegada"). Pero es recomendable usarlo para poder controlar explícitamente el momento del rollback por si además hay que realizar otra operaciones. • Lo dicho de este control de commit-rollback vale también para procedimientos almacenados. Transacciones Transacciones 21 try{ Connection cn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/libros","root", "root"); cn.setAutoCommit(false) // (instrucciones de actualización de la bbdd) cn.commit(); … catch{SQLException exx){ cn.rollback(); }
  • 22. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos ๏Los Metadatos nos dan información sobre la estructura de la base de datos. ๏Usamos la clase ResultSet, que tiene un método llamado .getMetadata() que devuelve un objeto de la clase ResultSetMetadata. Esta clase tiene sus métodos para extraer información: • .getColumnCount() • .getColumnName(int ordinaldecolumna) • .getColumnType(int ordinaldecolumna) – devuelve un integer, comparable con las constantes de tipos Sql (ver documentacion SQL) • .getColumnTypeName(int ordinaldecolumna) – devuelve un String con el nombre del tipo de dato. Estos valores dependen del tipo de bbdd... ๏El objeto resultSet da información no de la tabla, sino del resultado del resultSet. Metadatos de una BBDD Metadatos de una BBDD 22
  • 23. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 1. Instalar el software en Eclipse para poder usar Hibernate en cualquier proyecto java: 2. Añadir el repositorio de JBoss, que es el oficial para descargar e instalar Hibernate. 3. En Work with escribir la URL desde la que bajar Hibernate. Ejemplo para Eclipse Neon: http://download.jboss.org/jbosstools/neon/stable/updates/ (sustituir neon por la version Eclipse deseada) o desde la pagina inicial de todas las versiones: http://download.jboss.org/jbosstools 4. Pulsar Add y dar nombre a nuestro plugin, por ejemplo, Hibernate. 5. Pulsamos OK y dejar que se cargue el listado de software disponible Hibernate. Configuración inicial de Eclipse (I) Configuracion de entorno Eclipse Hibernate (I) 23 Esta tarea se debe realizar una única vez, para configurar Eclipse y que pueda trabajar en el futuro con proyectos en Hibernate
  • 24. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 6. Una vez descargado el software disponible, elegir para instalar JBoss Data Services Development —> Hibernate. 7. Aceptar términos de licencia y esperar a que realice la descarga. Cuando lo haya hecho pedirá reiniciar, y para comprobar si se ha instalado correctamente, ir a Window —> Open Perspective. Si existe la opción de elegir la perspectiva Hibernate, es que está bien descargado. Hibernate. Configuración inicial de Eclipse (II) 24
  • 25. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 8. Descargar e instalar drivers de BBDD (este proceso se puede realizar conjuntamente con el resto de librerías de Hibernate, como se hace mas adelante, pero al ser posible usar estos drivers sin Hibernate, explicamos como se configura independientemente). En este ejemplo usamos un driver MySql, pero es idéntico proceso on cualquier otro modelo de SGBD 9. Buscar y descargar el driver MySql (p.e. mysql-connector-java-5.1.36-bin.jar ) 10.Guardar el fichero en un carpeta que sirva para todos los futuros proyectos, y a configurar el driver para que se use en cualquier proyecto Java de Eclipse. Se puede hacer la configuración solo para un proyecto, en tal caso, proceder como se explica más adelante con el resto de librerías de Hibernate. 11.Crear una carpeta en nuestro equipo (p.e. libJava) y copiar el driver MySql descargado en dicha carpeta. 12.Agregar el driver como una librería propia de Eclipse. Ir a Window —> Preferences —> Data Management —> Driver Definition. Hibernate. Configuración inicial de Eclipse (III) 25
  • 26. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 13.Pulsar Add y realizar la siguiente configuración: ✤ En la pestaña Name/Type • elegir el Vendor Filter MySQL, • como Database seleccionar la versión 5.1. ✤ En la pestaña JAR List referenciar el conector que hemos dejado en el anterior paso. • Puede que ya se tenga un archivo con el conector de MySQL.En tal caso eliminarlo (seleccionar y marcar Remove JAR/Zip...). • Pulsar sobre Add JAR/Zip y elegir el conector/ driver que se guardo en la carpeta libJava del equipo. Aceptar los cambios pulsando OK 26Hibernate. Configuración inicial de Eclipse (IV)
  • 27. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos Hibernate. Configuración en cada proyecto (I) Configuracion de entorno Eclipse Hibernate para un proyecto específico 1. Configurar los pasos siguientes para cualquier proyecto en que deseemos usar Hibernate 2. Sobre las opciones del botón derecho, elegir Build Path —> Add libraries 3. Elegimos el tipo de librería Connectivity Driver Definition, pulsar Next, y en la definición de drivers disponible marcamos MySQL JDBC Driver y pulsamos Finish. 27 Esta tarea se debe realizar en cada uno de los proyectos que vayan a usar Hibernate
  • 28. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 4. Crear, dentro de nuestro proyecto, una nueva carpeta (llamada p.e. libs). Ir al proyecto, sobre el botón derecho, New —> Folder , y dar el nombre elegido 5. Agregar en esta carpeta las librerías Hibernate, usando copiar o pegar o arrastrándolas desde nuestro equipo (la librerías se pueden descargar de http://hibernate.org/orm/ ) 28Hibernate. Configuración en cada proyecto (II)
  • 29. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 6. Referenciar las librerías copiadas al proyecto (no basta con incluirlas en la carpeta): sobre el proyecto, con el botón derecho elegir Build Path —> Configure Build Path 7. Ir a la pestaña Libraries y elegir la opción Add JARs, seleccionar todos los ficheros de la carpeta libs y aceptar. 29Hibernate. Configuración en cada proyecto (III)
  • 30. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos Hibernate: Hibernate Configuration File 1. Sobre el proyecto, botón derecho y elegir New —> Other —> Hibernate Configuration file 2. Indicar que se guarde en una carpeta, por ejemplo, src del proyecto 3. Pulsamos Next y configurar la conexion: 4. En Session Factory name indicar el nombre de la sesión (poner cualquiera, p.e. SesionHibernateCRUDPelis) 5. En Database dialect seleccionar MySQL. 6. Como Driver class elegimos com.mysql.jdbc.Driver. 7. En Connection URL indicar la URL de conexión. Se ofrecen varios modelos de ejemplo, si es local, p.e., podemos usar como conexión una base de datos local ya predefinida (con lo que se pasa directamente la URL aquí) o usar el campo Default Schema para indicar la base de datos con la que conectar. En este ejemplo usaremos una base de datos local, con lo que la conexión será “jdbc:mysql://localhost/ejemplo". 8. Indicar el usuario y contraseña de la conexión. En este ejemplo de conexión local, User será root y Password vacía. 9. Finalizar con Finish. Ficheros de configuración Hibernate: Hibernate Configuration File 30
  • 31. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 1. Sobre el proyecto, botón derecho y elegir New —> Other —> Hibernate Console Configuration 2. Indicar el nombre que se desea dar al fichero de configuración, en el ejemplo, ConsoleHibernateCRUDPelis 3. Dejar el resto de parámetros por defecto 4. Finalizar con Finish. Ficheros de configuración Hibernate: Hibernate Console File 31Hibernate: Hibernate Console File
  • 32. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos Ficheros de configuración Hibernate: Hibernate Reverse Engineer From JDBC Connection Este paso se realiza si se desea crear clases java a partir de los datos de la base de datos. 1. Sobre el proyecto, botón derecho, New —> Other —> Hibernate —> Hibernate Reverse Engineering File. 2. Indicar la ruta donde se almacenará el fichero de configuración de la ingeniería inversa (p.e. src ) 3. Pulsar Next y configurar que tablas se desea que se traduzcan a clases/objetos. • Indicar que consola se usará (elegir la creada en el punto anterior en el campo Console Configuration). • Pulsar Refresh. • Se muestran las bases de datos y sus respectivas tablas. Elegir las que se desee y pulsar en Include. 32Hibernate: Hibernate Reverse Engineer
  • 33. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos Hibernate: ejecutar ingeniería inversa (I) Ficheros de configuración Hibernate: Ejecurar ingenieria inversa (I) 1. Elegir Run —> Hibernate Code Generation —> Hibernate Code Generation Configurations 2. Hacer doble click sobre Hibernate Code Generation y aparecerá una nueva configuración. 3. En la pestaña Main indicar: • En Name indicar el nombre de esta configuración, en el ejemplo CONFIGURATION_HIBERNATE_CRUD_PELIS • Seleccionar en Console configuration la consola previamente creada previamente, ConsoleHibernateCRUDPelis • Marcar el checkbox de Reverse engineer from JDBC Connection • En Output directory indicar la ruta de creación de las clases, • Indicar el nombre del paquete también (si no existe se creará). 33
  • 34. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 4. Pulsar sobre Setup de reveng.xml y aparecerá un mensaje preguntando si se desea crear un fichero nuevo o elegir uno que ya exista. Escogemos elegir uno existente, y elegimos el creado anteriormente, en nuestro caso hibernate.reveng.xml Esta pestaña quedará así: 34Hibernate: ejecutar ingeniería inversa (II)
  • 35. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 5. Seleccionar ahora la pestaña Exporters, y marcar al menos las opciones: • Domain code (.java) • Hibernate XML Mappings (.hbm.xml) • Hibernate XML Configuration (.cfg.xml) 6. Aplicar cambios 7. Pulsar Run para que se ejecute la ingeniería inversa 35Hibernate: ejecutar ingeniería inversa (III)
  • 36. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos • Si se desea se puede configurar Hibernate sin usar los asistentes explicados en los puntos anteriores, simplemente creando a mano los ficheros XXXX.cfg.xml, XXXX.hbm.xml y XXXX.reveng.xml (si se desea hacer ingeniería inversa) 1. Fichero Hibernate XML Configuration ( xxxxxx.cfg.xml) 2. Fichero Hibernate Reverse Engineering File ( xxxxxx.reveng.xml) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" > <hibernate-reverse-engineering> <table-filter match-schema="PeliculasDB" match-name=".*"/> </hibernate-reverse-engineering> Hibernate: configuración manual (I) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="HibernateCRUDPelis"> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost/PeliculasDB</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.search.autoregister_listeners">false</property> <mapping class="inicio/tablapeliculas" package="inicio" resource="inicio/tablapeliculas.hbm.xml" /> </session-factory> </hibernate-configuration> Configuracion de entorno Eclipse Hibernate para un proyecto específico: Codificación manual (I) 36
  • 37. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos Configuracion de entorno Eclipse Hibernate para un proyecto específico: Codificación manual (II) 3. Fichero Hibernate XML Mappings (.hbm.xml) <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 16-feb-2017 22:33:52 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="inicio.tablapeliculas" table="tablapeliculas"> <id name="titulo" type="java.lang.String"> <column name="TITULO" /> <generator class="assigned" /> </id> <property name="genero" type="java.lang.String"> <column name="GENERO" /> </property> <property name="duracion" type="int"> <column name="DURACION" /> </property> <property name="actorprincipal" type="java.lang.String"> <column name="ACTORPRINCIPAL" /> </property> </class> </hibernate-mapping> 37Hibernate: configuración manual (II)
  • 38. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos Hibernate: Ejemplo completo (I) 38 Codigo Java para gestion con Hibernate: Ejemplo completo de proyecto de gestion de Base de Datos import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; @Entity // NECESARIO AÑADIR ANOTACIONES PARA CADA ENTIDAD DE LA BBDD @Table(name = “tablapeliculas") // NECESARIO AÑADIR ANOTACIONES PARA CADA TABLA DE LA BBDD public class tablapeliculas { @Column(name = “titulo") // NECESARIO AÑADIR ANOTACIONES PARA CADA CAMPO (COLUMN) DE LA BBDD String titulo; @Column(name = "genero") String genero; @Column(name = "duracion") int duracion; @Column(name = "actorprincipal") String actorprincipal; public tablapeliculas() { // NECESARIO UN CONSTRUCTOR VACIO } public tablapeliculas(String titulo, String genero, int duracion, String actorprincipal) { super(); this.titulo = titulo; this.genero = genero; this.duracion = duracion; this.actorprincipal = actorprincipal; } // GETTERS Y SETTERS public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getGenero() { return genero; } public void setGenero(String genero) { this.genero = genero; } public int getDuracion() { return duracion; } public void setDuracion(int duracion) { this.duracion = duracion; } public String getActorprincipal() {return actorprincipal; } public void setActorprincipal(String actorprincipal) {this.actorprincipal = actorprincipal; } @Override public String toString() { return "tablapeliculas{" + "titulo='" + titulo + ''' + ", genero='" + genero + ''' + ", duracion=" + duracion +", actorprincipal='" + actorprincipal + ''' + '}'; } }
  • 39. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 39Hibernate: Ejemplo completo (II) import java.util.ArrayList; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class GestionDBHibernate { SessionFactory factory; public GestionDBHibernate() { factory = new Configuration().configure().buildSessionFactory(); } // ALTA REGISTRO public Integer anadirPelicula(tablapeliculas tablapeli) { Session session = factory.openSession(); Transaction tx = null; Integer pelicontrol = null; try { tx = session.beginTransaction(); String pe = (String) session.save(tablapeli); tx.commit(); } catch (HibernateException e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); } return pelicontrol; }
  • 40. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 40Hibernate: Ejemplo completo (III) // BORRAR REGISTRO public boolean bajaPelicula(String titulo) { boolean sepudoborrar = false; if (!titulo.equals("")) { Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); tablapeliculas peli = (tablapeliculas) session.get(tablapeliculas.class, titulo); if (peli != null) { session.delete(peli); tx.commit(); sepudoborrar = true; } } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } return sepudoborrar; } // LISTADO REGISTRO public ArrayList<tablapeliculas> listapelis() { List listapelis = null; Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); listapelis = session.createQuery("FROM tablapeliculas").list(); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return (ArrayList<tablapeliculas>) listapelis; }
  • 41. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 41Hibernate: Ejemplo completo (IV) // RECUPERAR UN REGISTRO public tablapeliculas consultaPelicula(String titulo) { Session session = factory.openSession(); Transaction tx = null; tablapeliculas peli = null; try { tx = session.beginTransaction(); peli = (tablapeliculas) session.get(tablapeliculas.class, titulo); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return peli; } // ACTUALIZAR UN REGISTRO public void actualizaPelicula(tablapeliculas pPeli) { Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); tablapeliculas peli = (tablapeliculas) session.get(tablapeliculas.class, pPeli.getTitulo()); peli.setGenero(parampeli.getGenero()); peli.setDuracion(parampeli.getDuracion()); peli.setActorprincipal(parampeli.getActorprincipal()); session.update(peli); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } }
  • 42. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 42Hibernate: Ejemplo completo (V) public class Inicio { static String t, g, a; static int d; public static void main(String[] args) { GestionDBHibernate gdbh = new GestionDBHibernate(); int opcion = 0; do { System.out.println("MENU"); System.out.println("1.- Alta nueva pelicula"); System.out.println("2.- Baja pelicula"); System.out.println("3.- Consulta una pelicula"); System.out.println("4.- Consulta todas las peliculas"); System.out.println("5.- Modificacion de una pelicula"); System.out.println("0.- Salir"); opcion = leerInt(""); switch (opcion) { case 1: System.out.println("ALTA DE PELICULA"); t = leerString("Indique el titulo de la pelicula"); g = leerString("Indique el genero de la pelicula"); d = leerInt("Indique la duracion de la pelicula"); a = leerString("Indique el actor principal de la pelicula"); tablapeliculas tablapeli = new tablapeliculas(t, g, d, a); gdbh.anadirPelicula(tablapeli); break; case 2: System.out.println("BAJA DE PELICULA"); t = leerString("Indique el titulo de la pelicula"); boolean sepudoborrar = gdbh.bajaPelicula(t); if (!sepudoborrar) { System.out.println("Titulo inexistente"); } break; case 3: System.out.println("CONSULTA UNA PELICULA"); t = leerString("Indique el titulo de la pelicula"); tablapeliculas pel = gdbh.consultaPelicula(t); if (pel == null) { System.out.println("Titulo inexistente"); } else { System.out.println(pel); } break;
  • 43. TemariodecursoJavaSE©IñakiMartín
 16.- Bases de datos 43Hibernate: Ejemplo completo (VI) case 4: System.out.println("LISTA DE PELICULAS"); ArrayList<tablapeliculas> listapelis = gdbh.listapelis(); Iterator<tablapeliculas> iterator = listapelis.iterator(); while (iterator.hasNext()) { tablapeliculas pel2 = iterator.next(); System.out.println(pel2); } break; case 5: System.out.println("MODIFICACION DE PELICULA"); t = leerString("Indique el titulo de la pelicula a modificar"); tablapeliculas pel5 = gdbh.consultaPelicula(t); if (pel5 == null) { System.out.println("Titulo inexistente"); } else { System.out.println("Datos actuales de la pelicula:"); System.out.println(pel5); System.out.println("Nuevos datos:"); g = leerString("Indique nuevo el genero de la pelicula"); d = leerInt("Indique la nueva duracion de la pelicula"); a = leerString("Indique el nuevo actor principal de la pelicula"); tablapeliculas ta = new tablapeliculas(t, g, d, a); gdbh.actualizaPelicula(ta); } break; } } while (opcion != 0); System.out.println("Fin del programa"); } public static String leerString(String mensaje) { System.out.println(mensaje); Scanner sc = new Scanner(System.in); return sc.nextLine(); } public static int leerInt(String mensaje) { System.out.println(mensaje); Scanner sc = new Scanner(System.in); return Integer.parseInt(sc.nextLine()); } }