Download Tema III. JDBC

Document related concepts
no text concepts found
Transcript
Tema 3
J2EE Java Database
Connectivity
Temas Selectos de Cómputo
Grupo 912
JDBC
• Java Database Connectivity es el servicio e interfases
de programación para manipular bases de datos
relacionales por medio del lenguaje de programación
Java.
• Para programar JDBC se necesita de clases
proveedoras que realizan la conexión y manipulación del
acceso a la base de datos.
• El manejador de JDBC es proporcionado por el
fabricante de bases de datos. Es común encontrar
manejadores (drivers) JDBC para Oracle, MS SQL
Server, Sybase, MySQL, Postgres, Informix, DB2.
• La interfase de programación de aplicaciones (API) está
definido en el paquete java.sql.
DriverManager – Realiza la gestión de
la conexión a la base de datos
Estructuras de
clases JDBC
<<package>>
java.sql
DriverManager
<<interface>>
Statement
<<interface>>
Connection
<<interface>>
<<interface>>
PreparedStatement
ResultSet
<<interface>>
SQLException
CallableStatement
Se debe importar el paquete java.sql
Connection – Configura la conexión a la
base de datos; y permite crear
objetos/sentencias SQL que son
ejecutadas en el RDMBS
Statement – Dada una sentencia SQL
en forma de cadenas de caracteres,
permite ejecutar consultas, inserciones,
modificaciones, borrado; o instrucciones
propia del RDBMS
PreparedStatement – Permite manipular
sentencias SQL por medio de
parámetros y permite precompilar las
instrucciones que se envían al
manejador
CallableStatement – Permite invocar a
procedimientos almacenados
ResultSet – Objeto que permite
manipular en memoriar el resultado de
una consulta, recorriendo renglones y
sus columnas
SQLException – Excepción disparada
ante cualquier error del RDBMS
Cargar al JDBC Driver
• Cargar el Driver JDBC, cargando dinámicamente la
clase que lo implementa
//para conexión a HSQLDB
Class.forName("org.hsqldb.jdbcDriver“);
//para conexión a MySQL
Class.forName(“com.mysql.jdbc.Driver“);
//para conexión a Oracle
Class.forName(“ oracle.jdbc.OracleDriver “);
//para conexión a PostgreSQL
Class.forName(“ org.postgresql.Driver”);
//para conexión con ODBC
Class.forName(“ sun.jdbc.odb.JdbcOdbcDriver”);
• Cada driver es distinto, por base de datos
• El Driver JDBC debe estar en la ruta de clases
(CLASSPATH) Java
Conectarse a la Base de datos
• Por medio del método estático getConnection() de la
clase DriverManager, se realiza la conexión a la base de
datos.
• Se debe proporcionar el URL de conexión a la base de
datos.
//Conexion a HSQLDB
Connection c=DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost/bookstore“,”sa”,””);
//Conexión a MySQL
Connection c=DriverManager.getConnection(“jdbc:mysql://localhost/bookstore“,”jim”,”s3cr3t”);
//Conexión a PostgresSQL
Connection c=DriverManager.getConnection(“jdbc:postgresql://localhost/mydatabase”,”myuser”,”secret”);
//Conexión a Oracle
Connection c=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:mydb“,”scott”,”tiger”);
• Adicional, debe proporcionarse el usuario y password.
• Toda conexión, debe cerrarse al concluir el
procesamiento, por medio del método close()
c.close();
Realizar un consulta SQL
• Se utiliza la clase Statement; y los objetos de
este tipo se obtienen por medio de
createStatement
final String query= "SELECT * FROM AUTHORS";
Statement stmt=this.conexion.createStatement();
ResultSet result=stmt.executeQuery(query);
• Se puede utilizar la clase PreparedStatement; y
los objetos de este tipo se obtienen por medio
de prepareStatement
final String query="SELECT * FROM TITLES WHERE ISBN=?";
PreparedStatement pstmt=this.conexion.prepareStatement(query);
pstmt.setString(1,isbn);
ResultSet result=pstmt.executeQuery();
Procesar los resultados de una
consulta SQL
•
•
•
•
•
•
Tanto Statement y PreparedStatement, al realizar consultas SQL, retornan un objeto de tipo
ResultSet
ResultSet contiene de 0 a más renglones que el resultado de la consulta
Cada renglón contiene una o mas columnas
Se puede recorrer al objeto ResultSet, por medio del método next(), que retorna false cuando no
hay mas renglones.
El resultado se puede almancenar en un arreglo, o en estructuras de datos List, Map o Set.
Por ejemplo, el siguiente código guarda cada columna de un renglon en una estructura Map, y
dicho Map se agrega a una estructrua List
while (result.next()){
Integer id= new Integer(result.getInt(cols[0]));
String firstname= result.getString(cols[1]);
String lastname= result.getString(cols[2]);
HashMap data= new HashMap();
data.put(cols[0],id);
data.put(cols[1],firstname);
data.put(cols[2],lastname);
list.add(data);
}
•
Al concluir el procesamiento, se debe cerrar al objeto ResultSet; y al objeto Statement o
PreparedStatement
result.close();
stmt.close();
Inserción, Modificación y Borrado
•
•
•
Para insertar, modificar o borrar se debe utilizar el método executeUpdate.
En el caso de PreparedStatement, se puede hacer asi:
Inserción
final String query="INSERT INTO AUTHORS(AUTHORID,FIRSTNAME,LASTNAME) VALUES(?,?,?)";
PreparedStatement pstmt=this.conexion.prepareStatement(query);
pstmt.setInt(1,id);
pstmt.setString(2,firstName);
pstmt.setString(3,lastName);
int inserted= pstmt.executeUpdate();
•
Modificación
final String query="UPDATE AUTHORS SET FIRSTNAME= ?,LASTNAME=? WHERE AUTHORID=?";
PreparedStatement pstmt=this.conexion.prepareStatement(query);
pstmt.setString(1,firstName);
pstmt.setString(2,lastName);
pstmt.setInt(3,id);
int updated= pstmt.executeUpdate();
•
Borrado
final String query="DELETE FROM AUTHORS WHERE AUTHORID=?";
PreparedStatement pstmt=this.conexion.prepareStatement(query);
pstmt.setInt(1,id);
int deleted= pstmt.executeUpdate();
•
El método executeUpdate retorna el número de elementos modfiicados
Manejo de transacciones
• Una transacción es una unidad lógica de trabajo que debe ser
completada o abortada; y no acepta estados intermedios.
• Una transacción a la base de datos consistente en la combinación
de operaciones insert, update, delete; o cualquiera que altere a los
datos.
• Por omisión, cada operación realizada al RDBMS es aplicada como
una transacción.
• Se puede dermarcar un conjunto de transacciones, utilizando
JDBC. Se debe apagar la opción de autoCommit y al concluir las
operaciones, realizar un commit o rollback
connection.setAutoCommit(false);
//realizar múltiples operaciones insert, update, delete
if (exito) connection.commit();
else connection.rollback();