Aplicaciones Java + JDBC

Documentos relacionados
Acceso a BD desde Java. JDBC

Acceso a bases de datos desde Java: JDBC

Acceso a BDs en Java: JDBC

JDBC. Aplicaciones Distribuidas

10. JDBC. 10. JDBC Introducción. java.sql

JDBC. Francisco Javier Solans Benedí Software Developper

Laboratorios de BASES DE DATOS. (I.T. Informática)

NORMAS PARA LA ENTREGA DE LOS LABORATORIOS

Java y MySQL. Ciclo de ejecución

Practica 11: Conexión de Java con Bases de datos Access

MSSQL Server Java

Bases de Datos Introducción a la Conectividad de

JDBC. Una mini-introducci. introducción

Especificaciones del driver JDBC

Base de Datos JDBC. Unidad: 1 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

Universidad Don Bosco. Materia: Programación Orientada a Objetos Contenido: Modificadores de Acceso y JDBC

Programación Orientada a Objetos II. La Plataforma JDBC

Federico Peinado

Java y Bases de Datos (Oracle). Una síntesis. Sergio Gálvez Rojas Miguel Ángel Mora Mata

Práctica 2 ACCESO A BASES DE DATOS CON JDBC. 1. Creación de una base de datos en MySQL...1

Bases de datos y JDBC

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS

Capa de Gestión de Datos. Persistencia Bases de Datos - JDBC

Desarrollo de Software con

MySQL con Java en MS Windows

JAVA 7 Los fundamentos del lenguaje Java

Base de Datos Oracle: desarrollo de aplicaciones

Arquitectura J2EE para aplicaciones web. Aplicaciones web con JSP. Arquitectura J2EE: Capa de Acceso Web. Arquitectura J2EE: Capa Cliente

Diseño de la capa de datos. Acceso a datos con JDBC

JDBC: EL PUENTE ENTRE JAVA Y LAS BASES DE DATOS. En este articulo se expone la API JDBC (Java DataBase Connetivity), la cual permite el

Establecer una conexión con una base de datos o acceder a cualquier fuente de datos tabular Enviar enunciados SQL. Procesar los resultados

Bases de Datos usando Java : JDBC. Ing. César Julio Bustacara Medina

JDBC. Curso 04/05. Tema 8 JDBC. Departament d Informàtica. Universitat de València. 1. Introducción Arquitecturas típicas...

Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:

//Sección de manejo de excepciones. Las rutinas de manejo de errores //aparecen aqui

Java con Bases de Datos

Objetivos y Temario CURSO MySQL 5

JDBC Julio Introducción JDBC Arquitecturas típicas con JDBC... 3

Contenido. Bases de Datos en Java: JDBC y Patrón DAO 26/04/2007

- Compilar y ejecutar programas en Java - Estructura básica de una clase - El comando javac - El comando java - Introducción al IDE de desarrollo

TEMA 11 INDICE [PROGRAMACIÓN]

JDBC: Java DataBase Conectivity

TUTORIAL CONEXIÓN SQLSERVER CON JAVA DESDE ECLIPSE

C.I.F.: B Inscrita en el Registro Mercantil de Madrid, Tomo Libro 0, Folio 135, Sección 8. Hoja M Inscripción 1ª

SUBPROGRAMAS PL/SQL César Martínez C. Profesor Instructor de Base de Datos Sede Puente Alto DUOC

Programación y Acceso a BD con SQL

INTRODUCCIÓN. El objetivo de este manual es la identificación de los procesos técnicos más

Transacciones, copias de seguridad. Xochitl Clemente Parra Armando Méndez Morales

JDBC. Cada celda de la tabla debe tener solamente un valor (nunca un conjunto de valores). (1NF)

Plugin para NetBeans que realiza migración de una base de datos postgresql a couchdb.

Guía práctica de introducción básica a JDBC

Programación Orientada a Objetos Analista Programador Universitario Plan 2008 Año 2010

8. JDBC: acceso a bases de datos

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

II Curso Online JAVA-J2EE

MySQL 5 (versiones 5.1 a 5.6) Guía de referencia del desarrollador

Notas técnicas de JAVA - Tip en detalle Nro. 2

