En las líneas siguientes, construiremos 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 analizamos 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 borrar 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;
}
}
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.
8 comentarios
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 …
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.
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 …