Primeros Pasos con MyBatis

Primeros Pasos con MyBatis

Programar los componentes de lógica de persistencia con JDBC es una tarea no tan atractiva, por que hay código que repetimos constantemente en cada proceso.
Por eso es recomendable usar un framework ORM o JDBC.
En esta oportunidad explico como empezar a trabajar con MyBatis.

CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



INTEGRACION SPRING FRAMEWORK MYBATIS

INTEGRACIÓN SPRING FRAMEWORK MYBATIS
INTRODUCCIÓN
Sin duda alguna, el uso de framework para programar soluciones empresariales es una opción muy aceptada y recomendada.
En este contexto, Spring Framework y MyBatis son una alternativa muy interesante.
En este video, te explico mediante un ejemplo cómo integrar estos dos excelentes frameworks.
VIDEO
CODIGO FUENTE
En esta sección te presento un video de una aplicación CLIENTE-SERVIDOR.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



CEPS-UNI DEVELOPER DAY 2015

BUENAS PRACTICAS EN EL DESARROLLO DE SOFTWARE

BUENAS PRACTICAS EN EL DESARROLLO DE SOFTWARE

Constantemente los jefes de proyecto, los clientes y los usuarios se quejan de que las aplicaciones no se desarrollan a tiempo.

Si logra terminar a tiempo no han implementados todos los requerimientos, o simplemente la calidad no es la esperada.

En esta presentación trato de explicar cuales podrían ser los motivos de estas deficiencias cuando creamos software.

CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



JAVA 8: LOOP THROUGH ARRAY

JAVA: RECORRIDO DE UN ARREGLO
RECORRIDO INDEXADO
En este caso se utiliza el índice del arreglo para hacer su recorrido, tal como se ilustra en el siguiente ejemplo:

package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba01 {

  public static void main(String[] args) {

    String[] ciudades = {
      "Lima","Londres","Paris",
      "New York","Roma","Berlín"
    };

    for (int i = 0; i < ciudades.length; i++) {
      String ciudad = ciudades[i];
      System.out.println(ciudad);
    }

  }

}     
La variable i toma valores desde 0 hasta el último índice (ciudades.length - 1). Con el valor del índice se accede al dato, en este caso se trata de un String. Se tiene la ventaja que el recorrido no necesariamente debe empezar desde el primero elemento, índice 0, y tampoco debe terminar en el último.
RECORRIDO TIPO COLECCIÓN
También se conoce como recorrido tipo FOR EACH, es una característica que se tiene desde Java 5, a continuación tenemos un ejemplo:
package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba02 {

  public static void main(String[] args) {
    
    String[] ciudades = {
      "Lima","Londres","Paris",
      "New York","Roma","Berlín"
    };
    
    for (String ciudad: ciudades) {
      System.out.println(ciudad);
    }
    
  }
  
}    
En este caso, se recorren directamente los elementos del arreglo, por tal motivo, se utiliza una variable del mismo tipo que el arreglo, para el ejemplo es String. La variable ciudad, en cada iteración toma el valor de una ciudad, empezando con Lima y termina con Berlín.
RECORRIDO UTILIZANDO LAMBDA EXPRESSIONS
Las Expresiones Lambda aparecen en Java 8, y realmente simplifican bastante el código, lo se muestra aquí en un ejemplo:
package pe.egcc.app.prueba;

import java.util.Arrays;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba03 {

  public static void main(String[] args) {
    
    String[] ciudades = {
      "Lima","Londres","Paris",
      "New York","Roma","Berlín"
    };
    
    Arrays.stream(ciudades).forEach((ciudad) -> {
      System.out.println(ciudad);
    });
    
  }
  
}  
Lo primero que se debe hacer es convertir el arreglo en un Stream, luego, se le aplica la función forEach, que permite recorrer cada uno de los elementos. Como se trata de un solo parámetro y una sola instrucción se puede simplificar aún mas, como se ilustra a continuación.
    Arrays.stream(ciudades).forEach(ciudad ->
      System.out.println(ciudad));
Se puede descargar el proyecto desde el siguiente enlace:
Descargar Proyecto
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



JAVA 8 - FUNCTIONAL INTERFACES

JAVA: RECORRIDO DE UN ARREGLO
SINGLE ABSTRACT METHOD INTERFACES
Son interfaces cuya característica es que tienen solo un método abstracto.
Normalmente, su implementación es como una clase anónima, definida en la misma línea de código donde se crea el objeto de la clase.
A continuación tenemos un ejemplo de la interface Comparator:

package pe.egcc.app.prueba;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba01 {

  public static void main(String[] args) {

    List lista = new ArrayList<>();
    lista.add("Gustavo");
    lista.add("Guino");
    lista.add("Sergio");
    lista.add("Cesar");
    lista.add("Ernesto");

    System.out.println(lista);

    Collections.sort(lista, new Comparator() {

      @Override
      public int compare(String o1, String o2) {
        return o1.compareTo(o2);
      }
    });
 
    System.out.println(lista);

  }
}
 
La definición de la clase anónima y la creación de una instancia de la misma representan acciones inseparables que se realizan en la misma línea de código.
Otros ejemplos de estos tipos de interfaces son: Runnable, ActionListener, Callable.
FUNCTIONAL INTERFACE
Las interfaces funcionales tienen un solo método abstracto, veamos un ejemplo:

package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
@FunctionalInterface
public interface IMate {

  int opera(int n1, int n2);

}
 
En este caso, se está creando la interface IMate con un solo método, es importante utilizar la anotación @FunctionalInterface.
A continuación tenemos un ejemplo de su uso utilizando expresiones lambda:

package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba02 {

  public static void main(String[] args) {
    
    IMate bean1 = (a,b) -> (a+b);
    IMate bean2 = (a,b) -> (a*b);
    
    System.out.println("5 + 8 = " + bean1.opera(5, 8));
    System.out.println("5 * 8 = " + bean2.opera(5, 8));
    
  }
}
 
Se ha creado el objeto bean1, que implementa el método como una suma, y el objeto bean2 que implementa el método como un producto.
A continuación tenemos el resultado de su ejecución:

run:
5 + 8 = 13
5 * 8 = 40
BUILD SUCCESSFUL (total time: 4 seconds)
    
EL CASO DE LA INTERFACE COMPARATOR
A continuación tenemos una implementación de la interface Comparator utilizando expresiones lambda:

package pe.egcc.app.prueba;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba03 {

  public static void main(String[] args) {

    List lista = new ArrayList<>();
    lista.add("Gustavo");
    lista.add("Guino");
    lista.add("Sergio");
    lista.add("Cesar");
    lista.add("Ernesto");

    System.out.println(lista);
    
    Collections.sort(lista, (o1,o2) -> o1.compareTo(o2) );
 
    System.out.println(lista);

  }
}
 
Como se puede apreciar el codigo es mucho mas compacto.
EL CASO DE LA INTERFACE ACTIONLISTENER
A continuación tenemos una implementación clásica de la interface ActionListener:

package pe.egcc.app.prueba;

import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba04 extends JFrame{
  
  private JButton button;

  public Prueba04() throws HeadlessException {
    super("Demo Clásico");
    setLayout(new GridLayout(1, 1));
    setSize(200, 200);
    setLocationRelativeTo(null);
    button = new JButton("Saludar");
    add(button);
    button.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(rootPane, "Hola Gustavo.");
      }
    });
  }

  public static void main(String[] args) {
    Prueba04 bean = new Prueba04();
    bean.setVisible(true);
  }
  
}
     
En este caso la interface ActionListener se esta implementando como una clase anónima, a continuación tenemos su implementación utilizando expresiones lambda:

package pe.egcc.app.prueba;

import java.awt.GridLayout;
import java.awt.HeadlessException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba05 extends JFrame{
  
  private JButton button;

  public Prueba05() throws HeadlessException {
    super("Demo Clásico");
    setLayout(new GridLayout(1, 1));
    setSize(200, 200);
    setLocationRelativeTo(null);
    button = new JButton("Saludar");
    add(button);
    button.addActionListener( (e) -> {
        JOptionPane.showMessageDialog(rootPane, "Hola Gustavo.");
      });
  }

  public static void main(String[] args) {
    Prueba05 bean = new Prueba05();
    bean.setVisible(true);
  }
  
}
   
Como se trata de un solo parámetro y una sola instrucción el código se puede reducir aún más, tal como se ilustra a continuación:

    button.addActionListener( e -> 
      JOptionPane.showMessageDialog(rootPane, "Hola Gustavo."));
       
El proyecto se puede descargar desde el siguiente enlace:
Descargar proyecto
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



MYSQL: TIPS

MYSQL: TIPS - GUSTAVO CORONEL
INFORMACIÓN DE TABLAS
Por ejemplo, muchas veces queremos saber si las tablas de la base de datos de tipo MyISAM o InnoDB, aquí tenemos la consulta que nos puede ayudar:
sql> show table status from eurekabank;
A continuación su ejecución:
CLAVES DE UNA TABLA
Otras veces queremos saber cuales es la primary key (clave primaria) y los foreign keys (claves foraneas) de una tabla, aquí tenemos la consulta que nos puede ayudar:
use information_schema;

select 
  table_name,
  column_name,
  constraint_name,
  referenced_table_name,
  referenced_column_name 
from key_column_usage
where table_schema = 'eurekabank' 
and table_name = "cuenta" 
and referenced_column_name is not null;
A continuación su ejecución:
CÓDIGO FUENTE - EUREKA-WEB-ORACLE-JDBC

