lunes, 26 de septiembre de 2016

JAVA CON BASE DE DATOS



               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));
}
EJEMPLO DE JAVA + SQL + NETBEANS
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








1 comentario:

  1. 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