• En este modelo de acceso a las bases de datos, las instrucciones son enviadas a una capa intermedia entre
Cliente y Servidor, que es la que se encarga de enviar las sentencias SQL a la base de datos y recoger el resultado desde la base de datos, véase la figura. En este caso el usuario no tiene contacto directo, ni siquiera a través de la red, con la maquina donde reside la base de datos.
ARQUITECTURA 3 CAPAS
Definición: Es un estilo de programación, su objetivo primordial es la separación de la capa de presentación, capa de negocio y la capa de datos.
La ventaja principal: Es el desarrollo se puede llevar a cabo en varios niveles y, en caso de que
sobrevenga algún cambio.
En el diseño de sistemas informáticos actuales se suele usar las arquitecturas multilineal o
Programación por capas.
Además, permite distribuir el trabajo de creación de una aplicación por niveles; cada grupo de
trabajo está totalmente abstraído del resto de niveles, de forma que basta con conocer la A PI que existe entre niveles.
API (Application Programming Interface)
Es el conjunto de funciones y procedimientos o métodos que ofrece cierta biblioteca para ser
utilizado por otro software como una capa de abstracción.
Ejemplos:
API de Java
Microsoft Framework .NET API for SCSI device interfacing Javascript-C de Mozilla
Symfony para PHP
1.) Capa de presentación.- Esta capa es la que ve el usuario , presenta el sistema al usuario, le comunica la información y captura la información del usuario en un mínimo de proceso.
Esta capa se comunica únicamente con la capa de negocio. También es conocida como interfaz gráfica y
debe tener la característica de ser "amigable" para el usuario generalmente se presentan como formularios.
2.) Capa de negocio
Aquí es donde, se reciben las peticiones del usuario y se envían las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lógica del negocio) porque es aquí donde se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de presentación, para recibir las solicitudes y presentar los resultado s, y con la capa de datos, para solicitar al gestor de base de datos para almacenar o recuperar datos de él.
Toda aplicación tiene código para implementar reglas de negocios.
Se puede seleccionar almacenar la lógica de negocios sobre cada estación de cliente, u optar por ejecutar la
lógica de negocios sobre un servidor de aplicaciones.
No toda la lógica de negocio es la misma algunas no requieren un frecuente acceso a los datos, pero una
interface de usuario robusta necesitara de la lógica de negocios para la validación en la entrada de campos, cálculos en tiempo real u otras interacciones de usuarios.
3)Capa De Datos
Es donde residen los datos y es la encargada de acceder a los mismos. Está formada por uno o más
gestores de bases de datos que realizan todo el almacenamiento de datos, reciben solicitudes de almacenamiento o recuperación de información desde la capa de negocio.
Dis eño de u na A pli cac ión Fi nal
Aplicacion Practica
A continuación se listarán algunos ejercicios prácticos de conexiones a Access y a SQL Server por medio de JDBC.
Observación: Para los ejemplos se hace uso de Oracle JDeveloper 10g.
Ejemplo con Access
1. Cree la base de datos de Access con el nombre “dbdata”, en ella cree una tabla de prueba denominada “persona”, esta tabla tendrá como campos a DNI, Nombre y Edad. Guarde esta base datos en “C:\ jdbc”.
2. En JDeveloper cree una aplicación nueva con el nombre “AccessJDBC”.
3. Luego de creada la aplicación, se le pedirá la creación del p royecto, al cual denominará “Project1”.
4. Haga clic derecho sobre el proyecto, seleccione “Properties”, luego en la ventana seleccione “Run/Debug”, haga clic en “Edit”, seleccione “Tool Settings” y habilite la entrada de información por parte del usuario:
5. Agregue una clase ejecutable al proyecto y denomínela “jdbc_conexion_access” tal como se muestra en la siguiente imagen:
6. En la clase haga un import a java.sql.* y al java.util.*. Luego escriba el siguiente código:
package project1;
import java.sql.*;
import java.util.*;
public class jdbc_conexion_access {
public static void main(String[] args) {
Scanner Leer=new Scanner(System.in);
String nombre,DNI,consult=new String();
int edad;
consult="";
try {
/*** Registro de driver y conexión a base de datos ****/
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection( "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/jdbc/dbdata.mdb", "", "");
/**Creando el Statement**/
Statement sentencia = con.createStatement();
while((consult.equals("S")||consult.equals("N"))==false){
System.out.print("¿Desea ingresar datos? (S/N):");
consult=Leer.next(); } if(consult.equals("S")){ System.out.print("Ingrese DNI:"); DNI=Leer.next(); System.out.print("Ingrese nombre: "); nombre=Leer.next(); System.out.print("Ingrese EDAD:"); edad=Leer.nextInt();
/***** Ejecutar sentencia SQL para el ingreso de datos a la tabla ********/
sentencia.executeUpdate( "INSERT INTO persona (DNI, nombre,edad) VALUES ('" + DNI + "', '"+nombre+"',"+edad+")");
}
/***** Ver datos de la tabla ********/
System.out.println(" Tabla de personas");
System.out.println("DNI\tNombre\tEdad");
ResultSet rs = sentencia.executeQuery( "SELECT DNI, nombre,edad FROM persona" );
/*** Recorrer fila a fila el resultado ****/
while ( rs.next() ) {
String res =rs.getString("DNI") +"\t "+ rs.getString("nombre") + "\t" + rs.getInt("edad");
System.out.println( res );
}
sentencia.close();
con.close();
}
catch( ClassNotFoundException e ) { e.printStackTrace(); }
catch (SQLException e) { e.printStackTrace(); }
}
}
7. Ahora compile la clase y obtendrá algo similar a:
Ejemplos con SQL Server 2000
Para trabajar con SQL Server 2000 y Java, se debe realizar los siguientes pasos previos:
Actualizar el servidor SQL Server 2000 al Service Pack 2 o posterior. Descargar e instalar el driver para SQL Server 2000 SP2.
Configurar del driver JDBC en JDeveloper.
Luego de estos pasos previos procederemos a crear las aplicaciones de prueba en JDeveloper de la siguiente manera:
a) Ejemplo para ver un catálogo de las bases de datos que tiene SQL Server.
1. Cree una aplicación denominada “ApplicationSQL” y denomine al proyecto “project1”.
2. Agregue la referencia al driver de SQL Server a la aplicación, para esto sólo haga clic derecho sobre el proyecto y en el menú contextual elija “Project properties”.
3. Luego seleccione “Libraries” en el panel izquierdo de la ventana de propiedades. En la misma ventana haga clic en el botón “Add Library…”. Lo anterior desplegará la ventana para añadir librerías.
4. En la ventana “Add Library…” haga clic en “New” y aparecerá la ventana para crear la librería en ella haga clic en “Add entry” y busque el driver de SQL 2000 para JDBC. El driver normalmente se ubica en “C:\Archivos de programa\Microsoft SQL Server 2000 Driver for JDBC\lib” y está compuesto por los archivos Msbase.jar, mssqlserver.jar y msutil.jar.
6. En el proyecto cree la clase ejecutable “SQLCatalog” con el siguiente contenido:
import java.*;
public class SQLCatalog {
private java.sql.Connection con = null;
private final String url = "jdbc:microsoft:sqlserver://";
private final String serverName= "localhost";
private final String portNumber = "1433";
private final String databaseName= "Northwind";
private final String userName = "sa";
private final String password = "";
private final String selectMethod = "cursor";
//Indica al controlador que debe utilizar un cursor de servidor
// lo que permite más de una instrucción activa en una conexión.
private String getConnectionUrl(){
return url+serverName+":"+portNumber+";databaseName="+databaseName+";" + "selectMethod="+selectMethod+";";
}
private java.sql.Connection getConnection(){
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); con = java.sql.DriverManager.getConnection(getConnectionUrl(),userName,password); if(con!=null) System.out.println("Conexión correcta."); } catch(Exception e){ e.printStackTrace();
System.out.println("Error de seguimiento en getConnection() : " + e.getMessage());
}
return con;
}
/* Mostrar las propiedades del controlador y los detalles de la base de datos */
public void displayDbProperties(){
java.sql.DatabaseMetaData dm = null; java.sql.ResultSet rs = null; try{ con= this.getConnection(); if(con!=null){ dm = con.getMetaData();
System.out.println("Información del controlador");
System.out.println(" Nombre del controlador: "+ dm.getDriverName());
System.out.println(" Versión del controlador: "+ dm.getDriverVersion ());
System.out.println(" Información de la base de datos ");
System.out.println(" Versión de la base de datos: "+ dm.getDatabaseProductVersion());
System.out.println("Catálogos disponibles ");
rs = dm.getCatalogs();
while(rs.next()){
System.out.println(" catálogo: "+ rs.getString(1));
}
rs.close();
rs = null;
closeConnection();
}
else System.out.println("Error: No hay ninguna conexión activa");
} catch(Exception e){ e.printStackTrace(); } dm=null; }
private void closeConnection(){
try{ if(con!=null) con.close(); con=null; } catch(Exception e){ e.printStackTrace(); } }
public static void main(String[] args) throws Exception {
SQLCatalog myDbTest = new SQLCatalog();
myDbTest.displayDbProperties();
}
}
7. Compile la clase y obtendrá algo similar a lo siguiente:
b) Ejemplo con interfaz gráfica SWING para ver los clientes de Northwind.
1. En JDeveloper, cree una aplicación denominada “SQLClientesNorth” y denomine al proyecto “project1”.
2. Al igual que la aplicación anterior, en la ventana de propiedades del proyecto agregue una referencia al driver para SQL Server 2000.
3. Haga clic derecho sobre el proyecto y en la ventana “New gallery” seleccione y expanda “Client tier” y seleccione “SWING/AWT”. En el panel izquierdo seleccione “Java application”, aparecerán las siguientes ventanas:
4.
4. Ahora Ahora en en el el frame frame creado, creado, diseñe diseñe la la siguiente siguiente interfaz:interfaz:
5.
5. La propiedad text La propiedad text de los botones es la misma de los botones es la misma que la actionCommanque la actionCommand y el JTable tiene ld y el JTable tiene la propiedada propiedad autoResizeMode en
autoResizeMode en AUTO_RESIZAUTO_RESIZE_OFF.E_OFF. 6.
6. Haga doble clic sobre el botón “filtro“y agregue la línea de códigoHaga doble clic sobre el botón “filtro“y agregue la línea de código import java.sql.*;import java.sql.*; y la líneay la línea importimport com.microsof
com.microsoft.jdbc.sqlt.jdbc.sqlserver.SQLServerDserver.SQLServerDriver;river; al comienzo del código. al comienzo del código. 7.
7. El El código decódigo del forl formulario mulario debe debe quedar quedar de la de la siguiente siguiente forma:forma:
import
import java.awt.Dimensionjava.awt.Dimension;;
import java.sql.*; import java.sql.*;
import
import java.awt.Rectangle;java.awt.Rectangle;
import
import
import java.awt.event.Ajava.awt.event.ActionListener;ctionListener;
import
import javax.swing.JButtjavax.swing.JButton;on;
import javax.swing.JFrame; import javax.swing.JFrame;
import
import javax.swing.JOptionPjavax.swing.JOptionPane;ane;
import javax.swing.JTable; import javax.swing.JTable;
import
import javax.swing.JTextjavax.swing.JTextField;Field;
import
import com.microsoft.jcom.microsoft.jdbc.sqlserver.SQLServerDriver;dbc.sqlserver.SQLServerDriver;
import
import javax.swing.JScrollPajavax.swing.JScrollPane;ne;
import
import javax.swing.table.javax.swing.table.DefaultTableMDefaultTableModel;odel;
import
import javax.swing.table.javax.swing.table.JTableHeader;JTableHeader;
public class ClientesNorth extends JFrame { public class ClientesNorth extends JFrame {
private JButton jButton1 = new JButton(); private JButton jButton1 = new JButton();
private JButton jButton2 = new JButton(); private JButton jButton2 = new JButton();
private JButton jButton3 = new JButton(); private JButton jButton3 = new JButton();
DefaultTableModel modelo = new DefaultTableModel(); DefaultTableModel modelo = new DefaultTableModel();
private JTextField jTextField1 = new JTextField(); private JTextField jTextField1 = new JTextField();
private JTable jTable1 = new JTable(); private JTable jTable1 = new JTable();
JScrollPane jScrollPane1 = new J
JScrollPane jScrollPane1 = new JScrollPane(jTable1);ScrollPane(jTable1);
private JScrollPane jScrollPane2 = new JScrollPane(); private JScrollPane jScrollPane2 = new JScrollPane();
public ClientesNorth() { public ClientesNorth() { try { try { jbInit(); jbInit(); } catch (Exception e) { } catch (Exception e) { e.printStackTrace(); e.printStackTrace(); }} }}
private void jbInit() throws Exception { private void jbInit() throws Exception {
this.getContentPa
this.getContentPane().setLayout( null ne().setLayout( null ););
this.setSize(new Dimension(603, 416)); this.setSize(new Dimension(603, 416));
jButton1.setT
jButton1.setText("Filtro");ext("Filtro");
jButton1.setBoun
jButton1.setBounds(new Rectangle(30, 285, ds(new Rectangle(30, 285, 120, 25));120, 25));
jButton1.setActio
jButton1.setActionCommand("Filtro"nCommand("Filtro"););
jButton1.addActio
jButton1.addActionListener(new ActionLinListener(new ActionListener() {stener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
jButton1_action jButton1_actionPerformed(e);Performed(e); }} }); }); jButton2.setTex jButton2.setText("Limpiar");t("Limpiar"); jButton2.setBound
jButton2.setBounds(new Rectangle(445, 285, s(new Rectangle(445, 285, 115, 25));115, 25));
jButton2.addActio
jButton2.addActionListener(new ActionLinListener(new ActionListener() {stener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
jButton2_actionP jButton2_actionPerformed(e);erformed(e); }} }); }); jButton3.setTex jButton3.setText("Salir");t("Salir"); jButton3.setBound
jButton3.setBounds(new Rectangle(445, 340, s(new Rectangle(445, 340, 110, 25));110, 25));
jButton3.addActi
jButton3.addActionListener(new ActionLonListener(new ActionListener() {istener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
jButton3_actionP jButton3_actionPerformed(e);erformed(e); }} }); }); jTextField1.setB
jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jScrollPane2.getViewport().add(jTable1, null); this.getContentPane().add(jScrollPane2, null); this.getContentPane().add(jTextField1, null); this.getContentPane().add(jButton3, null); this.getContentPane().add(jButton2, null); this.getContentPane().add(jButton1, null); jTable1.setCellSelectionEnabled(true); //nombres a comlumnas jTable1.setTableHeader(new JTableHeader(jTable1.getColumnModel())); jTable1.setPreferredScrollableViewportSize(new Dimension(100, 200)); jTable1.setAutoscrolls(false); jScrollPane2.setBounds(new Rectangle(25, 15, 545, 250)); }
private void llenadata()
{ try{ DriverManager.registerDriver(new SQLServerDriver()); Connection conexion = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;User=sa;Passwor d=;DatabaseName=Northwind");
CallableStatement stmt = conexion.prepareCall("{call sp_javapruebanorthwind (?)}");
stmt.setString(1, this.jTextField1.getText());
ResultSet rs =stmt.executeQuery();
int numeroColumnas=0;
// Se obtiene el número de columnas.
numeroColumnas = metaDatos.getColumnCount();
for(int ass=0 ;ass<numeroColumnas;ass++){
//añadir columnas al modelo
modelo.addColumn(metaDatos.getColumnName(ass+1));
}
Object [] fila = new Object[numeroColumnas];
// Bucle para cada resultado en la consulta
while (rs.next())
{
// Se obtiene cada una de las etiquetas para cada columna
// Se rellena cada posición del array con una de las columnas de la tabla en base de datos.
for (int i=0;i<numeroColumnas;i++)
fila[i] = rs.getObject(i+1); // El primer índice en rs es el 1, no el cero, por eso se suma 1.
// Se añade al modelo la fila completa.
modelo.addRow(fila); } jTable1.setModel(modelo); rs.close(); }catch(Exception y) { JOptionPane.showMessageDialog(this,y.getMessage()); } }
private void jButton1_actionPerformed(ActionEvent e) {
jTable1.setPreferredScrollableViewportSize(new Dimension(500, 70));
//asegurarse que modelo es nulo
modelo.setRowCount(0) ;
modelo.setColumnCount(0);
llenadata();
}
private void jButton2_actionPerformed(ActionEvent e) {
//limpiar el modelo
modelo.setRowCount(0);
modelo.setColumnCount(0);
}
private void jButton3_actionPerformed(ActionEvent e) {
this.dispose();
}
}
8. Antes de compilar este aplicativo, debe crear un procedimiento almacenado en SQL Server denominado sp_javapruebanorthwind con el siguiente contenido:
CREATE procedure sp_javapruebanorthwind
@companya varchar(40)
as
select * from customers where companyname like @companya + '%'
GO
9. Para ejecutar este ejemplo, haga clic derecho sobre “Application1.java” que se ubica dentro del proyecto de la aplicación “SQLClientesNorth” y sobre el menú contextual haga clic en “Run”. Obtendrá lo siguiente:
Puede aplicar un filtro a la consulta: