UNIVERSIDAD POLITÉCNICA AMAZÓNICA
INGENIERÍA DE SISTEMAS Y TELEMATICA
JAVA
CON BASE DE DATOS
|
DOCENTE : Marco Aurelio Porro Chulli.
ASIGNATURA : Desarrollo de Software I.
GRUPO : “A”
INTEGRANTES :
Yanina
Bustamante Jibaja.
Yenny
Isabel Cuello Morón.
|
JAVA CON BASE DE DATOS
Definición de base de datos
Una base de datos es una colección de
información organizada de forma que un programa de ordenador pueda seleccionar
rápidamente los fragmentos de datos que necesite. Una base de datos es un
sistema de archivos electrónico.
Las bases de datos
tradicionales se organizan por campos, registros y archivos. Un campo es una pieza única de
información; un registro es
un sistema completo de campos; y un archivo es
una colección de registros. Por ejemplo, una guía de teléfono es análoga a un
archivo. Contiene una lista de registros, cada uno de los cuales consiste en
tres campos: nombre, dirección, y número de teléfono.
Las bases de datos son
el método preferido para el almacenamiento estructurado de
datos. Desde las grandes aplicaciones multiusuario, hasta los
teléfonos móviles y las agendas electrónicas utilizan
tecnología de bases de datos para asegurar la integridad de los
datos y facilitar la labor tanto de usuarios como de los programadores que
las desarrollaron. Desde la realización del primer modelo de datos, pasando por
la administración del sistema gestor, hasta llegar al desarrollo de la
aplicación, los conceptos y la tecnología asociados son muchos y muy
heterogéneos.
Importancia de la base de datos
-Facilita el almacenamiento de grandes
cantidades de información.
-La recuperación rápida y flexible de
información.
-La organización y reorganización de la
información.
- la impresión y distribución de
información en varias formas.
Objetivos de los sistemas de bases de
datos.
Los objetivos principales de un sistema
de base de datos es disminuir los siguientes aspectos:
Redundancia e inconsistencia de datos.
Puesto
que los archivos que mantienen almacenada la información son creados por
diferentes tipos de programas de aplicación existe la posibilidad de que, si no
se controla detalladamente el almacenamiento, se pueda originar un duplicado de
información, es decir que la misma información sea más de una vez en un
dispositivo de almacenamiento. Esto aumenta los costos de almacenamiento y
acceso a los datos, además de que puede originar la inconsistencia de los datos
- es decir diversas copias de un mismo dato no concuerdan entre si -, por
ejemplo: que se actualiza la dirección de un cliente en un archivo y que en
otros archivos permanezca la anterior.
Dificultad para tener acceso a los
datos.
Un
sistema de base de datos debe contemplar un entorno de datos que le facilite al
usuario el manejo de los mismos. Supóngase un banco, y que uno de los gerentes
necesita averiguar los nombres de todos los clientes que viven dentro del
código postal 78733 de la ciudad. El gerente pide al departamento de
procesamiento de datos que genere la lista correspondiente. Puesto que esta
situación no fue prevista en el diseño del sistema, no existe ninguna
aplicación de consulta que permita este tipo de solicitud, esto ocasiona una
deficiencia del sistema.
Aislamiento
de los datos.
Puesto
que los datos están repartidos en varios archivos, y estos no pueden tener
diferentes formatos, es difícil escribir nuevos programas de aplicación para
obtener los datos apropiados.
Anomalías
del acceso concurrente.
Para
mejorar el funcionamiento global del sistema y obtener un tiempo de respuesta
más rápido, muchos sistemas permiten que múltiples usuarios actualicen los
datos simultáneamente. En un entorno así la interacción de actualizaciones
concurrentes puede dar por resultado datos inconsistentes. Para prevenir esta
posibilidad debe mantenerse alguna forma de supervisión en el sistema.
Problemas de seguridad.
La
información de toda empresa es importante, aunque unos datos lo son más que
otros, por tal motivo se debe considerar el control de acceso a los mismos, no
todos los usuarios pueden visualizar alguna información, por tal motivo para
que un sistema de base de datos sea confiable debe mantener un grado de
seguridad que garantice la autentificación y protección de los datos.
En
un banco, por ejemplo, el personal de nóminas sólo necesita ver la parte de la
base de datos que tiene información acerca de los distintos empleados del banco
y no a otro tipo de información.
Problemas de integridad.
Los
valores de datos almacenados en la base de datos deben satisfacer cierto tipo
de restricciones de consistencia. Estas restricciones se hacen cumplir en el
sistema añadiendo códigos apropiados en los diversos programas de aplicación.
Aplicaciones
de la base de datos:
1. Banca: información de clientes, cuentas,
transacciones, préstamos, etc.
2. Líneas aéreas: inf. Clientes, horarios, vuelos,
destinos, etc. (1ras bases distribuidas geográficamente)
3. Universidades: inf. Estudiantes, carreras, horarios,
materias, etc.
4. Transacciones de tarjeta de crédito: para comprar con tarjetas de crédito y
la generación de los extractos mensuales.
5. Telecomunicaciones: para guardar registros de llamadas
realizadas, generar facturas mensuales, mantener el saldo de las tarjetas,
telefónicas de prepago y almacenar información sobre las redes.
LA CLASE CONNECTION
La
clase connection proporciona un interfaz eficiente para el acceso a datos y
metadatos de una base de datos. Conocer los recursos de gambas para acceso a
base de datos es fundamental a la hora de obtener un código transparente al
motor de base de datos que utilice la aplicación.
El
objetivo de este tema es mostrar la forma de realizar accesos a base de datos
de forma transparente al motor de búsqueda que estemos utilizando. De esta
forma si por alguna razón decidimos cambiar nuestra aplicación de sqlite mysql
o viceversa el código seguirá funcionando correctamente con solo cambiar el
usuario y tipo de conexión que usemos.
Crear
conexión
Las
propiedades fundamentales para crear una conexión son:
Name
Es
el nombre de la base de datos que queremos abrir. Si no se especifica se creará
una base de datos EN MEMORIA.
En
Mysql si deseamos crear usuarios, cambiar privilegios, que afecten al gestor de
base de datos deberemos acceder a la base de datos "mysql".
Host
Es
la ubicación del servidor de base de datos. En muchas ocasiones será
"localhost", pero puede ser también un nombre o una dirección IP.
Si
NAME es una ruta temporal y localhost es nulo se creará la base de datos en la
ubicación temporal proporcionada por TEMP () y que habitualmente es /tmp.
Login
y Password
Usuario
y clave que definan al usuario que intenta crear la base.
Type
Indica
el tipo de base de datos al que queremos acceder (mysql, sqlite, ..., etc).
Port
El
puerto por el que accederemos a la base de datos. En el caso de mysql el puerto
por defecto es 3306.
import
java.sql.*;
public
class TestConnection
{
static String login = "antares";
static String password = "";
static String url =
"jdbc:mysql://aragorn/arg_musiteca";
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ón a
base de datos "+url+" ... Ok");
conn.close();
}
}
catch(SQLException ex)
{
System.out.println(ex);
}
catch(ClassNotFoundException ex)
{
System.out.println(ex);
}
}
}
LA CLASE STATEMENT
Un
objeto Statement se usa para enviar sentencias SQL a la base de datos.
Actualmente hay tres tipos de objetos Statement, todos los cuales actúan como
contenedores para la ejecución de sentencias en una conexión dada: Statement,
PreparedStatement que hereda de Statement y CallableStatement que hereda de PreparedStatement.
Estas están especializadas para enviar tipos particulares de sentencias SQL, Un
objeto Statement se usa para ejecutar una sentencia SQL simple sin parámetros.
Un objeto PreparedStatement se usa para ejecutar sentencias SQL pre compiladas con
o sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un procedimiento
de base de datos almacenado.
La
interface Statement suministra métodos básicos para ejecutar sentencias y
devolver resultados. La interface PreparedStatement añade métodos para trabajar
con los parámetros IN; y la interface CallableStatement añade métodos para
trabajar con parameters OUT.
Creación
de objetos Statement
Una
vez establecida la conexión con una base de datos particular, esta conexión
puede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante
el método de Connection createStatement, como podemos ver en el siguiente
fragmento de código.
Connection
con = DriverManager.getConnection(url, "sunny", "");
Statement
stmt = con. CreateStatement ();
La
sentencia SQL que será enviada a la base de datos es alimentada como un
argumento a uno de los métodos de ejecución del objeto Statement. Por ejemplo:
ResultSet
rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
Ejecución de sentencias usando objetos
Statement.
La
interface Statement nos suministra tres métodos diferentes para ejecutar
sentencias SQL, executeQuery, executeUpdate y execute. El método a usar está
determinado por el producto de la sentencia SQL
El
método executeQuery está diseñado para sentencias que producen como resultado
un único result set tal como las sentencias SELECT.
El
método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó DELETE,
así como sentencias SQL DDL (Data Definition Language) como CREATE TABLE o DROP
TABLE. El efecto de una sentencia INSERT, UPDATE o DELETE es una modificación
de una o más columnas en cero o más filas de una tabla. El valor devuelto de
executeUpdate es un entero que indica el número de filas que han sido afectadas
(referido como update count). Para sentencias tales como CREATE TABLE o DROP
TABLE, que no operan sobre filas, le valor devuelto por executeUpdate es
siempre cero.
El
método execute se usa para ejecutar sentencias que devuelven más de un result
set, más que un update count o una combinación de ambos. Como es esta una
característica avanzada que muchos programadores no necesitan nunca se verá en
su propia sección.
Todos
los métodos que ejecutan sentencias cierran los objetos Resultset abiertos como
resultado de las llamadas a Statement. Esto quiere decir que es necesario
completar el proceso con el actual objeto Resulset antes de reejecutar una
sentencia Statement.
Debe
notarse que la interface PreparedStatement, que hereda los métodos de la interface
Statement, tiene sus propias versiones de los métodos executeQuery,
executeUpdate y execute. Los objetos Statement en sí mismos no contienen una
sentencia SQL, por tanto, debe suministrarse como un argumento a los métodos Statement.
Execute. Los objetos PreparedStatement no suministran una sentencia SQL como
argumento a estos métodos puesto que ya tienen la sentencia precompilada. Los
objetos CallableStatement heredan las formas de estos métodos de
PreparedStatement. Usar un parámetro de query con las versiones de los métodos
de PreparedStatement o CallableStatement producirá una SQLException.
Realización de Statement
Cuando
una conexión está en modo auto-commit, las sentencias ejecutadas son
‘comitadas’ o rechazadas cuando se completan. Una sentencia se considera
completa cuando ha sido ejecutada y se han devuelto todos los resultados. Pare
el método executeQuery, que devuelve un único result set, la sentencia se
completa cuando todas las filas del objeto ResultSet se han devuelto. Para el
método executeUpdate, una sentencia se completa cuando se ejecuta. En los raros
casos en que se llama al método execute, de cualquier modo, no se completa
hasta que los result sets o update counts que se generan han sido devueltos.
Algunos
DBMS tratan cada sentencia en un procedimiento almacenado como sentencias
separadas. Otros tratan el procedimiento entero como una sentencia compuesta.
Esta diferencia se convierte en importante cuando está activo el modo
auto-commit porque afecta cuando se llama al método commit. En el primer caso,
cada sentencia individual es commitada. En el segundo, se commiten todas
juntas.
Cerrar objetos Statement.
Los
objetos Statement se cerrarán automáticamente por el colector de basura de Java
(garbage collector). No obstante, se recomienda como una buena práctica de
programación que se cierren explícitamente cuando no sean ya necesarios. Esto
libera recursos DBMS inmediatamente y ayuda a evitar potenciales problemas de
memoria.
Sintaxis
de Escape SQL en objetos Statement
Los
objetos Statement pueden contener sentencias SQL que usen sintaxis de escape
SQL. La sintaxis de escape señala al driver que el código que lleva debe ser
tratado diferentemente. El driver buscará por cualquier sintaxis de escape y lo
traducirá en código que entiende la base de datos en particular. Esto hace que
la sintaxis de escape sea independiente de la DBMS y permite al programador
usar características que de otro modo no estarían disponibles.
Una
cláusula de escape se enmarca entre llaves y tiene una palabra clave:
{keyword
. . . parameters . . . }
La
palabra clave (keyword) indica el tipo de cláusula de escape, según se muestra:
•
escape para caracteres LIKE
Los
caracteres “%” y “_” trabajan como wildcards en la cláusula SQL LIKE (“%”
significa cero o más caracteres y “_” significa exactamente un carácter”. En
orden a interpretarlos literalmente, pueden estar precedidos por un backslash
(‘\’), que es un carácter de escape especial en cadenas. Se puede especificar
un carácter que se use como carácter de escape por la inclusión de la sintaxis
siguiente al final de la consulta.
{escape
'escape-character'}
Por
ejemplo, la siguiente query, usando backslash como caracter de escape,
encuentra nombres de identificador que comiencen con ‘_’.
stmt.executeQuery("SELECT
name FROM Identifiers
WHERE
Id LIKE `\_%' {escape `\'};
•
fn para funciones escalares
Casi
todas las DBMS tienen funciones numéricas, de cadena, de fecha y conversión
sobre valores escalares. Una de estas funciones puede usarse colocándola en la
sintaxis de escape con la clave fn seguida del nombre de la función deseada y
sus argumentos. Por ejemplo, para llamar a la función concat con dos argumentos
que serán concatenados:
{fn
concat("Hot", "Java")};
El
nombre del usuario actual de la base de datos puede obtenerse mediante:
{fn
user()};
Las
funciones escalares pueden estar soportadas por diferentes DBMS con ligeras
diferencias de sintaxis, y pueden no estar disponibles en todos los drivers.
Varios métodos de DatabaseMetaData nos listarán las funciones que están
soportadas. Por ejemplo, el método getNumericFunctions devuelve una lista de
los nombres de las funciones numéricas separadas por comas, el método
getStringFunction nos devuelve los nombres de las funciones de cadena, y así
varías más.
EL
driver o bien mapeará la llamada a la función ‘escapada’ en su propia sintaxis
o implementará la función el mismo.
•
d, t y ts para literales de fecha y tiempo
Las
DBMS difieren en la sintaxis que usan para los literales de fecha, tiempo y
timestamp. JDBC soporta un formato estándar ISO para estos literales y usa una cláusula
de escape que el driver debe traducir a la representación del DBMS.
Por
ejemplo, una fecha se especifica en SQL JDBC mediante la sintaxis:
{d
`yyyy-mm-dd'}
En
esta sintaxis, yyyy es el año, mm es el mes y dd es el día. El driver
reemplazará la cláusula de escape por la representación propia equivalente de
la DBMS. Por ejemplo, el driver reemplazaría {d 1999-02-28} por ’28-FEB-99’ si
este es el formato apropiado para la base subyacente.
Hay
cláusulas de escape análogas para TIME y TIMESTAMP
{t
`hh:mm:ss'}
{ts
`yyyy-mm-dd hh:mm:ss.f . . .'}
La
parte fraccional de los segundos (.f . . .) del TIMESTAMP puede omitirse.
•
call ó ? = call para procedimientos almacenados
Si
una database soporta procedimientos almacenados, estos pueden ser invocados
desde JDBC mediante:
{call
procedure_name[(?, ?, . . .)]}
o,
cuando el procedimiento devuelve como resultado un parámetro
{?
= call procedure_name[(?, ?, . . .)]}
Los
corchetes indican que el material encerrado en ellos es opcional. Estos no
forman parte de la sintaxis.
Los
argumentos de entrada pueden ser bien literales, bien parámetros. Ver la
sección 7 “CallableStatement” de esta guía.
Se
puede llamar al método DatabaseMetaData.supportsStoredProcedures para ver si la
base de datos soporta procedimientos almacenados.
•
oj para joins de salida
La
sintaxis para un outer join es:
{oj
outer-join}
donde
outer-join es de la forma:
table
LEFT OUTER JOIN {table | outer-join} ON search-condition
Las
Outer joins son una característica avanzada, y solo puede chequearse la
gramática SQL mediante una explicación de ella. JDBC provee tres métodos de
DatabaseMetaData para determinar qué tipos de outer joins soporta un driver:
supportsOuterJoins, supportsFullOuterJoins, y supportsLimitedOuterJoins.
El
método Statement.setEscapeProcessing activa o desactiva el procesamiento de
escape. Por defecto la característica se encuentra activada. Un programador
debería desactivar esta característica en tiempo de ejecución cuando el
rendimiento ha de ser máximo, pero normalmente debe estar activado. Debería
notarse que setEscapeProcesing no trabaja con objetos PreparedStatement por que
la sentencia ya está preparada para enviar a la base de datos antes de poder
ser llamada.
Uso del método execute
El
método execute debería usarse solamente cuando es posible que una sentencia nos
devuelva más de un objeto Resultset., más de un update count o una combinación
de ambos. Estas múltiples posibilidades para resultados, aunque raras, son
posibles cuando se ejecutan ciertos procedimientos almacenados o por la
ejecución dinámica de una string SQL desconocida (esto es, desconocida para el
programador de la aplicación en tiempo de compilación). Por ejemplo, un usuario
podría ejecutar un procedimiento almacenado (usando un objeto CallableStatement
y este procedimiento podría ejecutar una actualización, después una select,
luego una actualización, después un select y así. Normalmente, alguien que usa un
procedimiento almacenado sabrá que se le va a devolver.
Porque
el método execute maneja los casos que se salen de lo ordinario, no sorprende
que los resultados devueltos requieren algún manejo especial. Por ejemplo,
supongamos que se sabe que el procedimiento devuelve dos result sets.
Después
de usar el método execute para ejecutar el procedimiento, se debe llamar al
método getResultSet para conseguir el primer result set y después los métodos
apropiados getXXX para recuperar los valores de él. Para conseguir el segundo
result set, se necesita llamar al método getMoreResults y después a
getResultSet de nuevo. Si se sabe que el procedimiento devuelve dos upadte
counts, se llama primero al método getUpdateCount, seguido de getMoreResults y
de nuevo getUpdateCount.
Aquellos
casos en los que no se conoce que devolverá se nos presenta una situación más
compleja. El método execute devuelve true si el resultado es un objeto
ResultSet y false si es un int Java. Si devuelve un int, esto quiere decir que
el resultado o bien es un update count o que la sentencia que ha ejecutado es
un comando DDL. Lo primero que hay que hacer después de llamar execute es llamar
o bien a getResultSet o getUpdateCount. Al método getResultSet se le llama para
conseguir el primero de los dos o más objetos ResultSet y al método
getUpdateCount para conseguir el primero de dos o más update counts.
Cuando
el resultado de una sentencia SQL no es un result set, el método getResultSet
devolverá null. Esto quiere decir que el resultado es un update count o que no
hay más resultados. La única manera de encontrar que significa el valor null en
este caso es llamar al método getUpdateCount, que devolverá un entero. Este
entero será el número de filas afectadas por la sentencia ejecutada o –1 para indicar
o bien que el resultado es un result set o bien que no hay más resultados. Si
el método getResultSet ya ha devuelto null, el resultado no puede ser un objeto
ResultSet, por lo que el valor devuelto de –1 tiene que ser que no hay más
resultados. En otras palabras, no hay más resultados cuando lo siguiente es
cierto:
((stmt.getResultSet()
== null) && (stmt.getUpdateCount() == -1))
Si
se ha llamado al método getResultSet y se ha procesado el objeto ResultSet
devuelto, es necesario llamar al método getMoreResults para ver si hay más
result sets o update counts. Si getMoreResults devuelve true, entonces es
necesario llamar de nuevo a getResultSet para recuperar el siguiente result
set. Como ya se ha indicado anteriormente, si getResultset devuelve null hay
que llamar a GetUpdateCount para buscar que significa ese null si un update
count o que no hay más resultados.
Cuando
getMoreResults devuelve false quiere decir que la sentencia SQL ha devuelto un
update count o que no hay más resultados. Por tanto, es necesario llamar al
método getUpdateCount para encontrar cual es el caso. En esta situación, no
habrá más resultados cuando lo siguiente es cierto:
((stmt.getMoreResults()
== false) && (stmt.getUpdateCount() == -1))
El
siguiente código muestra una forma de asegurarse que se ha accedido a todos los
result sets y update counts de una llamada al método execute:
stmt.execute(queryStringWithUnknownResults);
while
(true) {
int
rowCount = stmt.getUpdateCount();
if
(rowCount > 0) { // this is an update count
System.out.println("Rows
changed = " + count);
stmt.getMoreResults();
continue;
}
if
(rowCount == 0) { // DDL command or 0 updates
System.out.println("
No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}
//
if we have gotten this far, we have either a result set
//
or no more results
ResultSet
rs = stmt.getResultSet;
if
(rs != null) {
.
. . // use metadata to get info about result set columns
while
(rs.next()) {
.
. . // process results
stmt.getMoreResults();
continue;
break;
// there are no more results
CLASE RESULTSET
Un
ResultSet es una clase Java que accede al resultado de una consulta a una Base
de Datos. El ResultSet no almacena todos los datos de la consulta, los va
leyendo a medida que se solicitan.
Podemos
obtener los datos de la tabla haciendo llamadas a los métodos get(int
numeroColumna) o get(String nombreColumna). Por ejemplo, si queremos que nos
devuelva el campo last_name e imprimirlo por pantalla haríamos
algo como:
1
|
System.out.println(resultSet.getString(3));
|
1
|
System.out.println(resultSet.getString(("last_name"));
|
1
|
Date date =
resultSet.getDate("last_update");
|
1
2
3
4
5
|
while (resultSet.next())
{
System.out.print("name:
" + resultSet.getString(2) );
System.out.println("
last name: " + resultSet.getString(3));
}
|
import java.util.Hashtable;
private String user;
private String password;
private String db;
private String host;
private String url;
private Connection conn = null;
private Statement stm;
private ResultSet rs;
{
this.url = “jdbc:mysql://” + this.host + “/” + this.db;
}
{
this.user = usuario;
this.password = contraseña;
this.db = bd;
this.host = server;
this.url = “jdbc:mysql://” + this.host + “/” + this.db;
}
{
try {
Class.forName(“org.gjt.mm.mysql.Driver”);
conn = DriverManager.getConnection(url, user, password);
if (conn != null)
{
System.out.println(“Conexión a base de datos “+url+” … Ok”);
stm = conn.createStatement();
}
}
catch(SQLException ex) {
System.out.println(“Hubo un problema al intentar conectarse con la base de datos “+url);
}
catch(ClassNotFoundException ex) {
System.out.println(ex);
}
}
return db;
}
this.db = db;
}
return host;
}
this.host = host;
}
return password;
}
this.password = password;
}
return user;
}
this.user = user;
}
{
rs = stm.executeQuery(“SELECT * FROM ” + tabla);
return rs;
}
{
String name = null;
try{
rs = stm.executeQuery(“SELECT * FROM ” + tabla + ” WHERE nombre = ‘”+ nombre +”‘ LIMIT 1″);
rs.next();
name = rs.getString(2);
}catch(SQLException ex){System.out.println(ex);}
return name;
}
{
try {
stm.execute(“INSERT INTO usuarios (nombre, contraseña) VALUES (‘” +usuario.get(“nombre”) + “‘,'” + usuario.get(“contraseña”) + “‘)”);
} catch (SQLException ex) {
System.out.println(ex);
}
}
{
try {
stm.execute(“UPDATE ” + tabla + ” SET nombre='” + usuario.get(“nombre”) + “‘ WHERE nombre='” + nombre + “‘”);
} catch (SQLException ex) {
System.out.println(ex);
}
}
{
try {
stm.execute(“DELETE FROM ” + tabla + ” WHERE nombre='” + nombre + “‘”);
} catch (SQLException ex) {
System.out.println(ex);
}
}
}
con.connectar();
ResultSet rs;
rs = con.consultar(“usuarios”);
while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}
usuario.put(“nombre”, “frago”);
usuario.put(“contraseña”, “xxx”);
con.insertar(usuario);
usuario.put(“nombre”, “frago1”);
con.actualizar(tabla, usuario, “frago”);
- Base de datos nos proporciona una Independencia de los datos y los programas y procesos ya que permite modificar los datos, excepto el código de aplicaciones.
- La base de datos facilita al usuario obtener más información debido a la facilidad que provee esta estructura para proveer datos a los usuarios.
- Nos brinda mayor seguridad en nuestra información, al permitir restringir el acceso a los usuarios, cada tipo de éstos tendrá la posibilidad de acceder a ciertos elementos.
Los
Fragmentos de datos del Animus :son objetos digitales repartidos por las ciudades Animus -
Renderizadas de Constantinopla y Capadocia, durante las sesiones de Animus de Desmond Miles.
Ó
ResultSet tiene métodos para devolver el
valor de las columnas como tipos de datos conocidos por Java getInt, getFloat,
getDate… por ejemplo para la columna last_update:
ResultSet cuenta con un método next()
que devuelve true si existen más registros o false si se encuentra en el
último. De este modo para imprimir por pantalla el nombre y apellido de todos
los autores haríamos lo siguiente:
Después
de un poco de retraso de este post y de tener un poco de tiempo sin postear
algo, traigo este ejemplo de Java y MySQL bajo la plataforma Netbeans. El
propósito de este post es crear una clase que realmente realiza las acciones
básicas (agregar, modificar, eliminar, consultar) pero implementadas de una
“mejor manera” comparada con los otros post que hay en este blog
sobre este tema (tampoco quiero decir que sea la mejor ni mucho menos).
La base
de datos que usaremos para este ejemplo es la siguiente:
·
BD:
prueba.
·
tabla:
usuarios.
·
campos:
id(autoinc), nombre, contraseña.
Diagrama
de clases:
Bueno,
primero que nada, empezaremos con nuestra clase que contendrá los métodos de
las acciones que vamos a realizar.
import java.sql.*;
public class SQLconnection {
public SQLconnection()
public SQLconnection (String
server, String usuario, String contraseña, String bd)
public void connectar()
public String getDb() {
public void setDb(String db) {
public String getHost() {
public void setHost(String
host) {
public String getPassword() {
public void setPassword(String
password) {
public String getUser() {
public void setUser(String
user) {
public ResultSet
consultar(String tabla) throws SQLException
public String
buscarNombre(String tabla, String nombre) throws SQLException
public void insertar(Hashtable
usuario)
public void actualizar(String
tabla, Hashtable usuario, String nombre)
public void eliminar(String
tabla, String nombre)
Como
podemos observar, esta clase cuenta con sobrecarga de constructores lo cual nos
permite conectarnos de 2 maneras distintas a la base de datos. La primera es
utilizar el constructor que no recibe ningún parámetro y definirlos mediante
los métodos set y get para después llamar
al método conectar. La segunda es
enviarle directamente los valores al constructor y, al igual que en la
forma anterior, ejecutar el método conectar, y esta será la
forma que usaremos para nuestro ejemplo.
Primero
que nada, vamos a conectarnos a nuestra base de datos y realizaremos
una consulta de todos los registros:
SQLconnection con = new
SQLconnection(“localhost”, “usuario”, “contraseña”, “prueba”);
En
esta clase también implementamos una opción que nos permite realizar búsquedas
por medio de nombres (es el campo de la base de datos que elegí para este
ejemplo); a este método le mandamos 2 parámetros, que son la base de datos y el
nombre:
System.out.println(con. buscar Nombre (“usuarios”,
“frago”));
Para insertar un nuevo registro vamos a hacer uso
del Hastable para enviarle los valores que queremos agregar:
Hashtable usuario = new
Hashtable();
Para eliminar un registro simplemente le ejecutamos
el método correspondiente y le pasamos como parámetros la tabla y el nombre del
usuario a eliminar:
con.
Eliminar (tabla, “frago”);
Para actualizar un registro le tenemos que pasar 3
parámetros al método. EL primero es el nombre de la tabla; el segundo es un
Hastable en el que se incluya la modificación que se quiere realizar y el
tercer es, en este caso, el nombre de la persona a la que se le va realizar la
modificación:
Hashtable usuario = new
Hashtable();
Resumen
Una base de datos es una colección de
información organizada de forma que un programa de ordenador pueda seleccionar
rápidamente los fragmentos de datos que necesite. Una base de datos es un
sistema de archivos electrónico.
Las bases de datos son
el método preferido para el almacenamiento estructurado de datos.
Desde las grandes aplicaciones multiusuario, hasta los
teléfonos móviles y las agendas electrónicas utilizan
tecnología de bases de datos para asegurar la integridad de los
datos y facilitar la labor tanto de usuarios como de los programadores que
las desarrollaron.
La Clase Connection
La
clase connection proporciona un interfaz eficiente para el acceso a datos y
metadatos de una base de datos. Conocer los recursos de gambas para acceso a
base de datos es fundamental a la hora de obtener un código transparente al
motor de base de datos que utilice la aplicación.
La Clase Statement
Un
objeto Statement se usa para enviar sentencias SQL a la base de datos.
Actualmente hay tres tipos de objetos Statement, todos los cuales actúan como
contenedores para la ejecución de sentencias en una conexión dada: Statement,
PreparedStatement que hereda de Statement y CallableStatement que hereda de
PreparedStatement.
Summary
A database is a collection of
information organized so that a computer program can quickly select fragments
of data you need. A database is an electronic file.
Databases are the preferred
method for structured data storage method. From large multiuser applications,
to mobile phones and PDAs using database technology to ensure data integrity
and facilitate the work of both users and programmers who developed them.
The Connection Class
The class provides an
efficient connection to access data and metadata from a database interface.
Knowing the shrimp resources for database access is essential when obtaining a
transparent code to the database engine using the application.
The Class Statement
A Statement object is used to
send SQL statements to the database. There are currently three types of
Statement objects, all of which act as containers for the enforcement of
judgments in a given connection: Statement, PreparedStatement inherits from
Statement and CallableStatement inherits from PreparedStatement.
Recomendaciones
- El método execute se usa para ejecutar sentencias que devuelven más de un result set, más que un update count o una combinación de ambos. Como es esta una característica avanzada que muchos programadores no necesitan nunca se verá en su propia sección.
- Se recomienda colocar cada nueva base de datos en su propio grupo de almacenamiento hasta que se alcance el número máximo de grupos de almacenamiento. Esta recomendación proporciona varias ventajas:
- Permite repartir la carga de los buzones entre todas las bases de datos y grupos de almacenamiento posibles.
- Permite reducir el tamaño de las bases de datos.
- Los archivos de registro y el tráfico de registro no se comparten entre varias bases de datos.
- Mejora la administración de la entrada/salida (E/S) de la unidad.
Conclusiones
- Utilizar JDBC implica construir y ejecutar repetidamente sentencias SELECT, INSERT, UPDATE y DELETE.
- Por lo tanto:
- Creamos mucho código que además estará muy acoplado a la base de datos que estemos usando.
- Tenemos que iterar manualmente sobre las propiedades de objetos como ResultSet cada vez que consultemos algo en la base de datos.
- A su vez es muy costoso crear PreparedStatements en cada caso por el mismo motivo de las iteraciones, pero en este caso sería sobre los POJO’s para Inserts, Updates y Deletes.
- Tendríamos que gestionar manualmente el orden de las inserciones, actualizaciones y borrados para que no hubiese problemas con la integridad referencial.
Apreciación del Equipo
- Base de datos nos proporciona una Independencia de los datos y los programas y procesos ya que permite modificar los datos, excepto el código de aplicaciones.
- La base de datos facilita al usuario obtener más información debido a la facilidad que provee esta estructura para proveer datos a los usuarios.
- Nos brinda mayor seguridad en nuestra información, al permitir restringir el acceso a los usuarios, cada tipo de éstos tendrá la posibilidad de acceder a ciertos elementos.
Glosario de Términos
Hastable: Una tabla hash, matriz
asociativa, mapa hash, tabla de dispersión o tabla fragmentada es una
estructura de datos que asocia llaves o claves con valores.
GetUpdateCount: La llamada
al método getResultSet cuando el resultado es una cuenta de actualización devuelve
nulo.
GetResultSet: Este método devuelve el resultado
modificado.
Multiusuario: La palabra multiusuario se refiere a un concepto de sistemas
operativos, pero en ocasiones también puede aplicarse a programas de
computadora de otro tipo (e.j. aplicaciones de base de datos) e incluso a sistemas
de cómputo.
Autentificación: Verificación de la identidad de
una persona, usuario o
proceso, para así acceder a determinados recursos o poder realizar determinadas
tareas.
Código
precompilado: Acción por medio de la cual, una serie de instrucciones escritas o
codificadas en lenguaje de programación son convertidas a lenguaje máquina
(binario) de tal forma que puedan ser ejecutadas por medio de un programa
informático.
Confiable: [cosa] Que es fiable,
inspira confianza o seguridad.
Deficiencia: Una deficiencia es una falla o un desperfecto. El término, que proviene del vocablo latino deficiencia, también puede referirse a la carencia de una cierta propiedad que es característica de algo.
Iteración significa el acto de
repetir un proceso con la intención de alcanzar una meta deseada, objetivo o
resultado. Cada repetición del proceso también se le denomina una "iteración",
y los resultados de una iteración se utilizan como punto de partida para
la siguiente iteración.
Linkografía
es.wikipedia.org/wiki/Base_de_datos
https://accesodatos.wordpress.com/2013/12/08/resultset/
Link de las diapositivas de java con base de datos
Link de las diapositivas de java con base de datos
Bien elaborada la PRESENTACION. Defina claramente las CONCLUSIONES y RECOMENDACIONES. Detalle la APRECIACION con sus propias palabras. Trabajo bien desarrollado y explicado. Proponga un foro de discusión sobre el tema.Gracias por su investigación.Saludos
ResponderEliminar