lunes, 28 de septiembre de 2015

Mi primera aplicación - JSP y Servlets


Mi primera aplicación - JSP y Servlets
En esta primera aplicación desarrollaremos un pequeño sistema para dar mantenimiento a una tabla de base de datos. Como la utilizaremos para ponernos al día e ir entrando en calor, será lo más sencillo posible.


1. Ambiente de desarrollo
- JDK v1.6.0.27
- Netbeans v7.1.2
- Apache Tomcat v7.0.22
- MySql v5.1.61


2. Arquitectura de solución
Para ir de acuerdo a las buenas prácticas y acercarnos a un posible ambiente real, la arquitectura que emplearemos será de 3 capas lógicas. También emplearemos Interfaces e Implementaciones de las interfaces.

En este gráfico se aprecia que la capa de negocio y la capa de datos están en servidores separados. Esto es únicamente para representar el modelo de 3 capas a emplear, pueden estar en el mismo servidor o en diferentes.


3. Tecnologías de desarrollo
- JSP / Servlets
- JDBC


4. Manos a la obra
4.1. Como mencioné al inicio de este post, la aplicación que crearemos será para darle mantenimiento a una tabla de base de datos: tabla de clientes.
Para esto, primero creamos la base de datos y la tabla clientes mediante el siguiente script:





4.2. Luego de tener nuestra base de datos "swdefabrica" y la tabla clientes, vamos al Netbeans y creamos un nuevo proyecto web. Para esto, pulsamos las teclas CTRL + N, seleccionamos Java Web y Web Application, le asignamos un nombre y elegimos Apache Tomcat como nuestro servidor, finalizamos.








4.3. Agregamos las librerias que necesitemos, en este caso son las necesarias para conexión a base de datos (mysql) y para el rastreo a nuestro código (logger, mediante apache log4j). Para esto, damos clic derecho en el proyecto, properties; una vez se abre el pop up de properties, la tercera opción es libraries, a la derecha seleccionamos Add Jar / Folder (o agregar Jar).





4.4. Para poder configurar nuestro logger, creamos el archivo log4j.properties. Para esto damos clic derecho en Source Packages de nuestro proyecto, new (o nuevo, dependiendo del idioma instalado en el Netbeans), other (u otros), other otra vez y seleccionamos properties file (o archivo properties).




Creamos la estructura de paquetes y configuramos el archivo properties de la siguiente manera:




4.5. En el paquete com.clientes.util creamos la clase (clic derecho en el paquete, new, Java class) Conexion, para poder conectarnos con nuestra base de datos MySql.





4.6. Luego de esto creamos nuestro objeto ClienteBean (la clase cliente con todos los atributos necesarios) en el paquete com.clientes.bean. Para esto hacemos clic derecho en el paquete, new, Java class.




4.7. Luego de crear nuestra clase ClienteBean, y para manejar todos sus métodos (o acciones que podremos realizar sobre un cliente) creamos la interfaz ClienteDAO en el paquete com.clientes.dao (clic derecho en el paquete, new, Java interface) y la implementamos mediante la clase ClienteDAOImpl (en estas capas se realiza el trabajo con conexión a base de datos) que creamos en el paquete com.clientes.daoImpl (clic derecho en el paquete, new, Java class), como se ven en las siguientes imágenes:





4.8. Como podrán aver visto algunas sentencias que trabajan directamente sobre la base de datos (select ..., delete ...) y otras que hacen llamadas (call ...) a procedimientos de base de datos. Por lo que procederemos a crear los procedimientos almacenados necesarios (insertar y actualizar).




4.9. Una vez que tenemos completa la capa DAO de conexión a base de datos, procedemos a programar la capa de servicio (service) donde se maneja toda la lógica de negocio necesaria. Para esto, creamos la interfaz ClienteService en el paquete com.clientes.service (clic derecho en el paquete, new, Java interface) y la implementamos mediante la clase ClienteServiceImpl en el paquete com.clientes.serviceImpl (clic derecho en el paquete, new, Java class).



4.10. Luego de tener implementada la capa de servicio, pasamos a los Servlets. Los Servlets se atienden y responden las solicitudes realizadas por la vista o interfaz gráfica de usuario (IGU) a través de páginas JSP.






4.11. Luego de tener listo el Servlet, procedemos a crear las páginas JSP mencionadas anteriormente. Para esto se crearán 3 páginas: index - muestra un mensaje de bienvenida y un botón de ingreso; clienteLst - donde se listan los clientes creados y se tienen las opciones Buscar, Nuevo, Actualizar y Eliminar; clienteMnt - que es la interfaz donde se crean o actualizan los clientes.

