domingo, 9 de diciembre de 2012

configurar hibernate usando archivo properties y hibernate.cfg.xml

el archivo hibernate.cfg.xml establece los parametros de conexion a la base de datos y las classes que se nescesitan mapear, pero si este archivo se encuentra dentro de nuestra aplicacion y la queremos distribuir en forma de jar, hay un problema, el usuario tendria que tener instalada su base de datos con el usuario y contraseña que nosotros hubieramos establecido en el codigo. de otro modo tendria que compilarse la aplicacion para cada persona que le demos el programa, cada vez con usuario y contraseña distintos.

una solucion es usar un archivo con extension .properties, donde se establecen los parametros de conexion dejando en el hibernate.cfg.xml solo el mapeo de clases.

el archivo .properties debera contener por ejemplo lo siguiente*

hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect


*http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html

el hibernate.cfg.xml queda solo con (por ejemplo)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.show_sql">true</property>
    <mapping class="dto.Grupo" ></mapping>
    <mapping class="dto.Contacto" ></mapping>
    <mapping class="dto.ContactoGrupo" ></mapping>
    <mapping class="dto.Usuario" ></mapping>
  </session-factory>
</hibernate-configuration>


y en nuestro codigo java

try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("miarchivo.properties"));
            Configuration cfg = new AnnotationConfiguration().configure(); //esta linea lee a hibernate.cfg.xml
           
            cfg.addProperties(properties); //esta otra lee el properties
            sessionFactory = cfg.buildSessionFactory();
           
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }

 tambien puede dejarse el archivo hibernate.cfg.xml fuera de la aplicacion pero el usuario veria informacion que no le interesa como el mapeo de classes (pero no deja de ser otra opcion)

domingo, 9 de septiembre de 2012

Stack java (pila)

la clase Stack de java.utils ofrece una estructura de datos tipo pila con, con el metodo peek se accede a su tope y con pop() se elmina el tope


    public static void main(String[] args) {
       
        Stack pila = new Stack();
       
        System.out.println(pila.isEmpty());
        pila.add("luisa");
        pila.add("pepe");
        pila.add("toño");
        pila.add("mario");
       
        System.out.println("tope de pila:"+pila.peek());
        System.out.println("eliminando :"+pila.pop());
        System.out.println("tope de pila:"+pila.peek());
       
    }

resultado de la ejecucion


run:
true
tope de pila:mario
eliminando :mario
tope de pila:toño

Hashtable java


la clase Hastable crea una estructura de clave - valor, el siguiente metodo crea una hashtable con claves int y valores String

1 -> pepe
2 -> luis
3 -> maria

public static void main(String[] args) {
     
        Hashtable hashTable= new Hashtable();
     
        hashTable.put(1, "juan");
        System.out.println("valor de la clave 1:"+hashTable.get(1));
        hashTable.put(1, "pepe");
        System.out.println("remplazando el valor de la clave 1:"+hashTable.get(1));
        hashTable.put(999, "luis");
        hashTable.put(7, "maria");
        System.out.println("¿contiene clave  7?:"+hashTable.containsKey(7));
        System.out.println("eliminando");
        hashTable.remove(999);
        System.out.println(hashTable.get(999));
     
    }

el resultado de la ejecucion


run:
valor de la clave 1:juan
remplazando el valor de la clave 1:pepe
¿contiene clave  7?:true
eliminando
null

Listas con java


public static void main(String[] args) {
       
        List<String> listaNombres = new ArrayList<String>();
        listaNombres.add("juan");
        listaNombres.add("pepe");
        listaNombres.add("maria");
        System.out.println("tamaño:"+listaNombres.size());
        System.out.println("tercer elemento:"+listaNombres.get(2));
        System.out.println("Eliminando elemento <maria>");
        listaNombres.remove("maria");
        System.out.println("tamaño:"+listaNombres.size());
       
       
        System.out.println("todos");
        for(String nombre:listaNombres){
            System.out.println(nombre);
        }
       
    }


resultado en consola


tamaño:3
tercer elemento:maria
Eliminando elemento <maria>
tamaño:2
todos
juan
pepe

Expresiones regulares, validacion con java regex

java tiene una api para la validacion de expresiones regulares, el siguiente metodo valida que la string sea un mail de gmail.com


    public static boolean isCorreoGmail(String correo) {
         
        Pattern pat =Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@gmail.com)$");
        Matcher mat =pat.matcher(correo);
        if (mat.find()) {
            System.out.println("[" + mat.group() + "]");
            return true;
        }
        return false;
    }

ConstructDescription
[abc]a, b, or c (simple class)
[^abc]Any character except a, b, or c (negation)
[a-zA-Z]a through z, or A through Z, inclusive (range)
[a-d[m-p]]a through d, or m through p: [a-dm-p] (union)
[a-z&&[def]]d, e, or f (intersection)
[a-z&&[^bc]]a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]]a through z, and not m through p: [a-lq-z] (subtraction)


ConstructDescription
.Any character (may or may not match line terminators)
\dA digit: [0-9]
\DA non-digit: [^0-9]
\sA whitespace character: [ \t\n\x0B\f\r]
\SA non-whitespace character: [^\s]
\wA word character: [a-zA-Z_0-9]
\WA non-word character: [^\w]

GreedyReluctantPossessiveMeaning
X?X??X?+X, once or not at all
X*X*?X*+X, zero or more times
X+X+?X++X, one or more times
X{n}X{n}?X{n}+X, exactly n times
X{n,}X{n,}?X{n,}+X, at least n times
X{n,m}X{n,m}?X{n,m}+X, at least n but not more than m times


Boundary ConstructDescription
^The beginning of a line
$The end of a line
\bA word boundary
\BA non-word boundary
\AThe beginning of the input
\GThe end of the previous match
\ZThe end of the input but for the final terminator, if any
\zThe end of the input


javadoc con annotations


En netbeans y otros IDE puede ponersele una explicacion a los metodos y clases para algun otro usuario que valla a utilizar nuestro codigo

/**
     * La explicacion que se ponga en este espacio es la que
     * aparece con ctr - space en netbeans
     * se debe poner una etiqueta param para cada parametro que reciba
     * @param dia true es para dia y false para noche
     * @param ingles true es para ingles y false para español
     * @return un saludo en español o ingles, para el dia o para la noche
     */
    public String getSaludo(boolean dia, boolean ingles){
        if(dia && ingles){
            return "good days";
        }else if(dia && !ingles){
            return "buenos dias";
        }else if(!dia && ingles){
            return "good nights";
        }else{
            return "buenas noches";
        }
    }
 
    public void test(){
        String saludo=getSaludo(true, false);
        System.out.println(saludo);
    }


leer archivo con java


JFileChooser chooser= new JFileChooser();
        chooser.setDialogTitle("seleccione un block de notas");
        chooser.setMultiSelectionEnabled(false);
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int sel = chooser.showOpenDialog(this);
        if (sel == JFileChooser.APPROVE_OPTION){
            File selectedFile = chooser.getSelectedFile();
            String cadena="";
            try {
                FileInputStream fis = new FileInputStream(selectedFile);
                int ch;
                while((ch= fis.read()) != -1){
                   cadena=cadena+ (char)ch;
                }
            } catch (Exception ex) {
                System.out.println("error en la lectura del archivo");
            }
            this.jTextField1.setText(cadena);
       
        }