En esta oportunidad te presento un video donde te explico cómo ejecutar el código fuente de una aplicación Java Web, utilizando HTML, CSS, JavaScript, AJAX y JSON, en la capa de persistencia se utiliza JDBC y base de datos Oracle XE 11g.

Tú tienes acceso al código fuente de esta aplicación, después del video esta el enlace.



JAVA JDBC: ResultSet to List

JAVA JDBC: ResultSet to List
INTRODUCCIÓN
Cuando desarrollamos una aplicación con JDBC, una de las tareas que programamos frecuentemente es pasar un objeto de tipo ResultSet a una lista de objetos Map, List<Map<String,Object>>.
Por ejemplo, cuando queremos hacer una consulta a varias tablas, luego el resultado se debe mostrar en una tabla o quisas en un reporte con Jasper Report.
En este oportunidad desarrollara la clase JdbcUtil con un método que permite pasar un objeto ResultSet a una lista, la base de datos a utilizar es EurekaBank.
Las pruebas se realizan con 3 motores de bases de datos diferentes: Oracle, MySQL y SQL Server.
La base de datos la puede descargar desde:
METADATA DEL ResultSet
Para acceder a la metadata de un objeto ResultSet se utiliza el metodo getMetaData(), para obtener la cantidad de columnas se utiliza el método getColumnCount() de la metadata, para obtener el nombre de la columna se utiliza el método getColumnName(i) de la metadata, para obtener la etiqueta de la columna se utiliza el método getColumnLabel(i) de la metadata, siendo i el número de la columna e inicia en 1.
PRUEBA CON ORACLE
La versión de Oracle utilizada es la 11.2 y el driver jdbc utilizado es ojdbc6.jar.:
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for 32-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
El código base a utilizar es:
// Datos Oracle
String driver = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "eureka";
String pass = "admin";
// Conexión
Class.forName(driver).newInstance();
cn = DriverManager.getConnection(url, user, pass);
// Consulta
String sql = "aquí debe ir la consulta";
PreparedStatement pstm = cn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
// Obtener metadata
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
System.out.println("getColumnName()\tgetColumnLabel()");
for (int i = 1; i <= columns; i++) {
  System.out.println(md.getColumnName(i) + "\t" + md.getColumnLabel(i));
}
rs.close();
pstm.close();
Consultando un tabla
La consulta a utilizar es la siguiente:
select 
  chr_cliecodigo, vch_cliepaterno, 
  vch_cliematerno, vch_clienombre 
from cliente
El resultado es el siguiente:
getColumnName()  getColumnLabel()
CHR_CLIECODIGO   CHR_CLIECODIGO
VCH_CLIEPATERNO  VCH_CLIEPATERNO
VCH_CLIEMATERNO  VCH_CLIEMATERNO
VCH_CLIENOMBRE   VCH_CLIENOMBRE
Cambiando el titulo de las columnas
La consulta a utilizar es la siguiente:
select 
  chr_cliecodigo cod, vch_cliepaterno pat, 
  vch_cliematerno mat, vch_clienombre nom
from cliente
El resultado es el siguiente:
getColumnName()   getColumnLabel()
COD               COD
PAT               PAT
MAT               MAT
NOM               NOM
Consultando dos tablas
La consulta a utilizar es la siguiente:
select 
  tm.vch_tipodescripcion tipo,
  sum(m.dec_moviimporte) importe
from tipomovimiento tm join movimiento m
on tm.chr_tipocodigo = m.chr_tipocodigo
group by tm.vch_tipodescripcion
El resultado es el siguiente:
getColumnName()   getColumnLabel()
TIPO              TIPO
IMPORTE           IMPORTE
De los resultados obtenidos se puede concluir que tanto getColumnName() y getColumnLabel() arrojan los mismos valores, se puede utilizar cualquiera de los dos métodos.
PRUEBA CON MYSQL
La versión de MySQL utilizada es la 5.6 y el driver jdbc utilizado es la versión 5.1.23:
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.
El código base a utilizar es:
// Datos MySQL
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/EUREKABANK";
String user = "eureka";
String pass = "admin";
// Conexión
Class.forName(driver).newInstance();
cn = DriverManager.getConnection(url, user, pass);
// Consulta
String sql = "aquí debe ir la consulta";
PreparedStatement pstm = cn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
// Obtener metadata
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
System.out.println("getColumnName()\tgetColumnLabel()");
for (int i = 1; i <= columns; i++) {
  System.out.println(md.getColumnName(i) + "\t" + md.getColumnLabel(i));
}
rs.close();
pstm.close();
Consultando un tabla
La consulta a utilizar es la siguiente:
select 
  chr_cliecodigo, vch_cliepaterno, 
  vch_cliematerno, vch_clienombre 