index.jsp



clienteLst.jsp



clienteMnt.jsp
 


4.12. Finalmente al ejecutar nuestra aplicación tendremos la siguiente ventana de bienvenida.



martes, 22 de septiembre de 2015

JDBC: Conexión a Bases de datos Mysql

Buenas amigos, en este tutorial vamos a hablar de uno de los temas mas potentes que tiene java, y a los que a muchos nos interesa, una conexión a una base de datos mysql. Mencionar que aunque podríamos conectar  cualquier otro motor de base de datos (sqlite, oracle, access, sqlserver....) yo lo voy a realizar con mysql, más que nada porque ya lo tengo instalado. Así pues, explicaremos:
    • Conectar nuestra aplicación java a la base de datos.
    • Recorrer las tablas de la base de datos.


Bien, no voy a explicar en este tema como montar un servicio mysql, ya que me quedaría demasiado extenso, más adelante es posible que me anime, pero por el momento vamos a ver solamente el código necesario para conectarnos a nuestra base de datos y recorrer sus tablas. Podéis buscar en Google como montar un servicio mysql, hay tutoriales a patadas.
Lo primero de todo es descargarnos la librería o conector para poder trabajar con mysql:
[descargar conector]

Es imprescindible para poder conectar nuestra base de datos. Así pues, para cada tipo de motor de base de datos necesitaremos su librería o conector, lo cual, normalmente, se ofrece en la página principal del fabricante que utilicemos. Es algo muy común.

una vez descargado el conector, lo agregamos en nuestro proyecto, para ello hacemos lo siguiente:

  • Pulsamos sobre nuestro proyecto con el botón derecho del ratón y pulsamos, al final de la lista desplegable, en propiedades.
  • Una vez hecho esto se nos abrirá una ventana donde elegiremos la opción "vía de construcción":
  • En la siguiente ventana que se nos abre, elegiremos la pestaña "Biblioteca" y pulsaremos sobre la opción "Añadir JAR externo...", donde nos permitirá elegir nuestro conector descargado:
  • Una vez elegido nuestro conector, se nos mostrará en la vía de construcción  y habremos agregado a nuestro proyecto una nueva librería.
Bien, ya tenemos nuestra librería dentro de nuestro proyecto. Antes de nada me gustaría agregar que voy a trabajar sobre una base de datos llamada empresa con una tabla llamada empleados. Dicha tabla constara de 3 columnas:
    • ID
    • Nombre
    • Departamento
Bueno, ahora lo que nos toca crear es una clase capaz de establecer una conexión. Esta clase constará de 4 atributos:
  • private static String servidor: Aquí colocaremos la ruta de nuestra base de datos.
  • private static String user: El nombre de usuario de mysql
  • private static String pass: La clave de usuario de mysql
  • private static String driver: Nuestra librería mysql.
Y crearemos un objeto de la clase Connection del paquete java.sql para crear la conexión:
  • private static Connection conexion: Nos devuelve la conexión.
Como veis, establezco la ruta del servidor, utilizo el usuario y el pass que viene por defecto en mysql, indico la posición del driver y creo el objeto Connection.

En el constructor levantaremos la conexión y la obtendremos, para ello seguiremos 2 sencillos pasos:

      1. Levantar el driver.
      2. Establecer la conexión.
Bien, con el método estático de la clase "class" levanto el driver que le paso por argumentos:
    • Class.forName(driver);
Con el objeto Conecction obtengo la conexión por medio del método estático getConnection de la clase DriverManager, pasándole por argumentos el servidor, el usuario y el pass:
    • conexion=DriverManager.getConnection(servidor,user,pass);
Finalmente creamos un método para obtener el objeto de la clase Connection con la conexión establecida:

Aquí os dejo la clase entera.
Bien, esta clase establece la conexión, ahora vamos a crear otra clase que se encargue de:
    • Insertar valores
    • Seleccionar valores
    • Borrar valores
    • Modificar valores
Nuestra clase tendrá 5 atributos:
      1. Un objeto de la clase escaner para leer desde teclado.
      2. Un objeto Connection para obtener la conexión a la base de datos.
      3. Un objeto tipo String para el nombre.
      4. Un objeto de tipo String para el departamento.
      5. Una variable de tipo int para las opciones del menú.
Bueno, ahora crearemos una sentencia condicional switch, dentro de un bucle do/while, para que vaya dándonos las opciones que queramos realizar hasta salir de la aplicación, y todo esto, dentro del método MAIN:

Bueno, aquí podéis ver las opciones que tendrá nuestro menú:

      • Insertar
      • Modificar
      • Eliminar
      • Mostrar
      • Salir
En el blucle do/while establecemos que no se saldrá del menú hasta que la opción 5 sea elegida. Ahora vamos a ir explicando los métodos realizados para completar todas las funciones del menú:
INSERTAR:
Por pasos:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Pedimos los datos por pantalla y por medio del objeto teclado de la clase Scanner, leemos los datos que deseemos agregar. Una cosa antes de continuar, es que, aunque mi tabla consta de 3 campos, yo tengo establecido el primero (ID) como primary key, y he establecido que se auto-incremente, por lo tanto no tengo que introducirselo.
    • Una vez introducido los datos, creamos la sentencia sql para insertarlos en nuestra base de datos.
      • String sql="insert into empleados(nombre,departamento) values ('"+nombre+"','+departamento+"')";
      • Hay que darse cuenta que los "values" que le pasamos han de estar entre comillas simples ''.
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le indicamos que ejecute la actualización de la tabla y le pasamos por argumentos nuestra sentencia sql:
      • st.executeUpdate(sql);
    • Cerramos las conexiones, en orden inverso a su apertura:
      • st.close();
      • con.close();
Con esto ya podremos insertar filas en nuestra base de datos.
Modificar:
Por pasos:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Pedimos por teclado el número de ID del registro a modificar y se lo asignamos a una variable tipo int llamada "n", posteriormente volvemos a pedir el nombre y el departamento para modificarlos.
    • Creamos nuestra sentencia sql:
      • String sql="update empleados set nombre='"+nombre+"', departamento='"+departamento+"' where id="+n;
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le indicamos que ejecute la actualización de la tabla y le pasamos por argumentos nuestra sentencia sql:
      • st.executeUpdate(sql);
    • Cerramos las conexiones, en orden inverso a su apertura:
      • st.close();
      • con.close();
Esta vez le he puesto una sentencia "if" para que me avise de si se modifico con éxito o no. Con esto podremos modificar nuestros registros.
Eliminar:
Lo mismo que anteriormente:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Introducimos por teclado el registro a eliminar.
    • Creamos nuestra sentencia sql:
      • String sql="delete from empleados where id="+n;
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le indicamos que ejecute la actualización de la tabla y le pasamos por argumentos nuestra sentencia sql:
      • st.executeUpdate(sql);
    • Cerramos las conexiones, en orden inverso a su apertura:
      • st.close();
      • con.close();

Llegados a este punto, ya te deberías de dar cuenta de que lo único que cambio es la sentencia sql, el resto es un copy/paste, para que veas que no es tan complicado como parece.
Mostrar:
Esta varía un poco con respecto a las otras:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Creamos un objeto de la clase ResultSet que será la encargada de devolvernos los resultados de los registros:
      • ResultSet rs;
    • Creamos nuestra sentencia sql:
      • String sql="select * from empleados";
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le pasamos al objeto de ResultSet el resultado de ejecutar la sentencia sql:
      • rs=st.executeQuery(sql);
      • En este caso no actualizamos la tabla (executeUpdate()), sino que realizamos una consulta (executeQuery());
    • Por medio de un bucle while vamos recorriendo valores mientras existan (rs.next()) y por medio de los métodos getInt y getString obtenemos los valores de las diferentes columnas, tened en cuenta de que le tenemos que pasar el número de columna:
      • while (rs.next){
      • System.out.println("ID:"+rs.getInt(1));
      • System.out.println("Nombre: "+rs.getString(2));
      • System.out.println("Departamento: "+rs.getString(3));
      • System.out.println("**************************");
      • }
    • Cerramos las conexiones, en orden inverso a su apertura:
      • rs.close();
      • st.close();
      • con.close();

lunes, 7 de septiembre de 2015

Como Desbloquear el Schema HR en Oracle

Como Desbloquear el Schema HR en Oracle

Como Desbloquear el Schema HR en Oracle

Después de haber instalado y armado todo nuestro entorno de estudio, necesitamos desbloquear algún schema de ejemplo que trae nuestra base de datos Oracle, para el caso de que queramos utilizarlo para nuestras prácticas de estudio, en éste video explicamos como desbloquear el schema HR para tenerlo disponible y poder utilizarlo en nuestras prácticas. Para esta guia utilizaremos SQL Developer y Oracle 11g released 2.

