1. CAPA DE ACCESO DE DATOS
JDBC
INTEGRANTTES:
FIORELLA AGUILAR ISUIZA
AARON DELGADO ESPARRAGA
2. La capa de datos está formada por los servicios que proporcionan los datos
persistentes utilizados por la lógica de negocios. Los datos pueden ser datos de
aplicaciones almacenados en un sistema de administración de bases de datos o
pueden incluir información de recursos y directorios almacenada en un almacén de
datos de protocolo ligero de acceso a directorios (LDAP). Los servicios de datos
también pueden incluir alimentación de datos de orígenes externos o datos a los
que se puede obtener acceso desde sistemas informáticos heredados.
3. CREACIÓN DE LA CAPA DE ACCESO A DATOS
Al trabajar con datos, una opción es incrustar la lógica específica de datos
directamente dentro de la capa de presentación. Sin embargo, lo recomendable
es separar la lógica de acceso a datos de la capa de presentación.
Esta capa separada se conoce como DAL, que se implementa típicamente como
un proyecto de Biblioteca de Clases. En principio, esta arquitectura de capas
nos permite manejar de forma aislada los elementos relacionados con una u
otra sin afectar ambas
Todo el código específico al origen de datos, relacionado con los comandos
SELECT, INSERT, UPDATE, y DELETE debe ubicarse en la DAL. La capa de
presentación sólo debe hacer llamadas a la DAL para cualquier petición de
datos.
4. La BD Nortwind, por ejemplo, contiene las tablas Products y Categories
que guardan los productos en venta y sus categorías relacionadas. En la
DAL tendremos métodos como:
GetCategories(), que
regresará información de
todas las GetProducts(),
which will return
information about all of
the products.
GetProductsByCategoryID(cat
egoryID), que regresará todos
los productos pertenecientes
a una categoría en específico.
GetProductByProductID(Pro
ductID), que regresará
información de un product
en particular.
Estos métodos pueden regresar simplemente un DataSet o DataReader conteniendo los
datos generados por la consulta, pero idealmente deben contener objetos fuertemente
tipados (strongly-typed objects). Éstos son aquellos cuyo esquema está definido desde
el tiempo de compilación.
Por ejemplo, el DataReader y el DataSet no son por default objetos de este tipo ya que
su esquema se define por las columnas que regresa la consulta que envía los datos.
5. CREACIÓN DEL DATASET Y EL TABLE ADAPTER
Primero agregamos un DataSet al proyecto, para esto, dar click derecho en nodo del
proyecto y seleccionar Agregar Nuevo Elemento. Seleccionar la opción DataSet de
la lista y nombrarlo como Northwind.xsd.
6. Aceptar para agregar la carpeta App_Code
La clase TableAdapter funcionará como la Capa de Acceso a Datos. Para este
caso, contendrá los métodos GetProducts(),
GetProductByCategoryID(categoryID), y demás que se invocarán desde la
capa de presentación.El asistente pide seleccionar la BD a trabajar.
7. Seleccionar la Base de Datos Northwind
Guardar la Cadena de Conexión en el Web.Config
8. SELECCIONAR CONSULTA SQL
Creamos una consulta que
seleccione todos los registros
y campos de la tabla
Productos:
Uso del Editor de Consultas:
Seleccionar el botón de
Opcioones Avanzadas y
comprobar que esté seleccionada
la opción de “Generate Insert,
Update, and Delete statements".
9. SELECCIONAR GENERATE INSERT, UPDATE, Y DELETE
STATEMENTS.
Dar siguiente para ir a la
pantalla final. Aquí se pide
seleccionar los métodos para el
TableAdapter.
Cambio del nombre del
método.
10. EL DATATABLE PRODUCTS Y PRODUCTSTABLEADAPTER
Los objetos agregados nos sirven para tener
acceso a los datos con código tal como:
NorthwindTableAdapters.ProductsTableAdapter
productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
Response.Write("Product: " + productRow.ProductName
+ "<br />");
11. Construir la siguiente página web que enlaza el DataTable generado por
el método
GetProducts() a un GridView dentro del evento Page_Load
AllProducts.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="AllProducts.aspx.cs"
Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
12. <title>View All Products in a GridView</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
All Products</h2>
<p>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
14. using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class AllProducts : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource = productsAdapter.GetProducts();
GridView1.DataBind();
}
15. CONFIGURACION DE CONEXIÓN BASE DE
DATOS CON NETBEANS.
Para realizar la conexión a base de datos desde java
necesitamos hacer uso de JDBC. Las bases de datos que
deseemos conectar deberán proveernos el driver JDBC en
un empaquetado JAR para añadirlo a las librerías del
proyecto.
Deberemos conseguir la librería de acuerdo a la versión
de la Base de Datos al cual deseemos conectarnos.
Es posible que su IDE reconozca la existencia del driver si la base de datos ha sido instalada
en el mismo ordenador junto con sus librerías, solo haría falta añadirlo a la lista de librerías
que se usarán en el proyecto, por ejemplo en NetBeans se podría ir al directorio Libraries
del Proyecto, hacer clic derecho sobre él y elegir Add Library y en la lista podría encontrase
la que necesitemos, o si queremos agregarla manualmente Add JAR/Folder y seleccionar
desde la dirección donde lo tenemos almacenado.
16. Add Library
Una vez agregada la librería, vamos a realizar el código de conexión, el cual
nos debe presentar una clase con 2 métodos que a mi parecer no deberían
faltar. Debería existir una función (Las funciones retornan datos) que nos
retorne un CachedRowSet que es algo similar al ResultSet que no podemos
retornar mientras el Statement esté sin cerrar, pero es obvio que por
seguridad deberemos tener todas las conexiones cerradas, por eso no
retornamos directamente el ResultSet y hacerlo sin cerrar las conexiones
sería de muy mala práctica.
17. En cambio, el CachedRowSet almacena todos los registros y podemos
manipularla con las conexiones cerradas, cosa que no podemos hacer con los
ResultSets, ya que éstos necesitan al Statement Abierto, y el Statement a su vez
necesita la conexión abierta. Por otro lado deberíamos tener un
procedimiento (No retorna ningún dato), no retorna nada ya que se encargará
de realizar operaciones unidireccionales.
En conclusión, usamos la Función cuando usemos Sentencias DML SELECT
incluyendo las Funciones y usar el Procedimiento cuando usemos INSERT,
DELETE O UPDATE, incluyendo los StoreProcedures(Procedimientos
Almacenados); aunque podemos conocer algunas bases de datos que
permitan retornar datos desde StoreProcedures, lo ideal sería hacerlo desde
funciones, manteniendo cada uno para su propósito. Del mismo modo, habrá
podido darse cuenta que ambos métodos reciben una variable String como
parámetro, ésta es nada menos que la Sentencia DML que deseamos ejecutar.
18. Como habrán podido apreciar en el
código, el manejo de excepciones es
relativamente sencilla, lo ideal sería
especificar las excepciones por cada
conexion, statement y resultset para
de esa manera asegurarnos que
permanezcan cerradas al finalizar la
ejecución o aun cuando existieran
errores; de igual manera sería muy útil
obligar a cerrar las conexiones desde
dentro de una clausula finally anexada
al try – catch.
19. Por último la url de conexión “jdbc:motor:servidor:puerto/basededatos”, variará a continuación
de jdbc, según el motor de base de datos al que deseemos conectarnos (PostgreSQL, MySQL, Oracle,
Derby, etc) , la dirección IP del servidor, el puerto y finalmente el nombre de la base de datos al que
queramos acceder.
DEFINICIÓN DE JDBC
JDBC es un API (Application programming interface) que describe o define una librería estándar para
acceso a fuentes de datos, principalmente orientado a Bases de Datos relacionales que usan SQL
(Structured Query Language). JDBC no sólo provee un interfaz para acceso a motores de bases de datos,
sino que también define una arquitectura estándar, para que los fabricantes puedan crear los drivers que
permitan a las aplicaciones javas el acceso a los datos.
20. JDBC hace posible estas tres cosas:
Establece una conexión con la base de datos.
Envía sentencias SQL.
Procesa los resultados.
TIPOS DE CONECTORES (DRIVERS) JDBC
Tipo 1. JDBC-ODBC bridge más driver ODBC: “BRIDGE”
Permite el acceso a Base de Datos JDBC mediante un driver ODBC. Cada
máquina cliente que use el puente, debe tener librerías clientes de
ODBC (dll propias del S.O)
Ventajas: Buena forma de aprender JDBC. También puede ser buena
idea usarlo, en sistemas donde cada máquina cliente tenga ya instalado
los drivers ODBC. También es posible que sea la única forma de
acceder a ciertos motores de Bases de Datos.
21. Tipo 2. Driver Java parciales: “NATIVE”
Traducen las llamadas al API de JDBC Java en llamadas propias del motor de
Base de Datos (Oracle, Informix…). Al igual que el tipo anterior, exige en las
máquinas clientes código binario propio del cliente de la Base de datos
específica y del sistema operativo
Ventajas: Mejor rendimiento que el anterior. Quizá puede ser buena solución
para entornos controlados como intranets. Ejemplo OCI oracle.
Tipo 3. Driver JDBC a través de Middleware:
“NETWORK”
Traduce las llamadas al API JDBC en llamadas propias del protocolo
específico del broker. Éste se encargará de traducirlas de nuevo en
sentencias propias del motor de Base de Datos de cada caso.
22. Tipo 4: Driver java puro (acceso directo a Base de Datos): “THIN”.
Convierte o traduce las llamadas al API JDBC en llamadas al protocolo de red usado por
el motor de bases de datos, lo que en realidad es una invocación directa al motor de
bases de datos.
23. APLICACIONES.
JDBC es usado para enviar comandos SQL hacia una base de datos relacional, que
puede ser Oracle, Infomix, SyBase, etc.
JDBC sirve para conectarse a una base de datos, y para cada base de datos hay un
driver JDBC diferente. Si la base de datos es remota, y el driver permite conectar a una
base de datos remota, por supuesto que se puede acceder a la base de datos a través
de Internet o de cualquier red, teniendo en cuenta siempre cortafuegos, Proxy, etc. Que
pueden cerrarnos los puertos de conexión.
API Interfaz de programación: Es el conjunto de funciones y procedimientos o
(métodos si se refiere a programación orientada a objetos) que ofrece cierta biblioteca
para ser utilizado por otro software como una capa de abstracción.
24. LA CLASE CLASS
Las clases en Ruby son instancias de la clase Class. Cuando se define una
nueva clase (p.e. class NombreClase … end), se crea un objeto de la
claseClass y es asignado a una constante (en este caso NombreClase). Cuando
se usa NombreClase.new para construir un nuevo objeto, se usa el método de la
clase Class para crear nuevas instancias; y después se usa el método
inicializador de la propia clase NombreClase: la construcción y la inicialización de
un objeto son cosas distintas, y pueden modificarse.
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 ambas 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.
25. CLASE JAVA DRIVERMANAGER
DriverManager es una clase estática de Java. DriverManager gestiona el
conjunto de controladores Java Database Connectivity (JDBC) que están
disponibles para que los utilice una aplicación.
Las aplicaciones pueden utilizar varios controladores JDBC
simultáneamente si es necesario. Cada aplicación específica un controlador
JDBC mediante la utilización de un URL (Localizador universal de
recursos). Pasando un URL de un controlador JDBC específico a
DriverManager, la aplicación informa a DriverManager acerca del tipo de
conexión JDBC que debe devolverse a la aplicación.
26. Para poder realizar esta operación, DriverManager debe estar al
corriente de los controladores JDBC disponibles para que pueda
distribuir las conexiones. Efectuando una llamada al método
Class.forName, carga una clase en la máquina virtual Java (JVM) que
se está ejecutando en función del nombre de serie que se pasa en el
método. A continuación figura un ejemplo del método class.forName
utilizado para cargar el controlador JDBC nativo: