Integrar java con sql

Iniciado por Xedrox, 19 Diciembre 2010, 01:51 AM

0 Miembros y 1 Visitante están viendo este tema.

Xedrox

Hola, la verdad es que parece medio raro el tema pero la cosa es asi, estoy haciendo  un programa Java que deberia trabajar con una sola tabla de una base de datos sql, ademas este programa trabaja desde una sola pc, no va ser usado en otras. Hay alguna forma de no tener que poner a funcionar el servidor sql por una sola tabla ? Desde ya gracias y saludos.

sapito169

#1
el asunto no es raro es muy comun solo que a muchos no le interesa o les da igual
aqui una propuesta de solucion no todos lo hacen igual y muchos tienes diferentes opiniones

fijate en el detalle que si quiero cambiar de base de datos en mememoria por una base de datos real tendrias que reemplasar AccesoADatosEnMemoriaProducto() cualquier clase que implemente AccesoADatosProducto

public class Main {
public static void main(String arg[]) {
AccesoADatosProducto accesoADatosProducto = new AccesoADatosEnMemoriaProducto();
accesoADatosProducto
.agregarProducto(new Producto(1, "computadora", 10));
accesoADatosProducto.agregarProducto(new Producto(2, "telivisor", 20));
accesoADatosProducto.agregarProducto(new Producto(3, "monitor", 30));

for (Producto producto : accesoADatosProducto.listarProducots()) {
System.out.println(producto);
}
}
}





import java.util.List;




[code]
import java.util.List;

public interface AccesoADatosProducto {

public abstract void agregarProducto(Producto Producto);

public abstract void eliminarProducto(int codigo);

public abstract void modificarProducto(int codigo, Producto nuevoProducto);

public abstract Producto obtenProducto(int codigo);

public abstract List<Producto> listarProducots();

}



import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;

public class AccesoADatosEnMemoriaProducto implements AccesoADatosProducto {

private Hashtable<Integer, Producto> productos = new Hashtable<Integer, Producto>();

@Override
public void agregarProducto(Producto producto) {
productos.put(producto.getCodigo(), producto);
}

@Override
public void eliminarProducto(int codigo) {
productos.remove(codigo);
}

@Override
public void modificarProducto(int codigo, Producto nuevoProducto) {
if (productos.containsKey(codigo)) {
throw new RuntimeException("bruto no se puedo ingresar el producto"
+ nuevoProducto
+ "devido a que no existe un producto con el mismo codigo");
}
productos.put(codigo, nuevoProducto);
}

@Override
public Producto obtenProducto(int codigo) {
return productos.get(codigo);
}

@Override
public List<Producto> listarProducots() {
List<Producto> list = new ArrayList<Producto>();
Enumeration<Producto> enumproduct = productos.elements();
while (enumproduct.hasMoreElements()) {
Producto producto = (Producto) enumproduct.nextElement();
list.add(producto);
}
return list;
}

}



public class MySqlAccesoADatosProducto implements AccesoADatosProducto {

@Override
public void agregarProducto(Producto Producto) {

}

@Override
public void eliminarProducto(int codigo) {

}

@Override
public void modificarProducto(int codigo, Producto nuevoProducto) {

}

@Override
public List<Producto> listarProducots() {

return null;
}

@Override
public Producto obtenProducto(int codigo) {

return null;
}

}



public class Producto {
private int codigo;
private String nombre;
private double precio;

public Producto(int codigo, String nombre, double precio) {
this.codigo = codigo;
this.nombre = nombre;
this.precio = precio;

}

public int getCodigo() {
return codigo;
}

public void setCodigo(int codigo) {
this.codigo = codigo;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public double getPrecio() {
return precio;
}

public void setPrecio(double precio) {
this.precio = precio;
}

@Override
public String toString() {

return codigo + " " + nombre + " " + precio;
}

}



felizmente te diste cuenta a tiempo eso se puede hacer de muchas maneras solo es cuestión de jugar con las interfases y clases abstractas las soluciones mas comunes y que se la saben todo el mundo se llaman patrones de diseño

el patron de diseño para para cambiar la fuente de datos por cualquiera se llama dao es usado en combinacion de otros patrones como el factory(algunos les gusta abstracfactory) y el singleton
[/code]

Xedrox

Hola sapito, ahora tengo poco tiempo para leerlo, gracias por la respuesta, cuando lo lea te hago la devolucion ;) . saludos