Práctica 3 Manejo de Base de Datos(Java-MySQL) desde consola

Cursores Explícitos. Copyright Oracle Corporation, All rights reserved.

Copyright. Para cualquier duda, consulta, insulto o tirón de orejas sobre este tutorial dirigirse a abraham@javahispano.org. El ABC de JDBC 1 de 36

Qué es JDBC? Cuatro tipos de drivers JDBC Uso de JDBC

Acceso a bases de datos con JDBC

MySQL por línea de comandos

Base de Datos Oracle 10g: Programación con PL/SQL Código: D Duración: 5 días (40 horas)

USANDO SERVLETS EN UN SERVIDOR WEB RESIN

Curso Querying Microsoft SQL Server 2014 (20461)

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

TEMA 1 ACCESO A BASE DE DATOS 1. QUE ES UN JDBC ODBC?

Acceso a bases de datos SQL - JDBC. CAPITULO IV POR Lic Adrian Quisbert Vilela

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

JDBC: Conexiones con bases de datos desde Java

Introducción InterBase 7

Práctica sobre compartición de instancias remotas.

MultiBase. Notas a la versión 3.4. BASE 100, S.A.

8 ACCESS CURSO PRÁCTICO RA-MA

Modificación de datos

JDBC: Conexiones con bases de datos desde Java

Ciclo Formativo de Grado Superior de Administración de Sistemas Informáticos en red

UNIVERSIDAD DE MAGALLANES FACULTAD DE INGENIERIA DEPARTAMENTO DE COMPUTACIÓN DESARROLLO DE SOFTWARE PARA CONTROL DE INVENTARIO

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Formato para prácticas de laboratorio

GUIA 3 PARTE II. Introducción a PL/SQL

Oracle PL/SQL. Programa de Estudio.

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Oracle Database: Programación con PL/SQL

El primer paso a realizar es crear la referencia JNDI para el origen de datos en el servidor local TomCat.

El Lenguaje PL/SQL. Un lenguaje de propósito general orientado a la inclusión de sentencias SQL. Estructura del código PL/SQL.

JDBC - Acceso a Bases de Datos

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

PHP y Acceso a Datos

Cursores, Triggers, Indices, Transacciones, Vistas Gestión y Modelación de Datos

Laboratorio Informix. Stored Procedures Triggers

Transcripción:

Gestión de la Información Aplicaciones Java + JDBC José Luis Pastrana Brincones (pastrana@lcc.uma.es)

Qué es JDBC? JDBC (Java DataBase Connectivity) consiste en una API de alto nivel y diferentes drivers cada uno para conectarse a una base de datos distinta. JDBC proporciona una interfaz estándar de acceso a bases de datos relacionales. JDBC es independiente de dónde se encuentre el cliente y dónde esté el servidor. 2

3 Arquitectura General

Un programa Java se conecta a una base de datos con JDBC realizando las siguientes operaciones: 1. Importación de paquetes 2. Carga del driver JDBC 3. Conexión con la base de datos 4. (Opcional) Averiguar las capacidades de la base de datos 5. (Opcional) Obtención de metadatos propios del esquema al que nos hemos conectado 6. Construcción de la sentencia SQL y ejecución 7. Procesamiento de resultados, si los hay 8. Cierre de la sentencia y del cursor, si lo hay 9. Cierre de la conexión 4

El controlador JDBC de Microsoft SQL Server es un controlador compatible con Java Database Connectivity (JDBC) 4.0 que proporciona un acceso confiable a los datos de las bases de datos de Microsoft SQL Server. Puede descargarse desde la página de la asignatura en el campus virtual o desde http://msdn.microsoft.com/eses/sqlserver/aa937724.aspx 5

Para usar el Driver de JDBC-SQL Server hay que: Agregar sqljdbc.jar ó sqljdbc4.jar en el path de compilación de nuestro proyecto java 6

Si usamos autentificación de windows: Incluir la librería correspondiente (x86/x64) en el entorno de ejecución de nuestra máquina virtual de java: -Djava.library.path= \Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\esn\auth\x64" 7

