Ejercicio de java.Clase de datos

En las lineas siguientes, construirémos la clase de datos, que es la que contiene la información de un registro de la tabla, y los comportamientos necesarios para leer, borrar y grabar los datos.

Manipulación de datos

La clase que ha de mapear la tabla, necesita atributos para cada columna de la tabla:

        private int idLibro;
	private String titulo;
	private String genero;
	private String autor;
	private Double precio;

que definiremos privados, para aislarlos de cualquier interrelación con el exterior. Para su lectura y llenado, proveeremos de los correspondientes métodos getter y setters:

	public int getIdLibro() {
		return idLibro;
	}
	public void setIdLibro(int idLibro) {
		this.idLibro = idLibro;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getGenero() {
		return genero;
	}
	public void setGenero(String genero) {
		this.genero = genero;
	}
	public String getAutor() {
		return autor;
	}
	public void setAutor(String autor) {
		this.autor = autor;
	}
	public Double getPrecio() {
		return precio;
	}
	public void setPrecio(Double precio) {
		this.precio = precio;
	}

Estos métodos, sobre todo los de carga, deberían incorporar instrucciones para filtrar los dato (longitud de string, valores numéricos,….)

Constructores

Crearemos dos constructores, uno que se limita a dejar creado el objeto, y otro que espera que se le pase un idLibro, y ya devuelve el objeto cargado:

        Libros(){
	}
	Libros(int numero){
		leerRegistro(numero);
	}

En el segundo constructor, hemos utilizado un método que deberemos crear, y que es el mismo que utilizaremos cuando se desee cargar un registro.

Lectura de registros

	public void leerRegistro(int numero){
		ResultSet rs;
		miConexion = Conexion.getConexion();
		error=false;
		try {
			sql=miConexion.createStatement();
			rs=sql.executeQuery("SELECT * FROM Libros WHERE idLibro="+numero);
			if (rs.next()){
				carga(rs);
			} else
				error=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Si analizámos el método, vemos que lo primero que hace es obtener una conexión, utilizando un método estático de la  clase Conexion descrita anteriormente, a continuación, lanza una query para obtener el registro solicitado, y si lo encuentra (rs.next()=true), lo carga en cada una de las variables utilizando este método

	private void carga(ResultSet rs){
		try {
			idLibro=rs.getInt("idLibro");
			titulo=rs.getString("Titulo");
			autor=rs.getString("Autor");
			precio=rs.getDouble("Precio");
			genero=rs.getString("Genero");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

y retorna true.

 Grabación de registros

En este método, debemos preparar la orden de insert.

	public void grabarRegistro(){
		String sentencia;
		sentencia="INSERT INTO Libros"+
				"(Titulo,Autor,Genero,Precio) " +
				" VALUES ("+
				"'"+titulo+"',"+
				"'"+autor+"',"+
				"'"+genero+"',"+
				precio+
				")";
		System.out.println(sentencia);
		try {
			miConexion = Conexion.getConexion();
			sql=miConexion.createStatement();
			sql.executeUpdate(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Lo hacemos obteniendo los datos de lo que contenga la instancia en la que trabajamos, eso implica que la clase llamadora, deberá previamente cargar los datos en cada atributo.

Borrar registro

El método para borrrar registro, espera recibir el idLibro, obtiene un objeto conexión, y lanza una query para borrarlo.

	public void borrarRegistro(int numero){
		miConexion = Conexion.getConexion();
		String sentencia="DELETE FROM Libros WHERE idLibro="+numero;
		error=false;
		try {
			sql=miConexion.createStatement();
			sql.executeUpdate(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

sencillo, ¿no?

Método toString

Pensado especialmente para las pruebas, implementamos un método toString:

	public String toString(){
		return  "IdLibro:"+idLibro+
				"\tTitulo:"+titulo+
				"\tAutor:"+autor;

	}

en el que retornamos una String con los literales y contenidos de idLibro, Titulo, y Autor, separados por marcas de tabulación.

Listado de registro

Si queremos soportar los listados, deberemos preveer un método para seleccionar los registros, y podría ser éste:

	public boolean listarRegistro(){
		return listarRegistro("");
	}
public boolean listarRegistro(String where){
		miConexion = Conexion.getConexion();
		eof=false;
		String sentencia="SELECT * FROM Libros ";
		if (where.length()>0){
			sentencia+=" WHERE "+where;
		}
		try {
			sql=miConexion.createStatement();
			rs=sql.executeQuery(sentencia);
			if (rs.next()){
				carga(rs);
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}

Hemos previsto sobrecargar el método para que pueda ser llamado con y sin claúsula where, en este último caso, seleccionaríamos todos los registros.

Estos métodos cargan el resulset con los registros seleccionados, y dejan los datos del primero cargados en los atributos.

Para que la clase que llama, pueda recorrer la lista, deberemos también, preveer el recubrimiento de next(), last(), previous() y first().

	public boolean next(){
		try {
			if (rs.next()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean first(){
		try {
			if (rs.first()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean previous(){
		try {
			if (rs.previous()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean last(){
		try {
			if (rs.last()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}

 Conclusión

Aunque no sea la clase ideal para enviar a producción, nos ha permitido conocer las posibilidades del acceso a datos. Debéis considerar que el tratamiento de errores de la clase, se limita a comunicarlo por System.out, y no se hace ninguna comprobación….

A continuación, tenéis el módulo completo para facilitar su copia.

import java.sql.*;

public class Libros {

	private int idLibro;
	private String titulo;
	private String genero;
	private String autor;
	private Double precio;

	Statement sql;
	private ResultSet rs;

	public boolean error=false;
	public boolean eof=false;
	Connection miConexion;

	public  Libros(){
	}
	public Libros(int numero){
		leerRegistro(numero);
	}
	public Libros(String titulo){
		leerRegistro(titulo);
	}

	public void borrarRegistro(int numero){
		miConexion = Conexion.getConexion();
		String sentencia="DELETE FROM Libros WHERE idLibro="+numero;
		error=false;
		try {
			sql=miConexion.createStatement();
			sql.executeUpdate(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public boolean listarRegistro(){
		return listarRegistro("");
	}
	public boolean listarRegistro(String where){
		miConexion = Conexion.getConexion();
		eof=false;
		String sentencia="SELECT * FROM Libros ";
		if (where.length()>0){
			sentencia+=" WHERE "+where;
		}
		try {
			sql=miConexion.createStatement();
			rs=sql.executeQuery(sentencia);
			if (rs.next()){
				carga(rs);
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean next(){
		try {
			if (rs.next()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean first(){
		try {
			if (rs.first()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean previous(){
		try {
			if (rs.previous()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public boolean last(){
		try {
			if (rs.last()){
				carga(rs);
				eof=false;
			} else
				eof=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return eof;
	}
	public void leerRegistro(int numero){
		ResultSet rs;
		miConexion = Conexion.getConexion();
		error=false;
		try {
			sql=miConexion.createStatement();
			rs=sql.executeQuery("SELECT * FROM Libros WHERE idLibro="+numero);
			if (rs.next()){
				carga(rs);
			} else
				error=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void leerRegistro(String titulo){
		ResultSet rs;
		miConexion = Conexion.getConexion();
		error=false;
		try {
			sql=miConexion.createStatement();
			rs=sql.executeQuery("SELECT * FROM Libros WHERE Titulo='"+titulo+"'");
			if (rs.next()){
				carga(rs);
			} else
				error=true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void grabarRegistro(){
		String sentencia;
		sentencia="INSERT INTO Libros"+
				"(Titulo,Autor,Genero,Precio) " +
				" VALUES ("+
				"'"+titulo+"',"+
				"'"+autor+"',"+
				"'"+genero+"',"+
				precio+
				")";
		System.out.println(sentencia);
		try {
			miConexion = Conexion.getConexion();
			sql=miConexion.createStatement();
			sql.executeUpdate(sentencia);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public Object[] toArray(){
		Object[] sal = new Object[5];

		try {
			sal[0]=rs.getObject("idLibro");
			sal[1]=rs.getObject("Titulo");
			sal[2]=rs.getObject("Autor");
			sal[3]=rs.getObject("Precio");
			sal[4]=rs.getObject("Genero");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return sal;
	}
	private void carga(ResultSet rs){
		try {
			idLibro=rs.getInt("idLibro");
			titulo=rs.getString("Titulo");
			autor=rs.getString("Autor");
			precio=rs.getDouble("Precio");
			genero=rs.getString("Genero");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	public String toString(){
		return  "IdLibro:"+idLibro+
				"\tTitulo:"+titulo+
				"\tAutor:"+autor;

	}
	public int getIdLibro() {
		return idLibro;
	}
	public void setIdLibro(int idLibro) {
		this.idLibro = idLibro;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getGenero() {
		return genero;
	}
	public void setGenero(String genero) {
		this.genero = genero;
	}
	public String getAutor() {
		return autor;
	}
	public void setAutor(String autor) {
		this.autor = autor;
	}
	public Double getPrecio() {
		return precio;
	}
	public void setPrecio(Double precio) {
		this.precio = precio;
	}
}

 

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Java y etiquetada , , . Guarda el enlace permanente.

2 respuestas a Ejercicio de java.Clase de datos

  1. patricio dijo:

    me podrian mandar el resto del codigo tengo un proyecto que entregar en poco tiempo
    y no se por donde empezar se les agradece puedo recibirlo en el correo, ya corri el alta del libro …

    • Miguel dijo:

      El articulo presenta un ejemplo de como se puede acceder a una BD desde Java, y explica la forma de hacer los accesos mas habituales. Se trata de hacer una clase que encapsule la persistencia….no hay mas codigo. Lo siento.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.