Xedrox

Hola sapito, ya lo lei y hasta me tuve que hacer un pequeño diagrama de clases para entenderlo jeje, pero si yo quisiera rescatar suponete un lote de datos de Productos de la siguiente consulta "SELECT * FROM Productos ORDER BY nombre" como harias?

sapito169

#4
huu que bonito con los copos de nieve
;-)

aqui una posible solcion
en la interfase AccesoADatosProducto

agregale un metodo para que liste productos con parametro tipo enum

listarProducots(PROPIEDADPRODUCTO ordenado)

y luego ese metodo tendria que estar implementado en todas sus clases concretas que sean hijas de la interfas
asi podrias hacer cosas como

for (Producto producto : accesoADatosProducto.listarProducotsOrdenadosPor(PROPIEDADPRODUCTO.NOMBRE)) {
System.out.println(producto);
}


aserca de como ordenar una lista usa cualquier metodo de ordenamiento burbuja quiksort etc

Xedrox

Cita de: sapito169 en 26 Diciembre 2010, 23:39 PM
huu que bonito con los copos de nieve
;-)

aqui una posible solcion
en la interfase AccesoADatosProducto

agregale un metodo para que liste productos con parametro tipo enum

listarProducots(PROPIEDADPRODUCTO ordenado)

y luego ese metodo tendria que estar implementado en todas sus clases concretas que sean hijas de la interfas
asi podrias hacer cosas como

for (Producto producto : accesoADatosProducto.listarProducotsOrdenadosPor(PROPIEDADPRODUCTO.NOMBRE)) {
System.out.println(producto);
}


aserca de como ordenar una lista usa cualquier metodo de ordenamiento burbuja quiksort etc


Pero el ordenamiento de listas (por lo menos para el ArrayList) solo es aplicable para objetos de clases "wrapers", suponete que quiero imprimir el ArrayList ordenado por el codigo de producto, como harias ? Se me ocurre una forma pero es muy poco eficiente, consiste en copiar en un arraylist solo el codigo, ordenarlo y luego releer por cada codigo la lista original e ir imprimiendo.

sapito169

falta un poco de creatividad y adapatacion
en todos los metodos de ordenamiento siempre tienen que hacer una conparacion dentro de un if solo es cuestion de adaptarlo a nuestras necesisdades
olvidate de las ideas fijas busca soluciones y modifica y adapta lo que ya sabes cuando me dicen cosas como esa es lo mismo que digas que no sabes cuanto es 1 mansana mas otra mansana por que te enseñaron a sumar con peras  :xD

bueno en este momento no tengo compilador asi que no puedo mandarte codigo pero tambien te digo que la clase Collections tiene un metodo que ordena listas de objetos
seria bueno que te leeas un poco de como se trabaja del api de colectiones de java y que le des una ojeada a la documentacion

import java.util.*;
public class EmpSort {
    static final Comparator<Employee> SENIORITY_ORDER =
                                 new Comparator<Employee>() {
        public int compare(Employee e1, Employee e2) {
            return e2.hireDate().compareTo(e1.hireDate());
        }
    };

    // Employee database
    static final Collection<Employee> employees = ... ;

    public static void main(String[] args) {
        List<Employee>e = new ArrayList<Employee>(employees);
        Collections.sort(e, SENIORITY_ORDER);
        System.out.println(e);
    }
}


http://download.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html
http://download.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html
http://download.oracle.com/javase/tutorial/collections/interfaces/order.html