Pasos para crear una aplicación JAVA
MVC – IBM Rational Application Developer, Hibernate y Spring.
Versión Extendida
Antes de empezar debemos tener claro los paquetes en cada
una de las capas que vamos a utilizar, las cuales se muestran en la imagen
siguiente.
Imagen 1:
Estructura de paquetes
Paso 1:
Primero se
debe crear la clase en el paquete “domain” para este caso utilizaremos la clase
llamada “Ejemplo.java” ver imagen 2.
Una vez creada
la clase incluimos los atributos, para cada uno de los atributos se deben crear
los Getter y Setter, adicionalmente se debe serializar la clase para generar la
persistencia de la misma para serializarla únicamente implementamos la interfaz
Serializable “implements Serializable”
más información en: http://goo.gl/GECuoB
Seguidamente se generan el Hascode() y el Equals(), esto
nos va a permitir comparar dos objetos del mismo tipo para saber si son el mismo,
para obtener más información sobre el mismo pueden ver: http://goo.gl/RZFUdh
El código debe
de quedar de la siguiente manera:
package
cr.go.ice.dmc.peva.domain;
import
java.io.Serializable;
/**
* <p>TODO <<Interface|Clase>>
cr.go.ice.dmc.peva.domain.Ejemplo.java</p>
*
<p>Modulo (subsistema): TODO <<Sistema>></p>
* <p>TODO Descripcion
de <code>Ejemplo.java</code>.</p>
* <p>Fecha creación: 28/02/2014</p>
* <p>Ultima actualización: 28/02/2014</p>
* @author
ICE (Luis Córdoba Fallas)
* @version
1.0
*/
public class Ejemplo implements Serializable{
/** Atributo <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 6309069611092610954L;
private Integer id;
private String nombre;
private String detalle1;
private String detalle2;
/**
* Metodo accesor de id.
* @return Retorna el id.
*/
public Integer getId() {
return id;
}
/**
* Metodo modificador de
id.
* @param id El id a modificar.
*/
public void setId(Integer id) {
this.id = id;
}
/**
* Metodo accesor de nombre.
* @return Retorna el nombre.
*/
public String getNombre()
{
return nombre;
}
/**
* Metodo modificador de nombre.
* @param nombre El nombre a modificar.
*/
public void setNombre(String nombre) {
this.nombre = nombre;
}
/**
* Metodo accesor de
detalle1.
* @return Retorna el detalle1.
*/
public String getDetalle1()
{
return detalle1;
}
/**
* Metodo modificador de
detalle1.
* @param detalle1 El detalle1 a modificar.
*/
public void setDetalle1(String detalle1) {
this.detalle1 = detalle1;
}
/**
* Metodo accesor de
detalle2.
* @return Retorna el detalle2.
*/
public String getDetalle2()
{
return detalle2;
}
/**
* Metodo modificador de
detalle2.
* @param detalle2 El detalle2 a modificar.
*/
public void setDetalle2(String detalle2) {
this.detalle2 = detalle2;
}
/**
* @see
java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
/**
* @see
java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Ejemplo other =
(Ejemplo) obj;
if (id == null) {
if (other.id != null)
return false;
}
else if (!id.equals(other.id))
return false;
return true;
}
}
Paso 2:
Dentro
del mismo paquete creamos el mapeo de Hibernate contra la clase, llamaremos a
este archivo como Ejemplo.hbm.xml, el formato de este archivo debe ser xml ver
imagen 2
Imagen 2:
estructura de paquete domain.
El mapeo XML de Hibernate contiene la confrontación de características
entre la clase creada en el punto anterior contra la tabla respectiva en la
base de datos, cada uno lleva la especificación del tipo de datos y el tamaño,
asi como la dirección del paquete en donde se encuentre la clase, la estructura
XML para este ejemplo debería de quedar como la siguiente.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate
Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cr.go.ice.dmc.peva.domain">
<class name="Ejemplo"
table="Prueba">
<id name="id" column="ID" type="java.lang.Integer"
/>
<property name="nombre" column="NOMBRE"
type="java.lang.String"
length="20" />
<property name="detalle1" column="DETALLE1"
type="java.lang.String"
length="20" />
<property name="detalle2" column="DETALLE2"
type="java.lang.String"
length="20" />
</class>
</hibernate-mapping>
Paso 3:
En
el paquete que finaliza con “.dao” creamos la interfaz de nombre
“EjemploDao.java”, en esta vamos a declarar los métodos que luego utilizaremos
para el acceso a datos. (Ver imagen 3), entendemos esta capa DAO como “Data
Access Objects”.
La estructura de la interfaz debe
quedar similar a la siguiente:
public interface EjemploDao {
public void agregar(Ejemplo ejemplo);
public void modificar(Ejemplo ejemplo);
public void eliminar(Ejemplo ejemplo);
public boolean existe(Ejemplo ejemplo);
public Ejemplo getEjemplo(Ejemplo ejemplo);
public List<Ejemplo>
getEjemplo();
public List<Ejemplo>
getEjemploBuscar(Ejemplo ejemplo);
}
Paso 4:
En
el paquete indicado como “dao.impl” vamos a crear la clase que implementa la
interfaz que creamos en el paso 3, a esta la llamaremos “EjemploDaoImpl.java”
(Ver imagen 3), aquí realizamos la implementación de todo el código Java que
vamos a utilizar para acceder nuestros datos a través de Hibernate, es
importante que al crear la clase debemos indicar que se implemente la interfaz
que creamos en el paso 3.
Imagen 3:
estructura de paquete dao y dao.impl.
Aquí vamos a Extender las
funcionalidades de la clase HibernateDaoSupport agregando la etiqueta “extends HibernateDaoSupport”
a la clase respectiva, luego desarrollamos el código para cada uno de los métodos,
utilizando para ello los metodos que se extiende de la clase “HibernateDaoSupport”,
de igual manera si necesitamos algún estatuto SQL especial aquí debemos
realizarlo mediante HQL, se puede obtener más información en la siguiente dirección:
http://goo.gl/NTSRXd
La implementación de la clase debería
quedar similar a la siguiente.
package
cr.go.ice.dmc.peva.dao.impl;
import
java.util.ArrayList;
import java.util.List;
import
org.springframework.orm.hibernate3.HibernateTemplate;
import
org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import
cr.go.ice.dmc.peva.dao.EjemploDao;
import
cr.go.ice.dmc.peva.domain.Ejemplo;
/**
* <p>TODO <<Interface|Clase>>
cr.go.ice.dmc.peva.dao.impl.EjemploDaoImpl.java</p>
*
<p>Modulo (subsistema): TODO <<Sistema>></p>
* <p>TODO Descripcion
de <code>EjemploDaoImpl.java</code>.</p>
* <p>Fecha creación: 28/02/2014</p>
* <p>Ultima actualización: 28/02/2014</p>
* @author
ICE (Luis Córdoba Fallas)
* @version 1.0
*/
public class EjemploDaoImpl extends HibernateDaoSupport implements EjemploDao {
/**
* @see
cr.go.ice.dmc.peva.dao.EjemploDao#agregar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public void agregar(Ejemplo ejemplo) {
HibernateTemplate ht = this.getHibernateTemplate();
ht.flush();
ht.clear();
ht.save(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.dao.EjemploDao#modificar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public void modificar(Ejemplo ejemplo) {
HibernateTemplate ht = this.getHibernateTemplate();
ht.merge(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.dao.EjemploDao#eliminar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public void eliminar(Ejemplo ejemplo) {
HibernateTemplate ht = this.getHibernateTemplate();
ht.delete(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.dao.EjemploDao#existe(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public boolean existe(Ejemplo ejemplo) {
HibernateTemplate ht = this.getHibernateTemplate();
Ejemplo e = (Ejemplo) ht.get(Ejemplo.class, ejemplo.getId());
if (e==null){
return false;
}else{
return true;
}
}
/**
* @see
cr.go.ice.dmc.peva.dao.EjemploDao#getEjemplo(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public Ejemplo getEjemplo(Ejemplo ejemplo) {
HibernateTemplate ht = this.getHibernateTemplate();
Ejemplo e = (Ejemplo) ht.get(Ejemplo.class, ejemplo.getId());
return e;
}
/**
* @see cr.go.ice.dmc.peva.dao.EjemploDao#getEjemplo()
*/
@SuppressWarnings("unchecked")
@Override
public List<Ejemplo>
getEjemplo() {
HibernateTemplate ht = this.getHibernateTemplate();
String hql = "FROM
Ejemplo e order by e.id ";
return ht.find(hql);
}
/**
* @see
cr.go.ice.dmc.peva.dao.EjemploDao#getEjemploBuscar()
*/
@SuppressWarnings("unchecked")
@Override
public List<Ejemplo>
getEjemploBuscar(Ejemplo ejemplo) {
HibernateTemplate ht = this.getHibernateTemplate();
String hql = "FROM
Ejemplo e WHERE (e.id is not null)";
List<Object> filtros = new ArrayList<Object>();
if(!(ejemplo.getId()==null ||
ejemplo.getId()==0)){
hql +="AND (e.id =
?) ";
filtros.add(ejemplo.getId());
}
if(!(ejemplo.getNombre()==null ||
ejemplo.getNombre().toString().length()==0)){
hql +="AND
(UPPER(e.nombre) LIKE ?) ";
filtros.add("%" + ejemplo.getNombre()+ "%");
}
if(!(ejemplo.getDetalle1() == null || ejemplo.getDetalle1().toString().length()==0)){
hql +="AND
(UPPER(e.detalle1) LIKE ?) ";
filtros.add("%" + ejemplo.getDetalle1()+ "%");
}
hql+="ORDER BY
e.id";
Object[] values = new Object[filtros.size()];
for(int i = 0; i < filtros.size(); i++){
values[i] = filtros.get(i);
}
List<Ejemplo> res= ht.find(hql,values);
return res;
}
}
Paso 5:
Una
vez creada interfaz y clase del acceso a datos, procedemos a crear lo mismo
pero esta vez para el acceso a la lógica de negocio o bo (Business Objects),
primero creamos la interfaz correspondiente en el paquete “.bo” y le damos el
nombre de “EjemploBo.java”. (Ver imagen 4)
Esta interface debe quedar
similar (Si asi se quiere) a la que implementamos en el paquete “.dao”
public interface EjemploBo {
public void agregar(Ejemplo ejemplo);
public void modificar(Ejemplo ejemplo);
public void eliminar(Ejemplo ejemplo);
public boolean existe(Ejemplo ejemplo);
public Ejemplo getEjemplo(Ejemplo ejemplo);
public List<Ejemplo>
getEjemplo();
public List<Ejemplo>
getEjemploBuscar(Ejemplo ejemplo);
}
Paso 6:
Cuando
tenemos la interfaz lista con todos los métodos que vamos a utilizar para
acceder la capa de datos, creamos la clase, está la vamos a crear en el paquete
“bo.impl” con el nombre “EjemploBoImpl.java” (ver imagen 4)
Imagen 4:
estructura de paquete bo y bo.impl.
La clase implementaría la interfaz creada en el paso 5, aquí
vamos a declarar una variable de tipo “EjemploDao” con la finalidad de acceder
mediante esta la capa de datos, y con ella llamar o utilizar a los métodos
implementados, la clase debe quedar de la siguiente manera.
package
cr.go.ice.dmc.peva.bo.impl;
import
java.util.List;
import
cr.go.ice.dmc.peva.bo.EjemploBo;
import
cr.go.ice.dmc.peva.dao.EjemploDao;
import
cr.go.ice.dmc.peva.domain.Ejemplo;
/**
* <p>TODO <<Interface|Clase>>
cr.go.ice.dmc.peva.bo.impl.EjemploBoImpl.java</p>
*
<p>Modulo (subsistema): TODO <<Sistema>></p>
* <p>TODO Descripcion
de <code>EjemploBoImpl.java</code>.</p>
* <p>Fecha creación: 28/02/2014</p>
* <p>Ultima actualización: 28/02/2014</p>
* @author
ICE (Luis Córdoba Fallas)
* @version
1.0
*/
public class EjemploBoImpl implements EjemploBo {
private EjemploDao ejemploDao;
/**
* Metodo modificador de
ejemploDao.
* @param ejemploDao El ejemploDao a modificar.
*/
public void setEjemploDao(EjemploDao ejemploDao) {
this.ejemploDao = ejemploDao;
}
/**
* @see
cr.go.ice.dmc.peva.bo.EjemploBo#agregar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public void agregar(Ejemplo ejemplo) {
this.ejemploDao.agregar(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.bo.EjemploBo#modificar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public void modificar(Ejemplo ejemplo) {
this.ejemploDao.modificar(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.bo.EjemploBo#eliminar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public void eliminar(Ejemplo ejemplo) {
this.ejemploDao.eliminar(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.bo.EjemploBo#existe(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public boolean existe(Ejemplo ejemplo) {
return this.ejemploDao.existe(ejemplo);
}
/**
* @see
cr.go.ice.dmc.peva.bo.EjemploBo#getEjemplo(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public Ejemplo getEjemplo(Ejemplo ejemplo) {
return this.ejemploDao.getEjemplo(ejemplo);
}
/**
* @see cr.go.ice.dmc.peva.bo.EjemploBo#getEjemplo()
*/
@Override
public List<Ejemplo>
getEjemplo() {
return this.ejemploDao.getEjemplo();
}
/**
* @see
cr.go.ice.dmc.peva.bo.EjemploBo#getEjemploBuscar(cr.go.ice.dmc.peva.domain.Ejemplo)
*/
@Override
public List<Ejemplo>
getEjemploBuscar(Ejemplo ejemplo) {
return this.getEjemploBuscar(ejemplo);
}
}
Paso 7:
En la carpeta
WEB-INF vamos a encontrar los archivos de configuración, ahí vamos a registrar
el Bean que vamos a utilizar en el controlador de eventos o “Controller”, esto
lo vamos a hacer de la siguiente manera:
<bean id="ejemploBo" parent="pevaTP">
<property name="target">
<bean class="cr.go.ice.dmc.peva.bo.impl.EjemploBoImpl">
<property name="ejemploDao" ref="ejemploDao"
/>
</bean>
</property>
</bean>
Paso 8:
Dentro del
archivo “dataAccessContext.xml” buscamos la sección donde se encuentra al
sesión Factory, ahí vamos a incluir dentro de “mappingResources” la ubicación
de la dirección del archivo “Ejemplo.hbm.xml” que creamos anteriormente en el
paquete domain. (ver imagen 5)
Adicionalmente
se debe agregar la dirección de la implementación del acceso a datos tal y como
se muestra en la imagen 5.
Imagen 4:
estructura de paquete bo y bo.impl.
Una vez realizados estos pasos
podemos intentar validar nuestro proyecto o bien intentar publicarlo para
verificar que los pasos anteriormente descritos estén bien.
Ing. Luis Córdoba Fallas







- Seguirme en Twitter!
- "Seguirme en Facebook!
- RSS
Contact