from cliente
El resultado es el siguiente:
getColumnName()   getColumnLabel()
chr_cliecodigo    chr_cliecodigo
vch_cliepaterno   vch_cliepaterno
vch_cliematerno   vch_cliematerno
vch_clienombre    vch_clienombre
Cambiando el titulo de las columnas
La consulta a utilizar es la siguiente:
select 
  chr_cliecodigo cod, vch_cliepaterno pat, 
  vch_cliematerno mat, vch_clienombre nom
from cliente
El resultado es el siguiente:
getColumnName()    getColumnLabel()
chr_cliecodigo     cod
vch_cliepaterno    pat
vch_cliematerno    mat
vch_clienombre     nom
Consultando dos tablas
La consulta a utilizar es la siguiente:
select 
  tm.vch_tipodescripcion tipo,
  sum(m.dec_moviimporte) importe
from tipomovimiento tm join movimiento m
on tm.chr_tipocodigo = m.chr_tipocodigo
group by tm.vch_tipodescripcion
El resultado es el siguiente:
getColumnName()        getColumnLabel()
vch_tipodescripcion    tipo
importe                importe
De los resultados obtenidos se puede concluir que getColumnLabel() sería la opción mas conveniente a utilizar.
PRUEBA CON SQL SERVER
La versión de SQL Server utilizada es la 2008 R2 y el driver jdbc utilizado es JTDS versión 1.2.5:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
Apr  2 2010 15:48:46 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1  (Build 7601: Service Pack 1)
El código base a utilizar es:
// Datos SQL Server
String driver = "net.sourceforge.jtds.jdbc.Driver";
String url = "jdbc:jtds:sqlserver://localhost:1433/EUREKABANK";
String user = "sa";
String pass = "sql";
// Conexión
Class.forName(driver).newInstance();
cn = DriverManager.getConnection(url, user, pass);
// Consulta
String sql = "aquí debe ir la consulta";
PreparedStatement pstm = cn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
// Obtener metadata
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
System.out.println("getColumnName()\tgetColumnLabel()");
for (int i = 1; i <= columns; i++) {
  System.out.println(md.getColumnName(i) + "\t" + md.getColumnLabel(i));
}
rs.close();
pstm.close();
Consultando un tabla
La consulta a utilizar es la siguiente:
select 
  chr_cliecodigo, vch_cliepaterno, 
  vch_cliematerno, vch_clienombre 
from cliente
El resultado es el siguiente:
getColumnName()    getColumnLabel()
chr_cliecodigo     chr_cliecodigo
vch_cliepaterno    vch_cliepaterno
vch_cliematerno    vch_cliematerno
vch_clienombre     vch_clienombre
Cambiando el titulo de las columnas
La consulta a utilizar es la siguiente:
select 
  chr_cliecodigo cod, vch_cliepaterno pat, 
  vch_cliematerno mat, vch_clienombre nom
from cliente
El resultado es el siguiente:
getColumnName()    getColumnLabel()
cod                cod
pat                pat
mat                mat
nom                nom
Consultando dos tablas
La consulta a utilizar es la siguiente:
select 
  tm.vch_tipodescripcion tipo,
  sum(m.dec_moviimporte) importe
from tipomovimiento tm join movimiento m
on tm.chr_tipocodigo = m.chr_tipocodigo
group by tm.vch_tipodescripcion
El resultado es el siguiente:
getColumnName()        getColumnLabel()
vch_tipodescripcion    tipo
importe                importe
De los resultados obtenidos se puede concluir que ambos metodos arrojan los mismos resultados, por lo tanto, se puede utilizar cualquiera de los dos.
CLASE UTILITARIA
A continuación tenemos la clase propuesta para pasar un objeto ResultSet a una List<Map<String,?>>.
package pe.egcc.app.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public final class JdbcUtil {

  private JdbcUtil() {
  }

  public static List<Map<String, ?>> rsToList(ResultSet rs) throws SQLException {
    ResultSetMetaData md = rs.getMetaData();
    int columns = md.getColumnCount();
    List<Map<String, ?>> results = new ArrayList<Map<String, ?>>();
    while (rs.next()) {
      Map<String, Object> row = new HashMap<String, Object>();
      for (int i = 1; i <= columns; i++) {
        row.put(md.getColumnLabel(i).toLowerCase(), rs.getObject(i));
      }
      results.add(row);
    }
    return results;
  }

}
A continuación se tiene un ejemplo de como utilizar esta clase:
 
List<Map<String,?>> lista = JdbcUtil.rsToList(rs);
 
Siendo rs un objeto ResultSet.
Puede descargar el proyecto desde el siguiente enlace:
Descargar Proyecto
CÓDIGO FUENTE
En esta sección te presento un video que una aplicación CLIENTE-SERVIDOR desarrollada con Java y Oracle.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.