El problema es comunicar un programa o aplicacin con una base de datos y ms que
comunicar se pretende que el programa o aplicacin realice una serie de procesos u operaciones con la base de datos o mejor aun con el conjunto de tablas que contiene una base de datos. El modo de comunicarse entre nuestro programa o aplicacin y la base de datos (ya sea fsica o un dbserver) implica que ambos manejen un lenguaje de programacin comn, es decir no se puede mandar una instruccin en csharp, o en basic o pascal a la base de datos y adems esperar que esta ultima la entienda ( para entender esto, una razn muy sencilla es que la base de datos tendra que conocer o comprender todos los lenguajes de programacin), para resolver este problema de comunicacin es que se usa un lenguaje comn de bases de datos que tanto los lenguajes de programacin existentes como las bases de datos entienden, este lenguaje comn de bases de datos es el SQL (structured query languaje) o lenguaje estructurado de consultas. La pregunta es ahora como mandamos las instrucciones sql a la base de datos, la respuesta son los siguientes OBJETOS. MYSQL CONNECTORJ.- Es un objeto(clase) especializado que se utiliza para enlazar e intercambiar informacion entre MYSQL y JAVA. Esta clase la debern de bajar de http://dev.mysql.com/downloads/connector/j/3.0.html Abrirlo con el winzip y solo buscar y sacar una clase que se llama MYSQL- CONNECTOR-JAVA-3.0.11-STABLE-BIN.JAR Agregar a la librera. Es muy importante que este paso lo realicen de la manera ms completa posible. OBJETO CONNECTION:- Objeto que se utiliza para establecer la conexin o enlace entre el programa jsp y la base de datos en mysql. OBJETO RESULTSET:- Es la representacin en memoria de las tablas de la base de datos en disco, se puede entender como una tabla virtual, recordar que generalmente todos los procesos que se realicen con la tabla (insertar registros, eliminar registros, etc.) se realizaran realmente contra un resulset y no provocaran ningn cambio en la tabla fsica en disco, resulset tiene un conjunto de mtodos muy tiles y muy usados para el proceso de los renglones de la tabla virtual. OBJETO STATEMENT:- Este objeto y sus dos mtodos executequery(solo para select de sql) y executeupdate( solo para insert, update y delete de sql) son los mtodos que se utilizaran para comunicarse con la tabla fsica en disco.
Ejemplo:
// declarando y creando objetos globales
Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost:3036/mibase?user=root&password=admin"; // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
TEMA 7: JAVA JSP MYSQL CONSULTA O DESPLIEGUE O SELECCIN Existen una serie de operaciones y procesos que son muy comunes contra una tabla en una base de datos en disco, la ms comn es desplegar todos los renglones de la tabla que estn almacenados en disco, a este proceso le llamaremos SELECCIN, consulta o despliegue. Como se indico anteriormente la comunicacin con la base de datos se tendrn que dar usando el lenguaje especializado de bases de datos llamado SQL(structured query language), la instruccin sql que se usa para resolver este problema tiene el siguiente formato: SELECT [listacampos, * o ALL] FROM TABLA; El procedimiento que se intenta seguir cuando se construya un programa jsp que tenga que manipular una tabla en disco deber seguir los siguientes pasos: 1.- Crear una conexin o enlace a la base de datos. 2.- Abrir la conexin a la base de datos. 3.- Crear el enlace y cargarlo con la instruccin sql 4.- Crear el RESULTSET y cargarlo 5.- Cargar un objeto table de html con el RESULTSET 6.- Procesar el table de html 7.- Cerrar rsultset, statement, driver o coneccin
prog41 jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% // declarando y creando objetos globales Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=root&password=laurosot"; if(request.getParameter("OK") != null) { // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; //leyendo tabla en disco y pasandola al resultset try { tabla = instruccion.executeQuery("select * from mitabla"); // mandando resultset a una tabla html out.println("<TABLE Border=10 CellPadding=5><TR>"); out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th bgcolor=Red>EDAD</th></TR>"); // ciclo de lectura del resultset while(tabla.next()) { out.println("<TR>"); out.println("<TD>"+tabla.getString(1)+"</TD>"); out.println("<TD>"+tabla.getString(2)+"</TD>"); out.println("<TD>"+tabla.getString(3)+"</TD>"); out.println("<TD>"+tabla.getString(4)+"</TD>"); out.println("</TR>"); }; // fin while out.println("</TABLE></CENTER></DIV></HTML>"); // cerrando resultset tabla.close(); instruccion.close();canal.close();} //fin try no usar ; al final de dos o ms catchs catch(SQLException e) {}; }; // construyendo forma dinamica out.println("<FORM ACTION=prog41.jsp METHOD=post>"); out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=CONSULTA><BR>"); out.println("</FORM>"); %>
Corrida:
Notas: 1.- revisar con cuidado el programa, porque como todo buen programa lleva incluida mucha documentacin o explicacin. 2.- Se sigue el procedimiento genrico para procesar tablas 3.- Observar y siempre incluir los import's indicados. 4.- Se empieza creando las variables globales a ocupar y abriendo la conexin a la base de datos, 5.- Se crea el enlace y se carga el resultset(o tabla en memoria) con la instruccin sql y la conexin, aqu es necesario entender que existen varias maneras de hacer este proceso. 6.- Luego se crea el resultset(tabla) y se cargo con toda la base de datos en disco 7.- Posteriormente se carga el TABLE DE HTML con el resultset. 8.- Para visitar o procesar todos los renglones de la tabla del dataset se usa un ciclo while, y el mtodo RESULTSET.NEXT() y por el nombre se ve que existen otros mtodos tiles para navegar por todos los renglones de resultset, tales como last(), prior() etc. 9.- Para procesar un dato, celda o columna de un rengln cualesquiera se usa el siguiente mtodo RESULTSET.GETSTRING(numerocolumna o nombrecolumna). 10.- ES MUY IMPORTANTE ESTUDIAR TODOS LOS MTODOS DEL RESULTSET PORQUE LES FACILITARA MUCHOS PROBLEMAS DE MANIPULACIN DE TABLAS, CONSULTAR LA DOCUMENTACIN DE SDK DE JAVA. 11.- observar tambin que los objetos resultset, statement y drivermanager(conexin), deben cerrarse al final del programa, y se cierran en el mismo orden como fueron abiertos. 12- ms claro an, NO OLVIDAR USAR LOS TRES CLOSE() que puse en el programa ejemplo. TAREA J AVA J SP MYSQL 1.- construir y desplegar una primera base de datos que contenga la primera tabla que disearon en el tema de tablas. 2.- Construir una segunda base de datos que contenga cuando menos tres de las tablas ya diseadas y desplegar cualquiera de ellas usando una sola forma html, donde el usuario selecciona cual quiere desplegar.
TEMA 8: INSERCION O ADICION DE REGISTROS SQL INSERT JAVA JSP Insertar o agregar registros o renglones nuevos a una tabla en disco, es un proceso sencillo que usa la siguiente instruccin sql: INSERT INTO TABLA(CAMPO1,CAMPO2..) VALUES(VALOR1,VALOR2..); Prog42.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% if(request.getParameter("GRABAR") != null) { // objetos de enlace Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=root&password=laurosoto"; // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; //cargando los campos a grabar // excepto clave porque en mysql es de tipo auto-increment String nombre = request.getParameter("NOMBRE"); int edad = Integer.parseInt(request.getParameter("EDAD")); float estatura =Float.parseFloat(request.getParameter("ESTATURA")); // insert into tabla(nombre,edad,estatura) values('juan', 15, 1.88); String q="insert into mitabla(nombre,edad,estatura) values(\"" +nombre+"\","+edad+","+estatura+"); "; try { // agregando renglon (insert)
int n=instruccion.executeUpdate(q); //avisando que se hizo la instruccion out.println("REGISTRO INSERTADO"); } catch(SQLException e) {out.println(e);}; try{ // tabla.close(); instruccion.close(); canal.close(); } catch(SQLException e) {out.println(e);}; }; // construyendo forma dinamica out.println("<FORM ACTION=prog42.jsp METHOD=post>"); out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>"); out.println("EDAD :<INPUT TYPE=TEXT NAME=EDAD><BR>"); out.println("ESTATURA:<INPUT TYPE=TEXT NAME=ESTATURA><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=GRABAR VALUE=INSERTAR> <BR>"); out.println("</FORM>"); %> Corrida:
Corrida prog41.jsp (consulta)
OBSERVAR QUE EXISTEN DOS METODOS PARA EL OBJETO STATEMENT: a) STATEMENT.EXECUTEQUERY() USARLO PARA SQL SELECT b) STATEMENT.EXECUTEUPDATE() USARLO PARA SQL INSERT, UPDATE, DELETE. TAREA J AVA J SP MYSQL 1.- construir muchos programas de insercin en las tablas de las bases de datos que tengan construidas TEMA 9: BUSQUEDA SQL SELECT JAVA JSP En este tema se analiza la bsqueda de un registro o rengln determinado en este proceso el usuario del programa quiere que se despliegue un y solo un registro de informacin proporcionando un dato de bsqueda generalmente la clave del registro. La solucin es sencilla, solo usar otra vez la instruccion select, con el siguiente formato: SELECT [ *, all, campos] FROM TABLA WHERE clave=claveabuscar; Y RESULTSET.EXECUTEQUERY().
// preparando condicion de busqueda int clave = Integer.parseInt(request.getParameter("CLAVEB")); // construyendo select con condicion String q="select * from mitabla where clave="+clave; // mandando el sql a la base de datos try { tabla = instruccion.executeQuery(q); // mandando resultset a tabla html out.println("<TABLE Border=10 CellPadding=5><TR>"); out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th bgcolor=Red>EDAD</th></TR>"); while(tabla.next()) { out.println("<TR>"); out.println("<TD>"+tabla.getString(1)+"</TD>"); out.println("<TD>"+tabla.getString(2)+"</TD>"); out.println("<TD>"+tabla.getString(3)+"</TD>"); out.println("</TR>"); }; // fin while out.println("</TABLE></CENTER></DIV></HTML>"); } //fin try no usar ; al final de dos o mas catchs catch(SQLException e) {}; try {tabla.close();instruccion.close();canal.close();} catch(SQLException e) {}; }; // construyendo forma dinamica out.println("<FORM ACTION=prog43.jsp METHOD=post>"); out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=BUSCAR><BR>"); out.println("</FORM>"); %> nota: no hay nada nuevo es una combinacin de los dos programas anteriores con las mismas notas, solo se usa un input text para pedir la clave, aunque se puede usar cualquier campo para buscar. Tambin recordar que el resultset despus de la busqueda solo queda cargado con el rengln que el canal se trajo de la base de datos. Corrida:
Observar que aunque el resultset tenga cuatro campos se pueden desplegar solo los que se ocupen. TAREAS PROGRAMACION JAVA JSP 1.- hacer programas de busquedas para las bases y tablas que tengan TEMA 10: FILTROS JAVA JSP Otro problema similar al anterior es el de filtros es decir en muchas ocasiones es necesario obtener informacin acerca de un subconjunto de renglones de la tabla. Por ejemplo todos los estudiantes que sean mayores de 17 aos, todos los clientes que sean de Tijuana, etc., a esto le llamamos filtros o condiciones. Tambin se resuelve de manera similar al anterior, es decir usando la instruccin select etc, from tabla, where CONDICIN; con RESULTSET.EXECUTEQUERY(). Prog44.jsp <%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% // declarando y creando objetos globales Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=root&password=laurosoto"; if(request.getParameter("OK") != null) { // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; // preparando condicion de busqueda int edad = Integer.parseInt(request.getParameter("EDAD")); String q="select * from mitabla where edad >="+edad; // mandando el sql a la base de datos try { tabla = instruccion.executeQuery(q); // mandando resultset a tabla html out.println("<TABLE Border=10 CellPadding=5><TR>"); out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th bgcolor=Red>EDAD</th></TR>"); while(tabla.next()) { out.println("<TR>"); out.println("<TD>"+tabla.getString(1)+"</TD>"); out.println("<TD>"+tabla.getString(2)+"</TD>"); out.println("<TD>"+tabla.getString(3)+"</TD>"); out.println("</TR>"); }; // fin while out.println("</TABLE></CENTER></DIV></HTML>"); } //fin try no usar ; al final de dos o mas catchs catch(SQLException e) {}; try {tabla.close();instruccion.close();canal.close();} catch(SQLException e) {}; };
// construyendo forma dinamica out.println("<FORM ACTION=prog44.jsp METHOD=post>"); out.println("EDAD > =<INPUT TYPE=text NAME=EDAD><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=FILTRAR><BR>"); out.println("</FORM>"); %> Nota: siguen siendo combinaciones de los programas anteriores pero sera prudente mejor usar dos combobox uno para la variable, otro para el operador relacional y un text para el dato y mandar estos tres datos al prog36.jsp pero eso queda de tarea. Corrida:
TAREAS PROGRAMACION JAVA JSP 1.- preparar programas de filtrado para sus bases de datos, recordar que sus formas html's deben construirlas con 2 combos y un text, suerte TEMA 11: OPERACIONES CON CAMPOS JAVA JSP Este es tambin un caso comn con elementos de una tabla, sin embargo es tambin fcil de resolver. Es necesario recordar primero algunas cosas elementales: 1.- Recordar que el numero de columna en una tabla empieza en 1, esto es que para realizar alguna operacin por ejemplo la columna edad del ejemplo que estamos siguiendo, su nmero de columna es la 2. 2.- La operacin que se plantee se puede realizar con todos los renglones de la tabla o con un solo rengln de la tabla(del resultset). 3.- En el ejemplo se realiza la operacin con todos los renglones de la tabla y no olvidar que se tiene que usar la instruccion sql Update para que la nueva informacin se actualice en disco, recordar que los cambios que se hacen a una tabla es realmente al resultset, que a su vez es una tabla o base de datos en la memoria de la maquina del cliente o usuario es por esta RAZN QUE LOS cambios hay que actualizarlos o pasarlos con UPDATE a la base de datos en disco. El siguiente programa le aumenta 50 a todas las edades. Prog45.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% if(request.getParameter("OK") != null) { // declarando y creando objetos y variables int edad, clave; String q; Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=root&password=laurosoto"; // crando canal o enlace try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; // cargando el resultet try { tabla = instruccion.executeQuery("select * from mitabla"); } catch(SQLException e) {}; // operaciones en el resultset while(tabla.next()){ clave = tabla.getInt(1); edad =tabla.getInt(3); edad=edad+50; // actualizacion a la tabla en disco con update q="update mitabla set edad= "+edad+ " where clave = "+clave+";"; try{ instruccion.executeUpdate(q); // cargando nuevo resultset actualizado tabla = instruccion.executeQuery("select * from mitabla"); // dejando apuntador en renglon apropiado, recordar que volvimos a releer la tabla y por tanto // hay que poner el apuntador en el renglon apropiado tabla.absolute(clave); }catch(SQLException e) {}; };//fin while // cerrando todo try {canal.close();instruccion.close();tabla.close();} catch(SQLException e) {}; out.println("EDADES AUMENTADAS"); }; // construyendo forma dinamica out.println("<FORM ACTION=prog45.jsp METHOD=post>");
TEMA 12: BAJA O ELIMINACIN SQL DELETE Eliminacin es otro proceso simple y comn con las bases de datos el modelo que estamos usando hace este tipo de operaciones muy fciles: La instruccin sql a usar es: DELETE FROM TABLA WHERE CONDICION Y RESULTSET.EXECUTEUPDATE() Prog46.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% // declarando y creando objetos globales Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=root&password=laurosoto"; if(request.getParameter("OK") != null) { // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; // preparando condicion de eliminacion int clave = Integer.parseInt(request.getParameter("CLAVEB")); // construyendo select con condicion eliminacion SQL DELETE String q="delete from mitabla where clave = "+clave; // mandando SQL a tabla en disco try { instruccion.executeUpdate(q); // avisando out.println("registro eliminado"); } //fin try no usar ; al final de dos o mas catchs catch(SQLException e) {} catch(java.lang.NullPointerException e){}; try { // no ocupa cerrar tabla(), no se leyo (select) un resultset // la eliminacion fue directa en disco instruccion.close();canal.close();} catch(SQLException e) {}; }; // construyendo forma dinamica out.println("<FORM ACTION=prog46.jsp METHOD=post>"); out.println("CLAVE ELIMINAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=ELIMINAR><BR>"); out.println("</FORM>"); %> Corridas : Prog -tabla original
pro46.jsp
prog41.jsp
TAREAS PROGRAMACIN JAVA JSP 1.- construir este proceso para las tablas y bases de datos que tengan construidas. TEMA 13: EDICION DE REGISTROS SQL UPDATE Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva informacin o para corregir algn error de captura original o para agregar alguna columna que no exista por modificacin de la tabla o la base de datos. En general se tiene otro problema de sql UPDATE, sin embargo ahora se tendrn que construir dos mtodos uno de busqueda normal y otro de actualizacin estos mtodos son: 1.- BSQUEDA: programa normal de bsqueda por clave, pero ahora deber construir una forma.html dinmica, que contendr un form action apuntando o ejecutndose a s mismo es decir prog47.jsp, adems tendr todos los input text necesarios para cargar cada celda del renglon de busqueda. 2.- EDICIN: recoje los datos ya modificados de la forma.html dinamica y realiza directamente un sql update en la base de datos. prog47.jsp <%@ page import="java.io.*, java.util.*, java.net.*, java.sql.*" %> <%! int clave=0; %> <% // codigo del evento BUSQUEDA y recordar construir una nueva forma dinamica if(request.getParameter("BUSCAR") != null) { Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=root&password=laurosoto"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; clave = Integer.parseInt(request.getParameter("CLAVEB")); String q="select * from mitabla where clave="+clave; try { tabla = instruccion.executeQuery(q); tabla.next(); out.println("<FORM ACTION=prog47.jsp METHOD=POST>"); out.println("NOMBRE:<INPUT TYPE=TEXT NAME=NOMBRE VALUE= "+ tabla.getString(2)+ "><BR>"); out.println("EDAD:<INPUT TYPE=TEXT NAME=EDAD VALUE= "+ tabla.getString(3)+ "><BR>"); out.println("ESTATURA:<INPUT TYPE=TEXT NAME=ESTATURA VALUE= "+ tabla.getString(4)+ "><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=EDITAR VALUE=EDITAR><BR>"); tabla.close();instruccion.close();canal.close(); } catch(SQLException e) {} catch(Exception ex){}; }; // fin evento buscar // codigo de evento EDICION String temp2=request.getParameter("EDITAR"); if(temp2==null)temp2=" "; if(temp2.compareTo("EDITAR")==0) { String nombre,q ; int edad; float estatura; Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);