JDBC 1.0 permite accesos más o menos básicos a una base de datos. JDBC 2.0 permite muchas más cosas: Los cursores (llamados resultset), se pueden recorrer de arriba abajo o viceversa, incluso cambiando el sentido. Se admite un mayor número de tipos de datos. Pool de conexiones. Transacciones distribuidas. Paquetes javax.sql.* en el lado cliente. El JDK 1.2 es compatible con JDBC 2.0 a través del paquete java.sql.*. 8

JDBC 3.0 permite algunas cosas más: Al llamar a un procedimiento almacenado, los parámetros pueden pasarse por nombre en vez de por posición. Si una tabla tiene un campo autonumérico, permite averiguar qué valor se le ha dado tras una inserción. Se proporciona un pool de conexiones automático. Se permite el uso de SAVEPOINT. JDBC 4.0 aún añade más cosas: No es necesario cargar el driver para realizar la conexión. El DriverManager lo hace de manera inteligente y automática. Soporta el tipo ROWID mediante la clase RowId. Mejora en la gestión de excepciones: SQLException tiene nuevas subclases y las excepciones múltiples pueden recorrerse mediante un bucle. Soporte para caracteres nacionales. 9

Usar JDBC con SQL Server 1. Importación de paquetes import java.sql.*; import com.microsoft.sqlserver.jdbc.*; 2. Carga del driver JDBC El driver puede cargarse de dos formas: Mediante la biblioteca de clases sqljdbc.jar, primero las aplicaciones deben registrar el controlador del modo siguiente: Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Una vez cargado el controlador, puede establecer una conexión con una URL de conexión y el método getconnection de la clase DriverManager: 10

Ejemplo: Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String connectionurl = "jdbc:sqlserver://localhost:1433;" + databasename=mydb;user=myusername;password=*****;"; Connection con = DriverManager.getConnection(connectionUrl); Conexión a la base de datos con seguridad de windows jdbc:sqlserver://localhost;databasename=mydb; integratedsecurity=true; Conexión en el puerto predeterminado con el servidor remoto: jdbc:sqlserver://localhost:1433;databasename=mydb; integratedsecurity=true; 11

En la API 4.0 de JDBC, el método DriverManager.getConnection se ha mejorado para que se carguen los controladores JDBC automáticamente. Por tanto, no es necesario que las aplicaciones llamen al método Class.forName para registrar o cargar el controlador cuando se use la biblioteca de clases sqljdbc4.jar. Cuando se llama al método getconnection de la clase DriverManager, se encuentra un controlador apropiado en el conjunto de controladores JDBC. El archivo sqljdbc4.jar incluye el archivo "META-INF/services/java.sql.Driver", que contiene el com.microsoft.sqlserver.jdbc.sqlserverdriver como un controlador registrado. Las aplicaciones existentes, que actualmente cargan los controladores usando el método Class.forName, seguirán trabajando sin modificación 12

Ejemplo: SQLServerDataSource ds = new SQLServerDataSource(); ds.setintegratedsecurity(true); ds.setservername( localhost"); ds.setportnumber(1433); ds.setdatabasename("hotel"); Connection con = ds.getconnection(); 13

Construcción de la sentencia SQL y ejecución Toda sentencia está asociada a una conexión. Statement stmt = con.createstatement(); Si la sentencia a ejecutar es un SELECT se ejecuta: stmt.executequery("select * FROM usuario; ); Si la sentencia a ejecutar es un INSERT, UPDATE o DELETE se ejecuta: stmt.executeupdate("delete FROM usuario WHERE Nombre= pepe';"); Procesamiento de resultados, si los hay Un executequery devuelve un cursor, implementado con un objeto de tipo ResultSet. ResultSet rset = stmt.executequery("select * FROM usuario; ); 14

Cierre de la sentencia y del cursor, si lo hay rset.close(); stmt.close(); Cierre de la conexión con.close(); 15

Procesamiento del ResultSet El procesamiento se divide en dos partes: 1. Acceso a los registros obtenidos, de uno en uno. 2. Obtención de los valores de las columnas, de una en una. El acceso a los registros se hace en base al método next() de los ResultSet., que devuelve un valor booleano que indica si hay o no siguiente registro. Las columnas pueden ser accedidas por nombre o por posición. Para ello se usa un método que depende del tipo de la columna obtenida: getint, getstring, getfloat, etc. 16

Ejemplo Procesamiento del ResultSet. while (rset.next()) { System.out.println( rset.getstring( Nombre"); + "-" + rset.getstring( pwd") + "-" + rset.getint( rol ) ); } 17

Procesamiento del ResultSet Una vez procesador un ResultSet hay que cerrarlo, así como la sentencia que lo originó. Caso de no hacerlo se estarán ocupando cursores y bloques de memoria innecesarios, pudiendo producirse un error al superar el número máximo de cursores abiertos. Una vez que se haya acabado todo el procesamiento con la base de datos, se debe cerrar la conexión. 18

La conexión se abre una sola vez al comienzo de la sesión y se cierra una vez acaba la sesión. Una misma sesión puede ejecutar múltiples sentencias. Tanto los ResultSet, las Statement y las Connection se cierran con close(). Los métodos relacionados con SQL pueden lanzar la excepción SQLException, por lo que todo ha de enmarcarse en un try-catch. 19

SQLServerDataSource ds = new SQLServerDataSource(); ds.setintegratedsecurity(true); ds.setservername( localhost"); ds.setportnumber(1433); ds.setdatabasename("hotel"); Connection con = ds.getconnection(); Statement stmt = con.createstatement(); ResultSet rset = stmt.executequery("select * FROM usuario WHERE Nombre=' + name + "';"); rset.next(); // Solo debe haber 1 resultado System.out.println( name + "-" +rset.getstring( pwd") + "-" + rset.getint( rol ) ); rset.close(); stmt.close(); con.close(); 20

SQLServerDataSource ds = new SQLServerDataSource(); ds.setintegratedsecurity(true); ds.setservername( localhost"); ds.setportnumber(1433); ds.setdatabasename("hotel"); Connection con = ds.getconnection(); Statement stmt = con.createstatement(); stmt.executeupdate("insert INTO usuario VALUES('" + n + "','" + p + "'," + r + ");"); stmt.close(); con.close() 21

SQLServerDataSource ds = new SQLServerDataSource(); ds.setintegratedsecurity(true); ds.setservername( localhost"); ds.setportnumber(1433); ds.setdatabasename("hotel"); Connection con = ds.getconnection(); Statement stmt = con.createstatement(); stmt.executeupdate("update usuario SET pwd=' + pwd + "' WHERE Nombre='"+ Nombre + "';"); stmt.close(); con.close(); 22

SQLServerDataSource ds = new SQLServerDataSource(); ds.setintegratedsecurity(true); ds.setservername( localhost"); ds.setportnumber(1433); ds.setdatabasename("hotel"); Connection con = ds.getconnection(); Statement stmt = con.createstatement(); stmt.executeupdate("delete FROM usuario WHERE Nombre=' + n + "';"); stmt.close(); con.close(); 23

Para trabajar con los datos de una base de datos de SQL Server con un procedimiento almacenado, el controlador JDBC de Microsoft SQL Server proporciona las clases: SQLServerStatement SQLServerPreparedStatement SQLServerCallableStatement. La clase usada depende de si el procedimiento almacenado requiere los parámetros IN (entrada) u OUT (salida). 24

Si el procedimiento almacenado no requiere ningún parámetro IN u OUT, puede usar la clase SQLServerStatement; Si requiere solo parámetros IN, puede usar la clase SQLServerPreparedStatement. Si el procedimiento almacenado requiere parámetros IN y OUT, debe usar la clase SQLServerCallableStatement. Solo si el procedimiento almacenado requiere parámetros OUT, necesita usar la clase SQLServerCallableStatement. 25

Los procedimientos almacenados también pueden devolver recuentos de actualizaciones y múltiples conjuntos de resultados. Si usa el controlador JDBC para llamar a un procedimiento almacenado con parámetros, debe usar la secuencia de escape de SQL call junto con el método preparecall de la clase SQLServerConnection. La sintaxis completa de la secuencia de escape call es la siguiente: {[?=]call procedurename[([parameter][,[parameter]]...)]} 26

Si el procedimiento almacenado no requiere ningún parámetro IN u OUT.Ejemplo: CREATE PROCEDURE GetContactFormalNames AS BEGIN END SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName FROM Person.Contact; 27

public void executesprocnoparams(connection con) { try { Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("{call GetContactFormalNames}"); while (rs.next()) { System.out.println(rs.getString("FormalName")); } rs.close(); stmt.close(); } catch (Exception e) { e.printstacktrace(); } } 28

Si requiere solo parámetros IN. Ejemplo: public void executesprocinparams(connection con) { try { PreparedStatement pstmt = con.preparestatement( "{call dbo.uspgetemployeemanagers(?)}"); pstmt.setint(1, 50); ResultSet rs = pstmt.executequery(); 29

while (rs.next()) { } } System.out.println("EMPLOYEE:"); System.out.println(rs.getString("LastName") + ", " + rs.getstring("firstname")); System.out.println("MANAGER:"); System.out.println(rs.getString("ManagerLastName") + ", " + rs.getstring("managerfirstname")); System.out.println(); rs.close(); pstmt.close(); catch (Exception e) { e.printstacktrace();} } 30

Si sólo requiere parámetros IN y OUT. Ejemplo: CREATE PROCEDURE GetImmediateManager @employeeid INT, @managerid INT OUTPUT AS BEGIN SELECT @managerid = ManagerID FROM HumanResources.Employee WHERE EmployeeID = @employeeid END 31

public void executestoredprocedure(connection con) { } try { CallableStatement cstmt = con.preparecall( "{call dbo.getimmediatemanager(?,?)}"); cstmt.setint(1, 5); cstmt.registeroutparameter(2, java.sql.types.integer); cstmt.execute(); System.out.println("MANAGER ID: " + cstmt.getint(2)); } catch (Exception e) { e.printstacktrace(); } 32

Caso de llamar a una función, se hace: preparecall( {? = call nombre_proc(?,?,?)} ) donde el 1er? se trata como un parámetro de salida. Ejemplo: CallableStatement cstmt = con.preparecall ("{? = call getrol(?,?)}"); cstmt.registeroutparameter(1,java.sql.types.integer); cstmt.setstring(2, n); cstmt.setstring(3, p); cstmt.execute(); r = cstmt.getint(1); 33

Por defecto, JDBC hace un COMMIT automático tras cada INSERT, UPDATE, o DELETE (excepto si se trata de un procedimiento almacenado). Este comportamiento se puede cambiar mediante el método setautocommit(boolean) de la clase Connection. Para hacer un COMMIT, la clase Connection posee el método commit(). Para hacer un ROLLBACK, la clase Connection posee el método rollback(). 34

Si se cierra la conexión sin hacer commit() o rollback() explícitamente, se hace un COMMIT automático, aunque el AUTO COMMIT esté a false. y También se permite el establecimiento y recuperación de puntos de salvaguarda con Savepoint setsavepoint(string nombre) rollback(savepoint sv) 35

El controlador JDBC de Microsoft SQL Server se puede usar para trabajar con los metadatos de una base de datos de SQL Server de distintos modos. El controlador JDBC se puede usar para obtener metadatos sobre la base de datos, un conjunto de resultados o los parámetros. El controlador JDBC proporciona tres clases para recuperar metadatos de una base de datos de SQL Server: SQLServerResultSetMetaData, que se usa para devolver información sobre el conjunto de resultados. SQLServerDatabaseMetaData, que se usa para devolver información sobre la base de datos conectada. SQLServerParameterMetaData, que se usa para devolver información sobre los parámetros de instrucciones preparadas e invocables. 36

Cuando un ResultSet recoge datos de una consulta desconocida (p.ej., introducida por teclado), no se sabe qué campos obtener. Para saber la estructura de una consulta se utiliza la clase SQLServerResultSetMetaData. Sus funciones más interesantes son: int getcolumncount(); // Número de campos por registro. String getcolumnname(int i) // Nombre de la columna i-ésima. int getcolumntype(int i) // Tipo de la columna i-ésima. Los tipos de las columnas vienen definidos por las constantes de java.sql.types. 37

Ejemplo: public class SelectDesconocido { public static void main(string args[]) { if (args.length == 0) { System.out.println("Necesito un argumento."); } 38

else { try { SQLServerDataSource ds = new SQLServerDataSource(); ds.setintegratedsecurity(true); ds.setservername( localhost"); ds.setportnumber(1433); ds.setdatabasename("hotel"); Connection con = ds.getconnection(); Statement stmt = con.createstatement(); 39

ResultSet rset = stmt.executequery(args[0]); SQLServerResultSetMetaData rsetmd = rset.getmetadata(); for(int i=1; i<=rsetmd.getcolumncount(); i++) { System.out.print(rsetMD.getColumnName(i)+" "); } System.out.println(""); 40

while(rset.next()) { for(int i=1; i<=rsetmd.getcolumncount(); i++) { if (rsetmd.getcolumntype(i) == Types.VARCHAR) System.out.print(rset.getString(i)+" "); else System.out.print(""+rset.getDouble(i)+" "); System.out.println(""); } } 41

42 } } } rset.close(); stmt.close(); con.close(); } catch(sqlexception x) { x.printstacktrace(); }

43 Los metadatos accesibles por la sesión actual pueden obtenerse a través de la conexión. Para ello se emplea el método getmetadata() que devuelve un objeto de tipo SQLServerDatabaseMetadata. El siguiente ejemplo muestra las tablas de las que es propietario el usuario actual. SQLServerDatabaseMetadata dbasemd = conn.getmetadata(); ResultSet rset = dbasemd.gettables( hotel,null, null, null); while(rset.next()){ } System.out.print(rset.getString("TABLE_CAT")+" "); System.out.print(rset.getString("TABLE_SCHEM")+" "); System.out.print(rset.getString("TABLE_NAME")+" "); System.out.println(rset.getString("TABLE_TYPE")+" ");

getcatalogs: Recupera los nombres del catálogo (nombre de las bases de datos) que están disponibles en el servidor conectado. getfunctions: Recupera una descripción de las funciones de usuario y del sistema. getprocedures: Recupera una descripción de los procedimientos almacenados que están disponibles en un modelo de nombre determinado de catálogo, esquema o procedimiento. gettables: Recupera una descripción de las tablas que están disponibles en el patrón de nombre determinado de catálogo, esquema o tabla. 44

SQLJ supone una interesante forma estándar de acceder a una base de datos. SQLJ es un estándard ISO (ISO/IEC 9075-10) para embeber sentencias SQL en programas Java. Al contrario que JDBC, SQLJ no es una API sino una extensión del lenguaje. Los programas SQLJ deben ejecutarse a través de un preprocesador (el traductor SQLJ) antes de que puedan ser compilados. 45

SQLJ tiene varias ventajas sobre JDBC: Los programas SQLJ son más fáciles de escribir y de mantener. Además tienden a ser más cortos que los programas JDBC equivalentes. Es más eficiente que JDBC dado que las sentencias SQL son analizadas y los caminos de acceso son optimizados en tiempo de compilación en lugar de en tiempo de ejecución. Suministra mejor control de autorización: La Autorización puede ser concedida a los programas en lugar de a los usuarios. Los problemas de rendimiento potenciales, tales como las consultas ineficientes debido a un mal camino de acceso, pueden ser identificados en tiempo de desarrollo. 46

Hay varias desventajas: Las sentencias SQL que se ejecutan deben ser estáticas. SQLJ requiere un paso de preprocesamiento. Muchos IDEs no proporcionan soporte SQLJ. No hay soporte de SQLJ para la mayoría de frameworks de persistencia comunes 47

El proceso de trabajo con la base de datos es muy parecido al de JDBC: carga del driver conexión captura de excepciones cierre de la conexión Tan sólo varía un poco la recuperación de datos y la asignación de valores en sentencias preparadas. 48

Un fichero con extensión.sqlj es un fichero Java que tiene inmersas directivas SQLJ. El proceso para convertir un.sqlj en un.class es el siguiente: 49

ó SQLJ permite dos tipos de declaraciones: declaraciones puras y de variables Java. Las declaraciones puras permiten declarar un Iterator (para recorrer el resultado de un SELECT) o bien la Connection por defecto con la que se van a hacer las operaciones (por si hay más de una conexión simultánea). Ejemplo.: #sql public iterator EmpIter (int empno, int enmae, int sal); #sql public context miconnctxt; 50

Tras la directiva #sql se coloca la sentencia SQL a ejecutar entre llaves. Esta sentencia puede contener expresiones Java precedidas por dos puntos. Ejemplo: int hdeptno; #sql {UPDATE emp SET sal=sal*1.5 WHERE deptno = :hdeptno}; float hnuevosal; #sql {UPDATE emp SET sal=:(1.5*hnuevosal) WHERE deptno =5}; 51

También es posible ejecutar una función SQL y guardar el resultado ejecutando: int hsal; #sql hsal = {VALUES (funcion_sql(parámetros))}; Si nuestro programa realiza varias conexiones simultáneas, entonces hay que indicarle a las sentencias SQLJ cuál queremos utilizar. 52

Para realizar una conexión, es posible crear un fichero connect.properties que contiene la información de conexión. Ejemplo: sqlj.url=jdbc:oracle:thin:@localhost:1521:oracle sqlj.user=alumno sqlj.password=alumno Y la conexión se haría con: Oracle.connect(getClass(), connect.properties ); La conexión también puede hacerse de la forma: Oracle.connect( jdbc:oracle:thin:@localhost:1521:oracle, alumno, alumno ); 53

Lo primero que hay que hacer es almacenar las distintas conexiones en forma de objetos DefaultContext. Para ello utilizaremos getconnection() para conectarnos a la base de datos. Desde Java se puede indicar la conexión por defecto ejecutando: DefaultContext.setDefaultContext(contexto); En la propia directiva #sql se puede indicar el contexto de ejecución: #sql contexto {sentencia SQL}; 54

import java.sql.*; import oracle.sqlj.runtime.*; public class Primer { public static void main(string[] args) throws SQLException { if (args.length!= 2) System.out.println( Faltan argumentos."); else { Oracle.connect(Primer.class, "connect.properties"); #sql {INSERT INTO EMP(EMPNO,ENAME) VALUES (:(args[0]),:(args[1]))}; #sql {COMMIT}; Oracle.close(); }}} 55

Oracle.connect(SelectSimple.class, "connect.properties"); String ename; double sal; #sql {SELECT ename, sal INTO :ename, :sal FROM emp WHERE empno = :(args[0])}; System.out.println("Nombre: "+ename+". Salario: "+sal); Oracle.close(); 56

Cuando el SELECT devuelve cero o más de una fila, debe asignarse a un iterador. Existe una correspondencia unívoca entre cada tipo de iterador y cada tipo de tupla retornada por un SELECT. Un ejemplo de declaración de iterador sería: #sql iterator EmpIter(int empno,string ename,double sal); que será capaz de recorrer un ResultSet con tres campos de los tipos especificados, por ese orden. Un iterador se asocia a una consulta de la forma: EmpIter emprow = null; #sql emprow = {SELECT empno, ename, sal FROM emp}; produciéndose una correspondencia de campos por nombre. 57

Un iterador posee el método next() (con idéntico comportamiento a un ResultSet) y funciones con los nombres de los campos con los que se declaró. Ejemplo.: while (emprow.next()) { } System.out.print(empRow.empno()+ - ); System.out.print(empRow.ename()+ - ); System.out.println(empRow.sal()+ - ); El iterador debe cerrarse con close(): emprow.close(); 58

Oracle.connect(SelectCompuesto.class, "connect.properties"); #sql iterator EmpIter(int empno,string ename,double sal); EmpIter emprow = null; #sql emprow = {SELECT empno, ename, sal FROM emp}; while (emprow.next()){ } System.out.print(empRow.empno() + " - " ) ; System.out.print( emprow.ename () + " - " ) ; System.out.println(empRow.sal()+"-"); emprow.close(); Oracle.close(); 59

En SQLJ el auto commit está desactivado por defecto. Para activarlo es necesario obtener el contexto por defecto y, a partir de él, obtener un objeto Connection al que hacerle un setautocommit(true): cntxt.getconnection().setautocommit(true); Estando el auto commit a false, si se cierra el contexto sin hacer un COMMIT, entonces se hace un ROLLBACK de la última transacción. 60