En algún momento del desarrollo de un software es necesario mostrar ciertos reportes en forma gráfica, por ejemplo, en un gráfico tipo barra, o tipo pastel.
JFreeChart es un librería para Java que permite crear diversos tipos de gráficos, tiene también componentes que permiten mostrarlos o quizás exportarlos a un archivo.
jcommon-1.0.18.jar -> Librería de la cual depende JFreeChart
iText-2.1.5.jar -> Librería necesaria si queremos incluir el gráfico en un archivo PDF
GRÁFICO TIPO PASTEL
Mostrando el gráfico en un ChartFrame
// Definiendo la fuente de datos
DefaultPieDataset data = new DefaultPieDataset();
data.setValue("Artículo 1", 40.55);
data.setValue("Artículo 2", 81.23);
data.setValue("Artículo 3", 61.54);
// Creando el gráfico
JFreeChart chart = ChartFactory.createPieChart(
"Ejemplo de Gráfico Tipo Pastel", // Título del gráfico
data, // DataSet
true, // Leyenda
true, // ToolTips
true);
// Mostrando el gráfico
ChartFrame frame = new ChartFrame("JFreeChart", chart);
frame.pack();
frame.setVisible(true);
Dibujando el gráfico en un jPanel
// Definiendo la fuente de datos
DefaultPieDataset data = new DefaultPieDataset();
data.setValue("Artículo 1", 40.55);
data.setValue("Artículo 2", 81.23);
data.setValue("Artículo 3", 61.54);
// Creando el gráfico
JFreeChart chart = ChartFactory.createPieChart(
"Ejemplo de Gráfico Tipo Pastel", // Título del gráfico
data, // DataSet
true, // Leyenda
true, // ToolTips
true);
// Dibujando el gráfico en un jPanel
BufferedImage imagen = chart.createBufferedImage(jPanel1.getWidth() - 2,jPanel1.getHeight() - 2);
this.jPanel1.getGraphics().drawImage(imagen,1,1,null);
Mostrar el gráfico en un jPanel
// Definiendo la fuente de datos
DefaultPieDataset data = new DefaultPieDataset();
data.setValue("Artículo 1", 40.55);
data.setValue("Artículo 2", 81.23);
data.setValue("Artículo 3", 61.54);
// Creando el gráfico
JFreeChart chart = ChartFactory.createPieChart(
"Ejemplo de Gráfico Tipo Pastel", // Título del gráfico
data, // DataSet
true, // Leyenda
true, // ToolTips
true);
// Mostrando el gráfico en un jPanel
this.jPanel1.removeAll();
this.jPanel1.setLayout(new java.awt.BorderLayout());
this.jPanel1.add(new ChartPanel(chart));
this.jPanel1.validate();
Mostrando el gráfico en un archivo PDF
// Definiendo la fuente de datos
DefaultPieDataset data = new DefaultPieDataset();
data.setValue("Artículo 1", 40.55);
data.setValue("Artículo 2", 81.23);
data.setValue("Artículo 3", 61.54);
// Creando el gráfico
JFreeChart chart = ChartFactory.createPieChart(
"Ejemplo de Gráfico Tipo Pastel", // Título del gráfico
data, // DataSet
true, // Leyenda
true, // ToolTips
true);
// Mostrar el gráfico en un archivo PDF
try {
Document doc = new Document();
PdfWriter.getInstance(doc, new FileOutputStream("D:\\doc.pdf"));
doc.open();
BufferedImage bufferedImage = chart.createBufferedImage(500, 300);
Image image = Image.getInstance(bufferedImage, null);
doc.add(image);
doc.close();
JOptionPane.showMessageDialog(rootPane, "Ok.");
} catch (Exception e) {
e.printStackTrace();
}
CÓDIGO 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.
Es un modelo basado en la cooperación e interacción de dos partes conocidas como servidor o back-end y cliente o front-end.
Aplicación Servidor
Es la aplicación que provee servicios, es la aplicación que provee los servicios; por ejemplo, los servidores de base de datos ofrecen servicios de persistencia de datos, podríamos mencionar a SQL Server, Oracle, MySQL, etc,
Aplicación Cliente
Es la aplicación que hace uso o consume los servicios de la Aplicación Servidor; por ejemplo, las aplicaciones comerciales como los sistemas de ventas y compras necesitan que sus datos persistan en el tiempo, para lo cual se recurren a los servidores de base de datos que ofrecen estos servicios.
Arquitectura Cliente-Servidor
El cliente se encuentra del lado del usuario y se define como un proceso consumidor de servicios, mientras que el servidor provee los servicios requeridos y se encuentra de manera remota al usuario y es transparente al cliente.
Los clientes deben estar en la red de la empresa, estas pueden ser redes locales, pero también es posible tener clientes remotos a través por ejemplo de una red VPN.
El API JDBC: Implementaciones
API JDBC
Esta API está compuesta por un conjunto de clases e interfaces que estandarizan el acceso a las bases de datos. Gracias a la utilización de JDBC, un programa Java puede acceder a cualquier base de datos sin necesidad de modificar la aplicación. Sin embargo, para que esto sea posible es necesario que el fabricante ofrezca un driver que cumpla la especificación JDBC.
Tipos de Driver
Tenemos cuatro tipos de driver:
Tipo 1: JDBC-ODBC bridge driver
Tipo 2: Native API/Partly Java Driver
Tipo 3: Pure Java Driver
Tipo 4: Native Protocol Java Driver
Tipo 1: JDBC-ODBC bridge driver
Permite utilizar drivers ODBC, su desventaja es que se debe instalar el driver ODBC en cada cliente.
Tipo 2: Native API/Partly Java Driver
Requiere que se instalen las librerías nativas en cada cliente.
Tipo 3: Pure Java Driver
Este tipo de driver traduce llamadas JDBC en un protocolo de red independiente del DBMS y luego, a un protocolo de DBMS.
Un Servidor JDBC, realiza la tarea de middleware, siendo capaz de conectar un cliente Java a diferentes bases de datos.
Tipo 4: Native Protocol Java Driver
El driver tipo 4 convierte llamadas JDBC directamente en el protocolo de red usado por el DBMS. Esto permite llamadas directas desde la máquina del cliente al servidor del DBMS, es una solución muy práctica y la más utilizada.
El API JDBC: Componentes Principales
Objeto: Connection
Establece la conexión con la base de datos y maneja las transacciones.
Objeto: Statement
Se utiliza para ejecutar sentencias sin parámetros.
Objeto: PreparedStatement
Se utiliza para ejecutar sentencias con parámetros.
Objeto: CallableStatement
Se utiliza para ejecutar procedimientos almacenados.
Objeto ResultSet
Se utiliza para procesar resultados.
Estrategias para programar transacciones
Controladas desde el cliente
En este caso desde la aplicación java programamos el inicio y fin de la transacción.
Controladas en la base de datos
En este caso programamos la transacción en el procedimiento almacenado.
El patrón DAO
Desarrollo Clásico
En el objeto de negocio se programa la lógica de negocio y la lógica de persistencia, haciendo difícil su mantenimiento.
Patrón DAO – División en Capas
El patrón DAO permite dividir en capas separadas la lógica de negocio y la lógica de persistencia.
Patrón DAO – Estructura
La capa de negocio hace uso de la capa de persistencia, y para que se comuniquen los datos se utilizan objetos Transfer Object (TO), también denominados Data Transfer Object (DTO).
Por ejemplo, si se consulta los datos de un cliente, el objeto DAO devolverá un objeto TO con los datos del cliente.
Si se consulta los artículos de una categoría, el objeto DAO devolverá una colección de objetos TO de tipo Artículo.
Patrón DAO – Diagrama se secuencia
En el diagrama de secuencia se puede apreciar la responsabilidad de cada capa, la capa Data Source puede ser un motor de base de datos, como por ejemplo Oracle, MySQL o SQL Server.
PARTE II - DOMINANDO AL MONSTRUO
Modelo de Datos
Creación del Esquema de Datos
El siguiente video ilustra la creación del esquema VENTAS.
Conexión con la Fuente de Datos
public class AccesoDB {
private AccesoDB() {
}
public static Connection getConnection() throws SQLException{
Connection cn = null;
try {
// --------------------------------------------------
// Paso 1: Cargar el driver a memoria
Class.forName("oracle.jdbc.OracleDriver").newInstance();
// Paso 2: Obtener el objeto Connection
String url = "jdbc:oracle:thin:@localhost:1521:XE";
cn = DriverManager.getConnection(url, "ventas", "admin");
// --------------------------------------------------
} catch (SQLException e) {
throw e;
} catch(ClassNotFoundException e){
throw new SQLException("No se encontró el driver de la base de datos.");
} catch(Exception e){
throw new SQLException("No se puede establecer la conexión con la base de datos.");
}
return cn;
}
}
Implementación de un CRUD
Para la demostración se implementa el CRUD para la tabla PRODUCTO.
Interfaz
public interface ProductoDao {
/**
* Transacción controlada desde el cliente
*
* @param prod
*/
void create1(Producto prod);
/*
* Transacción controlada en la Base de Datos
*/
void create2(Producto prod);
List readAll();
Producto readForId(int id);
List readForName(String name);
void update(Producto prod);
void delete(int id);
}
Muchas veces tenemos la necesidad de presentar reportes con datos estadísticos simples, como por ejemplo con respecto al resultado de una evaluación:
Cuantos alumnos tomaron la evaluación
La nota mayor.
La nota menor.
La nota promedio.
La cantidad de aprobados
Estos cálculos se pueden ampliar a todas las evaluaciones de un curso, o tal vez aplicarlos a todas las evaluaciones de todos los cursos.
También se puede aplicar a otros campos, por ejemplo una tienda por departamentos podría necesitar información estadística sobre las preferencias de sus clientes para aplicar un marketing personalizado, el área de compras necesita cierta información para poder negociar con los proveedores, y así podemos encontrar muchos casos en los que se necesita información estadística para tomar mejores decisiones.
Para obtener esta información directamente de la base de datos debemos aplicar funciones agregadas y agrupamiento de datos en la sentencia SELECT.
Tabla de Muestra
Para los ejemplos utilizaremos la siguiente tabla:
TABLA: NOTAS
Curso
Alumno
Practica
Nota
Java
Pedro
P1
16
Java
Karla
P1
12
Java
Doris
P1
13
Oracle
Manuel
P1
15
Oracle
Pedro
P1
18
Oracle
Karla
P1
10
Oracle
Doris
P1
13
Java
Manuel
P2
14
Java
Pedro
P2
17
Java
Karla
P2
15
Java
Doris
P2
16
Funciones Agregadas
Las funciones agregadas permiten realizar cálculos estadístico, se aplican sobre las columnas de una tabla o expresiones a través de todas las filas de una tabla.
Las más utilizadas son:
COUNT: Contar filas o valores no nulos.
MAX: Obtener el valor máximo de una columna.
MIN: Obtener el valor mínimo de una columna.
SUM: Obtener la suma de los valores de una columna, no considera los nulos.
AVG: Obtener el promedio de los valores de una columna, no considera los nulos
Ejemplo 1
Cuantos alumnos han rendido la práctica 1 de Java.
select COUNT(Alumno) Alumnos
from dbo.NOTAS
where Curso = 'Java' and Practica = 'P1';
GO
El resultado es el siguiente:
Alumnos
-----------
3
Ejemplo 2
Cuantos alumnos han aprobado la práctica 1 de Oracle.
select COUNT(Alumno) Alumnos
from dbo.NOTAS
where Curso = 'Oracle'
and Practica = 'P1'
and nota >= 12;
GO
El resultado es el siguiente:
Alumnos
-----------
3
GROUP BY
La cláusula GROUP BY permite agrupar datos y obtener datos estadísticos de cada grupo.
Cada grupo se resume en una sola fila.
Ejemplo 3
Obtener la cantidad de alumnos de cada curso.
select Curso, COUNT(distinct Alumno) Alumnos
from dbo.NOTAS
group by Curso;
GO
La cláusula DISTINCT se utiliza para que no cuente los valores duplicados. El resultado es el siguiente:
La cláusula HAVING se utiliza para hacer filtro de grupos, por ejemplo, se necesita saber quiénes son los alumnos con promedio mayor o igual a 18, o tal vez, se necesita saber el cliente que más consume con tarjeta VISA.
Ejemplo 5
Que alumnos han rendido solo dos prácticas.
select Alumno, COUNT(Practica) Practicas
from dbo.NOTAS
group by Alumno
having COUNT(Practica) = 2;
GO
Las funciones que se utilicen en la cláusula SELECT son las que debemos utilizar en la cláusula HAVING. El resultado es el siguiente:
Alumno Practicas
--------------- -----------
Manuel 2
Video
A continuación tienes un video tutorial donde te explico todos estos temas.
CÓDIGO 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.
Java Web: Problemas con el puerto 8080 - GUSTAVO CORONEL
PROBLEMA
El puerto 8080 lo utilizan por defecto los servidores JEE como GlassFish, Tomcat y JBoss para las aplicaciones Web.
Normalmente no deberíamos tener ningún problema si utilizamos uno de estos contenedores y trabajamos con MySQL (Puerto 3306) y SQL Server (Puerto 1433).
El problema se presenta en las siguientes situaciones:
Si queremos utilizar dos servidores JEE al mismo tiempo en la misma máquina.
Si queremos utilizar Oracle XE.
SOLUCIÓN
La solución está en configurar cada uno de estos servidores Java EE con un puerto diferente, en algunos casos se puede optar por cambiar el puerto de Oracle XE.