¿Como sabemos si nuestro schema HR esta bloqueado?

  1. Ejecutamos SQL Developer. En la pestaña "Conexiones" a la izquierda de la ventana ,  seleccionando en la cruz verde que aparece en esta pestaña, creamos una nueva conexión.
  2. Al seleccionar la cruz verde aparece la ventana "Nueva / Seleccionar Conexión a Base de Datos", en ella diligenciamos algunos datos importantes para poder crear una conexión hacia el schema HR. Para ello en Nombre de Conexión se le da un nombre a la conexión, para este caso se le llamo "Schema - HR"; En el campo Usuario digitamos el nombre del schema, que es el mismo nombre del Usuario del schema, para este caso el usuario del schema HR es el mismo HR; en el campo Contraseña se digita la contraseña del usuario o schema HR; En la pestaña "Oracle" en el Tipo de Conexión seleccionamos el tipo TNS, se chequea en Alias de la Red y seleccionamos XE. Para probar la conexión se selecciona en el boton "Probar". Al probar si el usuario esta bloqueado debe aparecer la información en rojo que muestra la siguiente imagen "Estado: Fallo;Fallo de la prueba: ORA-28000: the account is Lockead".

Para desbloquear el schema HR es muy sencillo:
  1. Seleccionamos la consola de comandos de Run SQL Command Line en el menu inicio dentro de la carpeta "Oracle Database 11g Express Edition".
  2. Se abrira la consola de comando SQL de oracle en el estado que se muestra en la siguiente imagen.
  3. Para conectarnos digitamos "connect" y posteriormente se da un ENTER. Al pulsar ENTER nos aparece la siguiente linea "Enter user-name:", pidiendo el nombre de usuario con el que se hará la conexión.
  4. Para conectarnos utilizaremos el usuario SYS con el rol de SYSDBA. Para tal fin digitamos "sys as sysdba" y posteriormente se da un ENTER. Nos pedira la contraseña del usuario SYS (Esta contraseña se configuro al momento de la instalación de oracle). Al momento de digitarla no ocurrirá nada, no esperes que aparezcan asteriscos o puntos al momento de digitarla, solo digitala y presiona ENTER.
  5. Si la contraseña digitada es correcta debe aparecer un mensaje diciendo "Connected", así como lo muestra la siguiente imagen.
  6. Antes que nada se le debe asignar una contraseña al usuario HR, para ello digitamos la siguiente sentencia SQL: "alter user hr identified by XXX;" en donde las XXX significan la contraseña que se le asignara al usuario HR. En este caso se le asigno como contraseña HR, el mismo nombre del usuario HR. No olvides al final de la sentencia colocar punto y coma (;), ya que este es el que cierra la sentencia. A continuación se pulsa ENTER. Si la asignación de la contraseña fue exitosa, debe mostrar un mensaje diciendo "User altered" (Usuario alterado o Modificado).
  7. Para desbloquear el usuario digitamos la siguiente sentencia SQL: "alter user hr account unlock;", y pulsamos ENTER. Si el desbloqueo del usuario HR es exitosa, debe mostrar un un mensaje diciendo "User altered" (Usuario alterado o Modificado)
  8. Ahora se probara si el schema HR ha sido desbloqueado y su contraseña de igual manera, para ello digitamos la siguiente sentencia SQL con el siguiente formato conn [nombreDeUsuario]/[contraseña]@[aliasDeRed]" quedando para el caso de la guia así: "conn hr/hr@xe", Luego pulsamos enter. Si la el usuario y contraseña son validos debe mostrar un mensaje diciendo "Connected".
  9. Habiendo probado exitosamente el desbloqueo del usuario HR y la asignación de la contraseña nos salimos de la consola digitando "exit".
  10. Ahora abrimos SQL Developer y creamos una nueva conexión digitando los valores correspondientes para cada campo requerido. Para el caso de esta guia en Nombre de Conexión se le da un nombre a la conexión, se le llamo "Schema - HR"; En el campo Usuario digitamos el nombre del schema, que es el mismo nombre del Usuario del schema, para este caso el usuario del schema HR es el mismo HR; en el campo Contraseña se digita la contraseña del usuario o schema HR, en este caso la contraseña es "hr"; En la pestaña "Oracle" en el Tipo de Conexión seleccionamos el tipo TNS, se chequea en Alias de la Red y seleccionamos XE. Para probar la conexión se selecciona en el boton "Probar" y el estado de la conexión que se intenta crear es correcto, tal cual como lo muestra en la imagen en la parte inferior de la ventana con el mensaje "Estado: Correcto". Para crear la conexión seleccionamos en "Conectar".
  11. Como se observa en la siguiente imagen, aparece el nombre de la conexión "Schema - HR" con los objetos del esquema HR. Llamese Objeto a cualquier elemento que tenga el schema (tablas, vistas, indices, entre otros).
    Espero que sea de ayuda. Agradezco y dejes tu comentario al respecto.