3 Manejo de Conectores A Base de Datos
3 Manejo de Conectores A Base de Datos
3 Manejo de Conectores A Base de Datos
MANEJO DE CONECTORES A
BASES DE DATOS.
Para conectar nuestro programa Java con una base de datos para realizar consultas y
modificaciones, debemos seguir los siguientes pasos:
datos. Una vez descargado hay que añadirlo a nuestro classpath o las librerías
método DriverManager.registerDriver().
la base de datos.
El API JDBC
La biblioteca JDBC incluye API para cada una de las tareas mencionadas a
continuación, que están comúnmente asociadas con el uso de la base de datos.
• Aplicaciones Java
• Applets de Java
• Servlets de Java
Todos estos ejecutables diferentes pueden usar un controlador JDBC para acceder a
una base de datos y aprovechar los datos almacenados.
JDBC proporciona las mismas capacidades que ODBC, lo que permitiría que los
programas Java contengan código independiente de la base de datos.
Arquitectura JDBC
La API de JDBC admite modelos de procesamiento de dos y tres niveles para el acceso
a la base de datos pero, en general, la arquitectura JDBC consta de dos capas:
Modelo Descripción
Arquitectura JDBC
También abstrae los detalles asociados con el trabajo con objetos Driver.
• Connection: Interfaz con todos los métodos para contactar una base de datos.
solamente.
• Statement: Utiliza objetos creados desde esta interfaz para enviar las
Java.sql y javax.sql son los paquetes principales para JDBC. Ofrece las principales
clases para interactuar con sus fuentes de datos.
java.sql es una API para acceder y procesar los datos almacenados en una base de
datos, generalmente una base de datos relacional que usa Java. Se pueden instalar
javax.sql es una API JDBC para el lado del servidor para acceder y procesar los datos
de las bases de datos, normalmente una base de datos relacional que usa Java. Es la
parte esencial para J2EE. Esta API proporciona funcionalidades como la agrupación de
conexiones, las transacciones distribuidas y los conjuntos de filas para las aplicaciones
empresariales. En esta API se proporciona una interfaz por nombre DataSource como
alternativa a DriverManager para establecer la conexión.
Sintáxis SQL
SQL es compatible con casi cualquier base de datos que podamos utilizar, y permite
escribir código de base de datos independientemente de la base de datos subyacente.
La sentencia CREATE DATABASE se usa para crear una nueva base de datos. La
sintaxis es la siguiente:
Ejemplo
La siguiente instrucción SQL crea una Base de datos llamada EMP:
Nota: Para crear o eliminar una base de datos, necesitamos tener privilegios de
administrador en su servidor de base de datos. Al eliminar una base de datos se
perderán todos los datos almacenados en la base de datos.
Crear tabla
Ejemplo
La siguiente instrucción SQL crea una tabla llamada Empleados con cuatro columnas:
Borrar tabla
La instrucción DROP TABLE se usa para eliminar una tabla existente. La sintaxis es
la siguiente:
Ejemplo
La siguiente instrucción SQL elimina una tabla llamada Empleados:
Insertar datos
Ejemplo
La siguiente instrucción SQL INSERT inserta una nueva fila en la base de datos de
Empleados creada anteriormente:
La cláusula WHERE puede usar operadores de comparación como =,! =, <,>, <=
Y> =, así como los operadores BETWEEN y LIKE.
Ejemplo
La siguiente instrucción SQL selecciona la edad, la primera y la última columna de la
tabla Empleados, donde la columna de identificación es 100.
Actualizar datos
La cláusula WHERE puede usar operadores de comparación como =,! =, <,>, <=
Y> =, así como los operadores BETWEEN y LIKE.
Ejemplo
La siguiente instrucción SQL UPDATE cambia la columna de edad del empleado cuyo
ID es 100:
Borrar datos
La cláusula WHERE puede usar operadores de comparación como =,! =, <,>, <=
Y> =, así como los operadores BETWEEN y LIKE.
Ejemplo
La siguiente declaración SQL DELETE borra el registro del empleado cuyo ID es 100:
La Interfaz de Nombrado y Directorio Java (Java Naming and Directory Interface) es una
Interfaz de Programación de Aplicaciones (API) para servicios de directorio.
Esto permite a los clientes descubrir y buscar objetos y nombres a través de un nombre
y, como todas las APIs de Java que hacen de interfaz con sistemas host, es
independiente de la implementación subyacente.
Adicionalmente, especifica una interfaz de proveedor de servicio (SPI) que permite que
las implementaciones del servicio de directorio sean integradas en el framework. Las
implementaciones pueden hacer uso de un servidor, un fichero, o una base de datos; la
elección depende del vendedor.
LDAP (Lightweight Directory Access Protocol) fue creado a principios de los años
noventa como protocolo de directorio estándar.
Antes de que existiera JNDI, los desarrolladores Java tenían que programar
específicamente un servicio de directorios en una red concreta. Este hecho complicaba
bastante las cosas porque cada servicio de directorio de red tiene sus
propias APIs propietarias.
Esta imagen nos muestra cómo se interactuaba con estos diferentes servicios de
directorio sin JNDI
JNDI proporciona una API común a una variedad de servicios de directorios. Este API
está incluido como parte estándar de Java, del mismo modo que JDBC proporciona una
API estándar para las Bases de Datos Relacionales.
Esta imagen nos muestra cómo JNDI unifica el acceso a servicios de directorio de
redes heterogéneos:
De esta forma todo el mundo que quiera acceder a una BDS particular solamente tiene
que comunicarse con el proveedor de servicios JNDI e indicarle el nombre de directorio
de la BDS en cuestión.
La ventaja de utilizar esta forma de acceder a una BDS es que ésta puede cambiar su
localización, es decir su dirección IP, e incluso también puede cambiar el nombre de la
BDS pero todos estos cambios son transparentes al usuario que quiere conectar con
dicha BDS.
Cadenas de conexión
// MySQL
Connection conexion = DriverManager.getConnection(
"jdbc:mysql://servidor:3306/database",
"usuario",
"password");
Tipos de conexión
Adjuntar el fichero jar que nos suministre el proveedor para poder conectarnos a su base
de datos.
En la siguiente imagen adjuntamos el fichero jar a nuestro proyecto con las clases
necesarias para trabajar con una base de datos Oracle. Simplemente se añade en la
carpeta Libraries de nuestro proyecto, que como ya vimos el equivalente a classpath de
java.
Métodos de la clase
connection
void clearWarnings()
Borra todos los warnings comunicados por este objeto
Connection
void close()
Cierra la conexión liberando todos los recursos que
estuviese utilizando.
Statement createStatement()
Crea una sentencia (representada por el objeto Statement)
que permitirá enviar comandos SQL a la base de datos.
SQLWarning getWarnings()
Devuelve el primer warning provocado por llamadas sobre
este objeto Connection.
boolean isClosed()
Comprueba si la conexión está cerrada.
boolean isReadOnly()
Comprueba si la conexión está en modo de sólo lectura.
2. Descomprimir el rar bajado anteriormente e instalar. Los pasos que tenéis que
seguir son: pinchar en siguiente continuamente excepto en el caso en el que os pide
que introduzcáis un password. Este password será el pasword del administrador de
bases de datos.
3. Iniciar la BD. Para ello tenéis que ir a programas/Oracle Database 11g Express
edition/Start Database
4. IMPORTANTE: hay que cambiar el puerto del servidor web que viene con el
servidor de BD. Para ello abrís una consola de Windows cmd o directamente ir a
programas/ejecutar/cmd
En la consola escribís sqlplus y ejecutáis. Luego os pide un login y password teneis que
usar como login:system y password el que hayáis escogido durante la instalación y luego
ejecutáis la sentencia: exec dbms_xdb.sethttpport('7979'); y tras la ejecución
satisfactoria del comando cerráis la consola y reiniciais.
Indicáis un nombre de conexión cualquiera, como login usáis: system, sin espacios y
como password, el pasword que le habréis indicado durante la instalación del servidor
de bases de datos.
9. Crear una base de datos nueva, para ello copiáis el siguiente contenido en el editor
de consultas de SQLDeveloper y pincháis en ejecutar script.
Una aproximación muy sencilla de lo que supone una BD en Oracle es que las BD están
asociadas a usuarios por tanto al crear un usuario nuevo, en este caso DB_TEST,
hemos creado una BD.
10. Para acceder a la nueva BD creada cerráis la conexión anterior y abrís una nueva
conexión usando como login y password: DB_TEST
11. Creación de tablas en la BD. En este caso vamos a crear la tabla empleados para
el laboratorio 1. Recordad que este ejercico ya lo hemos hecho para una BD MS Acces
pues a partir de ahora se va a poder hacer con una BD Oracle.
NAME VARCHAR2(100),
ENAME VARCHAR2(100),
JOB VARCHAR2(100),
DEPTNO VARCHAR2(100)
);
commit;
DNAME VARCHAR2(100),
LOC VARCHAR2(100)
);
commit;
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","DB_TEST",
"DB_TEST");
SQL es un lenguaje de acceso a las bases de datos que ofrece gran diversidad de
operaciones aprovechando la potencia y flexibilidad de los sistemas relacionales.
El compilador DDL convierte las instrucciones DDL en una serie de tablas que
contienen los metadatos o datos acerca de los datos. El resultado de compilar todas las
instrucciones DDL se almacena en el Diccionario de Datos.
Por otro lado, DML es definido como el idioma facilitado por los sistemas gestores de
bases de datos, el cual permite que los usuarios de la base de datos puedan realizar
tareas de modificación o consulta de datos alojados en la base de datos mediante un
sistema gestor de base de datos.
Bases de datos.
Al crear una base de datos, ésta no queda seleccionada por defecto como la base de
datos que se va a usar, debe hacerse explícitamente mediante:
USE nombre_de_la_BD
Tablas
[(create_definition,...)]
[table_options] [select_statement]
CREATE TABLE crea una tabla con el nombre dado. Debe tener el permiso CREATE
para la tabla.
Por defecto, la tabla se crea en la base de datos actual. Ocurre un error si la tabla existe,
si no hay base de datos actual o si la base de datos no existe.
Vistas
AS sentencia_select
Esta sentencia crea una vista nueva o reemplaza una existente si se incluye la cláusula
OR REPLACE. La sentencia_select es una sentencia SELECT que proporciona la
definición de la vista. Puede estar dirigida a tablas de la base o a otras vistas.
Se requiere que posea el permiso CREATE VIEW para la vista, y algún privilegio en
cada columna seleccionada por la sentencia SELECT. Para columnas incluidas en otra
parte de la sentencia SELECT debe poseer el privilegio SELECT. Si está presente la
cláusula OR REPLACE, también deberá tenerse el privilegio DELETE para la vista.
Toda vista pertenece a una base de datos. Por defecto, las vistas se crean en la base
de datos actual. Pera crear una vista en una base de datos específica, indíquela con
base_de_datos.nombre_vista al momento de crearla.
Disparadores o Triggers
Un disparador es un objeto con nombre en una base de datos que se asocia con una
tabla, y se activa cuando ocurre un evento en particular para esa tabla.
El disparador queda asociado a la tabla nombre_tabla. Esta debe ser una tabla
permanente, no puede ser una tabla TEMPORARY ni una vista.
IS
BEGIN
Instrucciones de ejecución
[EXCEPTION]
Instrucciones de excepción
END;
Bases de datos
alter_specification [, alter_specification]
Tablas
alter_specification:
ALTER TABLE le permite cambiar la estructura de una tabla existente. Por ejemplo,
puede añadir o borrar columnas, crear o destruir índices, cambiar el tipo de columnas
existentes, o renombrar columnas o la misma tabla. Puede cambiar el comentario de la
tabla y su tipo.
Vistas
AS sentencia_select
Disparadores o Triggers
Procedimientos.
characteristic:
{}
| COMMENT 'string'
Bases de datos.
DROP DATABASE borrar todas las tablas en la base de datos y borrar la base de datos.
Para usarDROP DATABASE, es necesario tener asignado el permiso DROP en la base
de datos. IF EXISTS se usa para evitar un error si la base de datos no existe.
Tablas.
[RESTRICT | CASCADE]
DROP TABLE borra una o más tablas. Debe tener el permiso DROP para cada tabla.
Todos los datos de la definición de tabla son borrados, así que tenga cuidado con este
comando.
Use IF EXISTS para evitar un error para tablas que no existan. Un NOTE se genera
para cada tabla no existente cuando se usa IF EXISTS.
Vistas
[RESTRICT | CASCADE]
DROP VIEW elimina una o más vistas de la base de datos. Se debe poseer el privilegio
DROP en cada vista a eliminar.
Disparadores o Triggers.
Procedimientos.
Este comando se usa para borrar un procedimiento. Es necesario disponer del permiso
ALTER. Este permiso se le asigna de forma automática al creador de la rutina.
Las consultas de selección, las utilizamos para que nuestro motor de datos nos
devuelva información de la base de datos. Los datos devueltos tendrán forma de
conjunto de registro y se podrán almacenar en un objeto recordset. El conjunto de
registros será modificable.
• Consultas básicas.
totalmente
SELECT [{,}]
FROM
[WHERE ];
queremos mostrar
Para insertar datos en una tabla, SQL dispone de la sentencia INSERT. La sintaxis de
la sentencia INSERT es la siguiente:
Para borrar de datos de una tabla se realiza con la sentencia DELETE. Se puede hacer
la eliminación de los datos de una tabla o de múltiples tablas:
Por ejemplo, si se quisieran eliminar los registros de la tabla “Tienda” a cuando el artículo
sea el 1, se haría:
Además de las sentencias que se acaban de ver para llevar a cabo la manipulación de
datos existen otras no tan habituales.
Veamos un ejemplo en postgreSQL para darle todos los permisos al rol webuser sobre
todas las vistas del esquema public:
DO $$DECLARE r record;
BEGIN
LOOP
END LOOP;
END$$;
REPLACE.
Con esta función se puede reemplazar un texto por otro dentro de una consulta sobre
una cadena de texto,
Existen otras muchas sentencias, para llevar a cabo la manipulación de datos, aunque
la mayoría de ellas no son estándar.
Por ejemplo:
- DECLARE: Sirve para definir cursores. Los cursores se pueden usan para recuperar
un número relativamente pequeño de filas de una consulta que devuelva un número
elevado de filas.
3.3.11 Subconsultas
Hay pocas restricciones sobre los tipos de comandos en que pueden usarse las
subconsultas. Una subconsulta puede contener cualquiera de las palabras claves o
cláusulas que puede contener un SELECT ordinario: DISTINCT, GROUP BY, ORDER
BY, LIMIT, joins, trucos de índices, constructores UNION, comentarios, funciones, y así.
Una restricción es que el comando exterior de una subconsulta debe ser: SELECT,
INSERT, UPDATE, DELETE, SET, o DO. Otra restricción es que actualmente no
puede modificar una tabla y seleccionar de la misma tabla en la subconsulta. Esto se
aplica a comandos tales como DELETE, INSERT, REPLACE, y UPDATE.
El diccionario de datos contiene información relevante o metadatos sobre los datos que
se almacenan en la base de datos, y por tanto estos datos también se almacenarán
como el resto de datos, en la propia base de datos, pero sólo el sistema o
un usuario concreto podrá mantener estos datos. El SGBD podrá gestionar los recursos
haciendo uso de esta información. Esta información sobre los datos definirá la estructura
de los datos, el tipo de datos que se van a usar, las restricciones que van a tener, índices
para un acceso más rápido, etc.
Como veíamos antes, el diccionario de datos está compuesto por datos debe
almacenarse en la propia base de datos, y por tanto habrá una serie de tablas y vistas
que conformarán la estructura del diccionario de datos. Estas tablas estarán dedicadas
exclusivamente a proporcionar información sobre los objetos de la base de datos. Suele
haber una tabla en el diccionario de datos para cada tipo de objeto posible: tablas, vistas,
usuarios, roles, secuencias, disparadores, etc.
Los SGBD deben encargarse de mantener la integridad de los datos con respecto a las
definiciones y restricciones que se hayan definido en la base de datos, pero la integridad
de los datos también puede controlarse a la hora de introducir los datos, por ejemplo
cuando se lleva a cabo la validación de un campo a través de un formulario, es decir, si
se introducen letras en un campo dedicado a cantidades numéricas, esto estaría
violando la integridad de los datos ya que no sería un dato correcto y se podría gestionar
mediante una validación del tipo de dato o del rango donde debe estar incluido, etc.
Las restricciones de integridad que imponga el usuario se mantendrán para una base
de datos concreta, pero no para cualquier base de datos que se cree, sin embargo, las
restricciones del modelo son unas restricciones implícitas que se van a cumplir para
cualquier base de datos que se cree siguiendo dicho modelo. Entre las reglas de
integridad del modelo podemos destacar:
-Regla de unicidad de clave primaria, es decir, la clave primaria que se elija para una
tabla debe ser única para cada registro, por tanto, no puede haber valores repetidos en
el conjunto de valores de la clave primaria.
- Regla de entidad de la clave primaria, que quiere decir que el valor nulo no puede
ser un valor válido para la clave primaria.
- Regla de integridad referencial, que quiere decir que los valores que tomen las
claves externas tienen que ser valores que existan en la clave primaria a la que hacen
referencia o ser nulos.
A través del objeto Connection, que representa una conexión física con la base de
datos, podemos crear y lanzar sentencias SQL.
Statement sentencia=conexion.createStatement();
Métodos de la clase
Statement
void cancel()
Cancela este objeto Statement si el DBMS y el driver
soportan el abortar sentencias SQL.
void clearWarnings()
Borra todos los warnings comunicados por este objeto
Statement.
void close()
Cierra este objeto Statement y libera todos los recursos que
estaba usando.
Connection getConnection()
JDBC 2.0 Devuelve el objeto Connection que produjo este
objeto Statement.
int getMaxFieldSize()
Devuelve el número máximo de bytes permitidos en el valor
de cualquier columna.
int getMaxRows()
Devuelve el número máximo de registros que puede
contener un ResultSet.
boolean getMoreResults()
Se mueve al siguiente registro del objeto Statement.
int getQueryTimeout()
Devuelve el número de milisegundos que esperará el driver
a que una sentencia SQL se ejecute.
ResultSet getResultSet()
Devuelve el resultado actual como un objeto ResultSet.
SQLWarning getWarnings()
Devuelve el primer warning comunicado en la llamadas
sobre este objeto Statement.
Según lo que hemos visto, el código de lanzamiento de una consulta de selección será
el siguiente:
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"SYSTEM", "12345");
Statement sentencia =
cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_R
EAD_ONLY);
ResultSet rs = sentencia.executeQuery("SELECT DISTINCT JOB FROM EMP");
También se puede utilizar el método execute(), que sirve para todas las consultas.
Simplemente retorna verdadero si se ha retornado un objeto ResultSet y falso si se ha
retornado un entero o nada.
Crear un sitio web para poder visualizar información de las distribuidoras de un cine.
commit;
La página Distribuidoras.jsp debe cargar los datos de los tres campos de la tabla
distribuidoras:
<html>
<head>
<title>PRINCIPALES DISTRIBUIDORAS</title>
</head>
<body>
<center>
</center>
<BR>
<%
Statement sentencia=conexion.createStatement();
while(rs.next()){
String direccion=rs.getString(1);
String nombre=rs.getString(2);
String imagen=rs.getString(3);
if(par%2!=0){
out.println("<tr>");
out.println("<tD width=30>"+enlazar+"<img
src=IMAGENES\\DISTRIBUIDORAS\\"+imagen+" alt=\""+nombre+"\" border=0
width=60 height=42></a></td>");
out.println("<td align=left>"+enlazar+nombre+"</a></td></tr></table></TD>");
if(par%2==0){
out.println("</tr>");
par++;
if(par%2==0){
%>
</table>
</body>
</html>
Un ResultSet es una clase java similar a una lista que contiene el resultado de la
consulta. Cada elemento de la lista es uno de los registros de la base de datos. En
realidad, un ResultSet no contiene todos los datos de la consulta, sino que los va
obteniendo de la base de datos según se van pidiendo. De esta forma el método
executeQuery() tarda muy poco tiempo, pero en cambio recorrer los elementos del
ResultSet ya no es tan rápido. Así evitamos que una consulta que retorne muchos datos
tarde demasiado tiempo y ocupe demasiada memoria del programa java.
while(resultado.next()){
String titulo=resultado.getString("TITULO");
String autor=resultado.getString("AUTOR");
int precio=resultado.getInt("Precio");
Date publicacion=resultado.getDate("PUBLICACION");
System.out.println(....imprimir campos...");
Como se puede ver en los métodos de abajo, cada getxxx tiene dos posibilidades: dar
el nombre de la columna como un String o dar un índice que hace referencia al campo
en concreto (el índice comienza en 1 y se refiere al ResultSet que obtenemos de la
consulta y no a la base de datos completa).
Métodos de
ResultSet
void afterLast()
JDBC 2.0 Permite situarnos después del último registro.
void beforeFirst()
JDBC 2.0 Permite situarnos antes del primer registro.
void close()
Cierra el objeto ResultSet y se liberan los recursos que estaba
usando.
void deleteRow()
JDBC 2.0 Borra el registro del ResultSet en el que nos
encontramos actualmente.Deletes the current row from the result
set and the underlying database.
boolean first()
JDBC 2.0 Nos colocamos en el primer registro.
String getCursorName()
Obtiene el nombre del cursor SQL usado por este ResultSet.
Statement getStatement()
JDBC 2.0 Devuelve el objeto Statement que produjo este objeto
ResultSet.
int getType()
JDBC 2.0 Devuelve el tipo de este ResultSet.
SQLWarning getWarnings()
Retorna el primer warning comunicado en llamadas a este
ResultSet.
void insertRow()
JDBC 2.0 Inserta los contenidos del registro en el objeto
ResultSet y en la base de datos.
boolean isAfterLast()
JDBC 2.0 Detecta si el cursor está después del último registro.
boolean isBeforeFirst()
JDBC 2.0 Detecta si el cursor está antes del primer registro.
boolean isFirst()
JDBC 2.0 Detecta si el cursor está en el primer registro.
boolean last()
JDBC 2.0 No sitúa en el último registro.
boolean next()
Mueve el cursor al siguiente registro.
boolean previous()
JDBC 2.0 Mueve el cursor al registro anterior.
void refreshRow()
JDBC 2.0 Refresca la fila actual con su valor más reciente en la
base de datos.
boolean rowDeleted()
JDBC 2.0 Indica si un registro ha sido borrado. Contrasta nuestro
ResultSet con la base de datos.
boolean rowInserted()
JDBC 2.0 Indica si el registro actual ha sufrido alguna inserción.
boolean rowUpdated()
JDBC 2.0 Indica si el registro actual ha sido actualizado.
void updateRow()
JDBC 2.0 Actualiza la base de datos con los nuevos contenidos
del registro actual.
boolean wasNull()
Comunica si la última columna leída tiene un valor SQL nulo.
Métodos de
ResultSetMetaData
int getColumnCount()
Devuelve el número de columnas de este ResultSet.
Vamos a realizar una página JSP que contendrá un desplegable con todos los oficios
de la tabla empleados.
Lo primero que vamos a realizar será crearnos un nuevo proyecto Web Application.
Lo que debemos realizar ahora es el acceso mediante JDBC a la tabla EMP de Oracle.
Para ello, debemos agregar dentro de la carpeta Libraries el conector JDBC para
Oracle.
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<%try {
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"SYSTEM", "12345");
<H1>Oficios de Empleados</H1>
<SELECT NAME='cmboficio'>
String opcioneshtml="";
oficio = request.getParameter("cmboficio");
while (rs.next())
}else{
}%>
<%=opcioneshtml%>
</SELECT>
</FORM>
<%
String tabla="";
if (oficio!=null)
pst.setString(1, oficio);
rs = pst.executeQuery();
tabla="<table border='1'>";
while (rs.next())
tabla += "<tr><td>"+rs.getString(1)+"</td></tr>";
tabla += "<tr><td>"+rs.getString(2)+"</td></tr>";
tabla += "<tr><td>"+rs.getString(3)+"</td></tr>";
tabla += "</table>";%>
<%=tabla%>
<%}%>
<h1>Error: <%=ex.toString()%></h1>
<%}%>
</body>
</html>
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"SYSTEM", "12345");
Statement actualizacion= cn.createStatement("");
actualizacion.executeUpdate("DELETE FROM autores WHERE id = 101");
Este método retorna un entero que indica el número de filas afectadas por la consulta.
También se puede utilizar el método execute(), que sirve para todas las consultas.
Simplemente retorna verdadero si se ha retornado un objeto ResultSet y falso si se ha
retornado un entero o nada.
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"SYSTEM", "12345");
Statement actualizacion= cn.createStatement();
actualizacion.executeUpdate("ALTER table autor add (ultima_publicacion_autor
date");
Creación de la tabla
Creamos la tabla DBUSER, con los campos id, username, created_by y created_date.
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
}
private static Connection getDBConnection() {
Connection dbConnection = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
dbConnection = DriverManager.getConnection(
DB_CONNECTION, DB_USER,DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
Inserción en la tabla
Creamos la tabla DBUSER, con los campos id, username, created_by y created_date.
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
try {
dbConnection = getDBConnection();
statement = dbConnection.createStatement();
System.out.println(insertTableSQL);
// execute insert SQL stetement
statement.executeUpdate(insertTableSQL);
System.out.println("Registro insertado en DBUSER!");
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
if (statement != null) {
statement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
}
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
try {
if (statement != null) {
statement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
}
try {
dbConnection = DriverManager.getConnection(
DB_CONNECTION, DB_USER,DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
if (dbConnection != null) {
dbConnection.close();
}
}
}
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER,
DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
}
Actualización de registros
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
dbConnection = DriverManager.getConnection(
DB_CONNECTION, DB_USER,DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
}
Borrado de registros
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
try {
dbConnection = DriverManager.getConnection(
DB_CONNECTION, DB_USER,DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
}
JDBC permite que las declaraciones de SQL sean agrupadas juntas en una sola
transacción. De esta forma se puede garantizar la atomicidad y consistencia de datos,
usando las características transaccionales de JDBC.
conexion.setAutoCommit(false);
Cuanto auto-commit esta a false, para poder aplicar los cambios provocados por las
conexion.commit();
conexión.rollback()
Ejemplo de transacción
// Declara la conexión
Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"SYSTEM", "12345");
//Declara los alumnos a insertar
Alumno a1 = new Alumno(“José”);
Alumno a2 = new Alumno(“Luis”);
Alumno a3 = new Alumno(“Miguel”);
try{
// Define la conexión
cn = AdministradorDeConexiones.getConnection();
// Se asigna falso a auto-commit
cn.setAutoCommit(false);
//Comienzo de la transacción
a1.insertar(cn);
a2.insertar(cn);
a3.insertar(cn);
Sin transacción
preparedStatementInsert = dbConnection.prepareStatement(insertTableSQL);
preparedStatementInsert.setInt(1, 999);
preparedStatementInsert.setString(2, "usuario101");
preparedStatementInsert.setString(3, "system");
preparedStatementInsert.setTimestamp(4, getCurrentTimeStamp());
preparedStatementInsert.executeUpdate(); //Datos actualizados en la base de datos.
preparedStatementUpdate = dbConnection.prepareStatement(updateTableSQL);
preparedStatementUpdate.setString(1, "Una cadena demasiado larga causará un
Como vemos, la primera consulta se ejecuta correctamente, con lo que el usuario 999
se crea en la base de datos. Sin embargo, la segunda consulta falla, con lo que la
actualización no se lleva a cabo y el registro queda con los valores iniciales sin
actualizar.
Con transacción
La solución será incluir las dos operaciones en una transacción, con lo que ante el error
se cancelan todos los cambios, y se evita incluir el usuario 999 inconsistente.
La instrucción que causa el error se puede comentar y utilizar la que hay justo debajo
que no causaría error.
package com.demo.jdbc;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
preparedStatementUpdate = dbConnection.prepareStatement(updateTableSQL);
1. getErrorCode ()
2. getMessage ()
Obtiene el mensaje de error del controlador JDBC para un error, manejado por el
de datos.
3. getSQLState ()
devuelve información útil de este método. Para un error de base de datos, se devuelve
el código de cinco dígitos XOPEN SQLstate. Este método puede devolver nulo.
4. getNextException ()
5. printStackTrace ()
la pantalla).
7. printStackTrace (PrintWriter w)