ESCUELA ACADÉMICA INGENIERÍA DE SISTEMAS Y TELEMÁTICA
ASIGNATURA
LABORATORIO DE PROGRAMACIÓN II
TEMA
JAVA CON BASE DE DATOS
AUTORES
AGUILAR CORDOVA JHAKELIN
RAMOS FERNÁNDEZ SONIA ELVIRA
DOCENTE
ING. MARCO AURELIO PORRO CHULLI
BAGUA GRANDE-UTCUBAMBA
AMAZONAS
2017
JAVA CON BASE
DATOS
1. CONTENIDO
1.1 DEFINICION
JDBC es
un API de Java para acceder a sistemas de bases de datos, y prácticamente a
cualquier tipo de dato tabular. El API JDBC consiste de un conjunto de clases e
interfaces que permiten a cualquier programa Java acceder a sistemas de bases
de datos de forma homogénea. Al igual que ODBC, la aplicación de Java debe
tener acceso a un controlador (driver) JDBC adecuado. Este controlador
es el que implementa la funcionalidad de todas las clases de acceso a datos y
proporciona la comunicación entre el API JDBC y la base de datos real. De
manera muy simple, al usar JDBC se pueden hacer tres cosas:
·
Establecer una conexión a una fuente de datos (ejemplo.
Una base de datos).
·
Mandar consultas y sentencias a la fuente de datos.
·
Procesar los resultados.
Al trabajar con JDBC resulta necesario agregar un jar al proyecto que contiene las clases necesarias que se utilizan para “dialogar” con un DBMS. Cada DBMS tiene su propio archivo jar. Estos archivos se pueden obtener de:
-http://developers.sun.com/product/jdbc/drivers
También es posible conseguir estos archivos jar en la página web correspondiente a cada DBMS, por ejemplo, en caso de usar DMBS Oracle es posible buscarlo en la página de Oracle: www.oracle.com. En nuestro caso vamos a usar el jar de mysql, el mysql connector y lo podemos descargar desde acá:
Dentro del zip que se descarga se encuentra el jar.
CARGAR EL
CONTROLADOR JDBC
Para
trabajar con el API JDBC se tiene que importar el paquete java.sql,
tal y como se indica a continuación:
Import java.sql.*;
En este
paquete se definen los objetos que proporcionan toda la funcionalidad que se
requiere para el acceso a bases de datos. El siguiente paso después de importar
el paquete java.sql consiste en cargar el controlador JDBC, es decir
un objeto Driver específico para una base de datos que define
cómo se ejecutan las instrucciones para esa base de datos en particular.
Hay varias formas de hacerlo, pero la más sencilla es utilizar el método forname() de la claseclass:
Hay varias formas de hacerlo, pero la más sencilla es utilizar el método forname() de la claseclass:
Class.forname("Controlador
JDBC");
Para el
caso particular del controlador para sqlserver, Connector/J, se tiene lo
siguiente:
Class.forname("com.mysql.jdbc.Driver
");
Debe
tenerse en cuenta que el método estático forname() definido por la clase Class
genera un objeto de la clase especificada. Cualquier controlador JDBC tiene que
incluir una parte de iniciación estática que se ejecuta cuando se carga la
clase. En cuanto el cargador de clases carga dicha clase, se ejecuta la
iniciación estática, que pasa a registrarse como un controlador JDBC en
el drivermanager.
Para la
base de datos csl creada anteriormente, el URL sería:
String url =
"jdbc:mysql://localhost/agendita";
Una vez
que se ha determinado el URL, se puede establecer una conexión a una base de
datos.
v OBJETOS CONNECTION
El
objeto Connection es el principal objeto utilizado para
proporcionar un vínculo entre las bases de datos y una aplicación en Java.
Connection proporciona métodos para manejar el procesamiento de transacciones,
para crear objetos y ejecutar instrucciones SQL, y para crear objetos para la
ejecución de procedimientos almacenados.
Se puede emplear tanto el objeto Driver como el objeto drivermanager para crear un objeto Connection. Se utiliza el método connect() para el objeto Driver, y el método getconnection()para el objeto drivermanager.
El objeto Connection proporciona una conexión estática a la base de datos. Esto significa que hasta que se llame en forma explícita a su método close() para cerrar la conexión o se destruya el objeto Connection, la conexión a la base de datos permanecerá activa.
La manera más usual de establecer una conexión a una base de datos es invocando el método getconnection() de la clase drivermanager. A menudo, las bases de datos están protegidas con nombres de usuario (login) y contraseñas (password) para restringir el acceso a las mismas. El método getconnection() permite que el nombre de usuario y la contraseña se pasen también como parámetros.
String
usuario = "root";
String
contraseña = "123456789";
Connection
conn = drivermanager.getconnection(url,usuario,contraseña);
En toda
aplicación de bases de datos con mysql es indispensable poder establecer la
conexión al servidor para posteriormente enviarle las consultas. Los programas
en Java no son la excepción. El siguiente código va a servir para verificar que
podemos establecer una conexión a la base de datos agendita.
CREACIÓN DE SENTENCIAS
El objeto
Connection permite establecer una conexión a una base de datos. Para ejecutar
instrucciones SQL y procesar los resultados de las mismas, se debe hacer uso de
un objetostatement.
v
OBJETOS STATEMENT
Los
objetos Statement envían comandos SQL a la base de datos, y pueden ser de
cualquiera de los tipos siguientes:
·
Un comando de definición de datos como CREATE TABLE
o CREATE INDEX.
·
Un comando de manipulación de datos como INSERT,
DELETE o UPDATE.
·
Un sentencia SELECT para consulta de datos.
Un
comando de manipulación de datos devuelve un contador con el número de filas
(registros) afectados, o modificados, mientras una instrucción SELECT devuelve
un conjunto de registros denominado conjunto de resultados (result set).
La interfaz Statement no tiene un constructor, sin embargo, podemos obtener un
objeto Statement al invocar el método createstatement() de un
objeto Connection.
Conn = drivermanager.getconnection(url,login,pasword);
Statement
stmt = conn.createstatement();
Una vez
creado el objeto Statement, se puede emplear para enviar consultas a la base de
datos usando los métodos execute(), executeupdate() o executequery(). La
elección del método depende del tipo de consulta que se va a enviar al servidor
de bases de datos:
Método
|
Descripción
|
Execute(
)
|
Se usa
principalmente cuando una sentencia SQL regresa varios conjuntos de
resultados. Esto ocurre principalmente cuando se está haciendo uso de
procedimientos almacenados.
|
Executeupdate(
)
|
Este
método se utiliza con instrucciones SQL de manipulación de datos tales como
INSERT, DELETE o UPDATE.
|
Executequery(
)
|
Se usa
en las instrucciones del tipo SELECT.
|
Es
recomendable que se cierren los objetos Connection y Statement que se hayan
creado cuando ya no se necesiten. Lo que sucede es que cuando en una aplicación
en Java se están usando recursos externos, como es el caso del acceso a bases
de datos con el API JDBC, el recolector de basura de Java (garbage collector)
no tiene manera de conocer cuál es el estado de esos recursos, y por lo tanto,
no es capaz de liberarlos en el caso de que ya no sean útiles. Lo que ocurre en
estos casos es que se pueden quedar almacenados en memoria grandes cantidades
de recursos relacionados con la aplicación de bases de datos que se está ejecutando.
Es por esto que se recomienda que se cierren de manera explícita los objetos
Connection y Statement.
De manera
similar a Connection, la interfaz Statement tiene un método close() que
permite cerrar de manera explícita un objeto Statement. Al cerrar un objeto
Statement se liberan los recursos que están en uso tanto en la aplicación Java
como en el servidor de bases de datos.
Statement
stmt = conn.createstatement();
....
Stmt.close();
EJECUCIÓN DE CONSULTAS
Cuando se
ejecutan sentencias SELECT usando el método executequery(), se obtiene como
respuesta un conjunto de resultados, que en Java es representado por un
objeto resultset.
Statement
stmt = conn.createstatement();
v
OBJETOS RESULTSET
Resultset
res = stmt.executequery("SELECT * FROM estudiante");
Se puede
pensar en un conjunto de resultados como una tabla ( filas y columnas ) en la
que están los datos obtenidos por una sentencia SELECT.
La
información del conjunto de resultados se puede obtener usando el método next() y
los diversos métodos getxxx() del objeto resultset. El método
next() permite moverse fila por fila a través del resultset, mientras que los
diversos métodos getxxx() permiten accesar a los datos de una fila en
particular.
Los métodos
getxxx() toman como argumento el gndice o nombre de una columna, y regresan un
valor con el tipo de datos especificado en el método. Así por ejemplo, getstring()
regresará una cadena, getboolean() regresará un booleano y getint() regresará
un entero. Cabe mencionar que estos métodos deben tener una correspondencia con
los tipos de datos que se tienen en el resultset, y que son a las vez los tipos
de datos provenientes de la consulta SELECT en la base de datos, sin embargo,
si únicamente se desean mostrar los datos se puede usar getstring() sin
importar el tipo de dato de la columna.
Por otra parte, si en estos métodos se utiliza la versión que toma el índice de la columna, se debe considerar que los índices empiezan a partir de 1, y no en 0 (cero) como en los arreglos, los vectores, y algunas otras estructuras de datos de Java.
Existe un objeto resultsetmetadata que proporciona varios métodos para obtener información sobre los datos que están dentro de un objeto resultset. Estos métodos permiten entre otras cosas obtener de manera dinámica el número de columnas en el conjunto de resultados, así como el nombre y el tipo de cada columna.
Por otra parte, si en estos métodos se utiliza la versión que toma el índice de la columna, se debe considerar que los índices empiezan a partir de 1, y no en 0 (cero) como en los arreglos, los vectores, y algunas otras estructuras de datos de Java.
Existe un objeto resultsetmetadata que proporciona varios métodos para obtener información sobre los datos que están dentro de un objeto resultset. Estos métodos permiten entre otras cosas obtener de manera dinámica el número de columnas en el conjunto de resultados, así como el nombre y el tipo de cada columna.
Resultset res = stmt.executequery("SELECT
* FROM estudiante");
Resultsetmetadata metadata
= res.getmetadata();
1.3 EJEMPLOS
CONNECTION
Import java.sql.*;
public class conexionbd
{
static String bd = "sesion";
static String login = "root";
static String password = "123456789";
static String url = "jdbc:mysql://localhost/"+bd;
public class conexionbd
{
static String bd = "sesion";
static String login = "root";
static String password = "123456789";
static String url = "jdbc:mysql://localhost/"+bd;
Public static void main(String[] args) throws Exception
{
Connection conn = null;
try
{
Class.forname("com.mysql.jdbc.Driver").newinstance
conn = drivermanager.getconnection(url,login,password);
if (conn != null)
{
System.out.println("Conexiónse de datos "+url+" ... Ok");
conn.close();
}
}
catch(sqlexception ex)
{
System.out.println(ex);
}
catch(classnotfoundexception ex)
{
System.out.println(ex);
}
}
}
STATEMENT Y RESULTSET
//
Define la conexión
Connection laconexion = administradordeconexiones.getconnection();
// Arma
la consulta y la ejecuta
String laconsulta = "SELECT *
FROM alumnos";
Statement stmtconsulta = laconexion.createstatement();
resultset rs = stmtconsulta.executequery(laconsulta);
//
Muestra los datos
while( rs.next() )
System.out.println( "ID: "
+ rs.getint("alu_id") + " -- " + "Nombre: " + rs.getstring("alu_nombre")
+ " -- " + "Apellido: " + rs.getstring("alu_apellido")
);
// Cierra el Statement y la Connection
stmtconsulta.close();
laconexion.close();
2.
RESUMEN
Java es un potente y
versátil lenguaje de programación que puede trabajar en todo tipo de entornos,
desde servidores de aplicaciones mi ddle-tier hasta clientes Web.
Independientemente del tipo de aplicación que usted desarrolle y del tipo de
máquina en la que se ejecute el código, su aplicación seguramente tendrá que
acceder a datos almacenados en algún tipo de base de datos. Las bases de datos
relacionales son la elección obvia en la mayor parte de las empresas, y han
evolucionado espectacularmente en los últimos años hasta convertirse en
potentes sistemas de gestión de bases de datos.
En este tema se pretende
mostrar cómo funcionan las bases de datos relacionales, y como emplear la
interfaz JDBC para utilizarlas en sus programas Java. Se recogen desde los fundamentos
básicos de SQL y dichas bases.
También veremos las
sentencias DML de SQL que se utiliza en JAVA, acompañado de algunos ejemplos
para su respectivo uso.
Adicionalmente
mostraremos cuales son las funciones de Objetos Connection, Statement y resulset,
donde se mostrarán algunos ejemplos de su uso.
3.
SUMMARY
Java is a powerful and versatile programming language that can work in all kinds
of environments, from my ddle-tier application servers to Web clients. Regardless
of the type of application you develop and the type of machine running the code,
your application will surely have to access data stored in some type of database.
Relational databases are the obvious choice in most companies, and have evolved
dramatically in recent years to become powerful database management systems.
This topic is intended to show how relational databases work, and how to use the
JDBC interface to use them in your Java programs. They are collected from the
basics of SQL and such databases.
We will also see the SQL DML statements that are used in JAVA, accompanied by
some examples for their respective use.
Additionally we will show what are the functions of Objects Connection, Statement
and resulset, which will show some examples of its use.
4.
RECOMENDACIONES
* Evitar consultas
SQL SELECT *
SELECT * FROM... Es una forma muy
habitual de establecer una consulta en SQL. Sin embargo, muchas veces no es
necesario consultar todos los campos. Para cada columna que hay que devolver,
el controlador JDBC tiene que hacer el trabajo adicional de enlazar y devolver
la fila. Aún en el caso de que la aplicación no llegue a utilizar nunca una
columna concreta, el controlador JDBC debe tenerla presente y reservar espacio
por si se utiliza. Esta cuestión no supone una actividad general significativa
si son pocas las columnas que no se utilizan de las tablas. Sin embargo, si son
numerosas las columnas no utilizadas, la actividad general puede llegar a ser
significativa. En tal caso, sería mejor listar individualmente las columnas que
a la aplicación le interesa consultar, como en este ejemplo:
SELECT COL1, COL2, COL3 FROM...
* Utilizar getxxx(int)
en vez de getxxx(String)
Utilice los métodos getxxx de resultset
que toman valores numéricos, en vez de las versiones que toman nombres de
columna. Si bien la libertad que supone utilizar nombres de columna en vez de
constantes numéricas parece ser una ventaja, la base de datos propiamente dicha
solo sabe manejar los índices de las columnas. Por ello, cada vez que se llama
a un método getxxx utilizando el nombre de una columna, el controlador JDBC lo
debe resolver para que el método se pueda pasar a la base de datos.
Normalmente, a los métodos getxxx se les suele llamar dentro de bucles que se
pueden ejecutar millones de veces, y ello provocaría rápidamente la acumulación
de la pequeña actividad general que supone la resolución de cada uno de los
nombres de columna.
* Evitar llamadas a getobject
para tipos Java primitivos
Cuando de la base de datos se obtienen
valores de tipos primitivos (int, long, float, etc.), es más rápido utilizar el
método get específico del tipo primitivo (getint, getlong, getfloat) que
utilizar el método getobject. La llamada a getobject realiza el trabajo de
obtener el tipo primitivo y luego crea un objeto para devolverlo. Normalmente,
esto se hace en los bucles, lo que supone crear millones de objetos de corta
vida. Si se emplea getobject para los mandatos de primitivos, existe el
inconveniente adicional de que se activa con frecuencia el colector de basura,
lo que aún reduce más el rendimiento.
* Cerrar
explícitamente los recursos JDBC cuando ya no se necesitan
La aplicación debe cerrar
explícitamente los objetos resultset, Statement y Connection cuando ya no se
necesitan. Así se hace una limpieza de recursos del modo más eficaz posible, y
el rendimiento puede aumentar. Además, los recursos de base de datos que no se
cierran de manera explícita pueden provocar fugas de recursos, y los bloqueos
de base de datos se pueden prolongar más de lo debido. Ello puede producir
anomalías de aplicación o reducir la concurrencia en las aplicaciones.
5.
CONCLUSIONES
Establecer una conexión a
una fuente de datos (ej. Una base de datos).
Mandar
consultas y sentencias a la fuente de datos.
Procesar
los resultados.
Al
trabajar con JDBC resulta necesario agregar un jar al proyecto que contiene las clases necesarias que se utilizan para “dialogar” con un DBMS. Cada DBMS tiene
su propio archivo jar. Estos archivos se pueden obtener de:
También es posible conseguir estos archivos jar en la página web
correspondiente a cada DBMS, por ejemplo, en caso de usar DMBS Oracle es
posible buscarlo en la página de Oracle: www.oracle.com. En nuestro caso vamos a usar el jar de mysql, el mysql
connector y lo podemos descargar desde acá:
6.
GLOSARIO DE TÉRMINOS
API: Una API es
un conjunto de funciones y procedimientos que cumplen una o muchas funciones
con el fin de ser utilizadas por otro software. Las siglas API vienen del inglés Application
Programming Interface. En español sería Interfaz de Programación de
Aplicaciones.
ODBC: Open
database Connectivity (ODBC) es
un estándar de acceso a las bases de datos desarrollado por SQL Access Group
(SAG) en 1992. El objetivo de odbces
hacer posible el acceder a cualquier dato desde cualquier aplicación, sin
importar qué sistema de gestión de bases de datos (DBMS) almacene los datos.
DRIVER: Controlador,
rutina o programa que enlaza un dispositivo periférico al sistema operativo.
JAR: Un
archivo JAR (por sus siglas en inglés, Java archive) es un
tipo de archivo que permite ejecutar aplicaciones escritas en el lenguaje Java.
Las siglas están deliberadamente escogidas para que coincidan con la palabra
inglesa "jar" (tarro).
DRIVERMANAGER: drivermanager es
una clase estática en Java 2 Software Development Kit (J2SDK).drivermanager gestiona el
conjunto de controladores Java Database Connectivity (JDBC) que están
disponibles para que los utilice una aplicación.
GETCONNECTION: Para
crear una conexión a una base de datos o un servidor de bases de datos IBM®
Informix, puede utilizar el método drivermanager.getconnection(). Este método crea un objeto Connection, que se
utiliza para crear sentencias SQL, enviarlas a la base de datos Informix y
procesar los resultados.
SELECT: Para realizar consultas sobre las tablas de las bases
de datos disponemos de la instrucción SELECT. Con ella podemos consultar una o varias tablas. Es sin
duda el comando más versátil del lenguaje SQL. Existen muchas cláusulas
asociadas a la sentenciaselect (GROUP
BY, ORDER, HAVING, UNION).
INTERFAZ: Dispositivo capaz de transformar las señales generadas
por un aparato en señales comprensibles por otro.
GETINT: El método getint especifica
este método getint en
la interfaz java.sql.callablestatement. Este método solamente se admite en los
tipos de datos SQL Server que pueden devolver de forma segura un valor entero
como int, smallint, tinyint y bit.
7.
BIBLIOGRAFÍA
Link de las diapositivas: