Vous êtes sur la page 1sur 17

Nuestro proyecto de Base de Datos llamado "Contactos", est completo o ms o menos

completo, el cdigo contiene las funciones bsicas que debe tener un proyecto de Base de
Datos, aade nuevos registros, los elimina y tambin puede modificar esos registros.
El proyecto.
- Nuestra base de datos se llama "DBContactos" en MySQL
- Contiene una nica tabla llamada "Persona"

El proyecto contiene las clases:


conectate.java : encargada de conectarse con la base de datos
persona.java: esta clase contiene todas las funciones encargadas de manipular la base
de datos
tablaform.java: es la interfaz grfica en si
Adems tambin se aadieron las clases:
mipanel.java
degradadoclass.java
Ambas clases encargadas de aadir imgenes
y colores a la interfaz grfica, para hacer del
proyecto final un poco ms agradable a la vista.
Estas clases no tienen nada que ver con la base
de datos.
Esta es nuestra interfaz final

Clase Conexin a Base de Datos


Cuando se trabaja con base de datos en java, lo mejor para tener un trabajo controlado, limpio
y que sea fcil de mantener, es hacer uso de una clase exclusiva para la conexin.
Esta "clase java" que coloco en este post me ha servido mucho para realizar algunos trabajos
en java sin muchos dolores de cabeza, la clase se llama "conectate.java", y el uso es bastante
sencillo. Si trabajas con mysql, lo nico que debes modificar es el "paquete" donde lo usaras,
el nombre de la base de datos, usuario y password
package PAQUETE_QUE_USARA_ESTA_CLASE ;
import java.sql.*;
/**
* @web http://wovi.com.mx/
* @authors: m@gh / j@ms
*/
public class conectate {
static String bd = "NOMBRE_BASE_DE_DATOS";
static String login = "USUARIO";
static String password = "PASSWORD";
static String url = "jdbc:mysql://localhost/"+bd;
Connection conn = null;
public conectate() {
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,login,password);
if (conn!=null){
System.out.println("Coneccin a base de datos "+bd+". listo");
}
}catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}
}
public Connection getConnection(){
return conn;
}
public void desconectar(){
conn = null;
}
}
Probando la clase "conectate.java"
Para probar la clase "conectate.java", creada en "Clase conexion a base de datos", que nos
permite conectarnos a una base de datos de MySQL, creamos un nuevo proyecto en Netbeans
con el nombre "contactos".
Antes, me olvidaba, tenemos que tener creada la base
de datos, la cual llame "dbcontactos", si no sabes cmo
crear la base de datos psate por aqu, en esa base de
datos creamos una tabla llamada "persona".

Muy bien, ahora para probar que la conexin en verdad funciona, creamos una clase y la
llamamos "persona.java", en esta clase colocamos el siguiente cdigo:
package contactos;
/* @web http://wovi.com.mx/ @authors: m@gh / j@ms */
public class persona {
conectate con;
public persona (){
con = new conectate();
}
}
Ahora en el Main.java, colocamos el siguiente cdigo:
package contactos;
/* @web http://wovi.com.mx/ @authors: m@gh / j@ms */
public class Main {
public static void main(String[] args) {
persona p = new persona();
p.con.desconectar();
}
}

Ya solo nos queda ejecutar el proyecto (F6)


y listo.
Sentencia SQL en netbeans
Continuando con el post "Probando la clase conectate.java", ahora daremos una nueva
funcionalidad a nuestra clase "persona.java", que es la de aadir nuevos registros a nuestra
tabla "persona".
Modificaremos la clase "persona.java" con el siguiente cdigo:
package contactos;
import java.sql.*;
/* @web http://wovi.com.mx/ @authors: m@gh / j@ms */
public class persona {
conectate con;
public persona (){
con = new conectate();
}

/*Aade un nuevo registro*/


public void NuevaPersona(String name, String ap, String am, String mail){
try {
PreparedStatement pstm = con.getConnection().prepareStatement("insert into " +
"persona(Nombre, appPaterno, appMaterno, mail) " +
" values(?,?,?,?)");
pstm.setString(1, name);
pstm.setString(2, ap);
pstm.setString(3, am);
pstm.setString(4, mail);
pstm.execute();
pstm.close();
}catch(SQLException e){
System.out.println(e);
}
}
}
Tambin aadiremos nuevas lneas de cdigo a Main.java:
package contactos;
/**
* @web http://wovi.com.mx/ @authors: m@gh / j@ms
*/
public class Main {
public static void main(String[] args) {
persona p = new persona();
p.NuevaPersona("Fulanito", "Menganito", "Zutanito", "fmz@hotmail.com");
p.con.desconectar();
}
}

Ejecutamos nuevamente el
proyecto (F6) y tenemos el nuevo
registro aadido a nuestra tabla

Leer base de datos con netbeans


Ahora que pudimos manipular la base de datos con la "insercion" de nuevos registros, ahora
necesitamos extraer esos registros para poder verlos, modificaremos la clase "persona.java"
para aadir la funcin "getDatos()".
Nuestra clase Persona.java que da de esta forma:
package contactos;
import java.sql.*;
/* @web http://wovi.com.mx/ authors: m@gh / j@ms */
public class persona {
conectate con;
public persona (){
con = new conectate();
}

/*Aade un nuevo registro*/


public void NuevaPersona(String name, String ap, String am, String mail){
try {
PreparedStatement pstm = con.getConnection().prepareStatement("insert into " +
"persona(Nombre, appPaterno, appMaterno, mail) " +
" values(?,?,?,?)");
pstm.setString(1, name);
pstm.setString(2, ap);
pstm.setString(3, am);
pstm.setString(4, mail);
pstm.execute();
pstm.close();
}catch(SQLException e){
System.out.println(e);
}
}

/*obtenemos todos los datos de la tabla*/


public Object [][] getDatos(){
int x = 0;
//obtenemos la cantidad de registros existentes en la tabla
try{
PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(1) as
total FROM persona ");
ResultSet res = pstm.executeQuery();
res.next();
x = res.getInt("total");
res.close();
}catch(SQLException e){
System.out.println(e);
}

Object[][] s = new String[x][2];


//realizamos la consulta sql y llenamos los datos en "Object"
try{
PreparedStatement pstm = con.getConnection().prepareStatement("SELECT " +
" id, Nombre " +
" FROM persona" +
" ORDER BY id ");
ResultSet res = pstm.executeQuery();
int i = 0;
while(res.next()){
String estCodigo = res.getString("id");
String estNombre = res.getString("nombre");
s[i][0] = estCodigo;
s[i][1] = estNombre;
i++;
}
res.close();
}catch(SQLException e){
System.out.println(e);
}
return s;
}

La nueva funcion GetDatos() esta definida como Object [][], tambien podemos definirla como
String[][], la funcin est dividida en dos partes, la primera encargada de realizar una consulta
para conocer el nmero de registros existentes y guardarla en la variable "registros", la
segunda parte de la funcin utilizando la variable "registros" crea un objeto con esas
dimensiones y realiza la consulta para extraer los datos y colocarlas en la variable "data[][]"
que es la que retorna.
El cdigo del Main, debe quedar as:
package contactos;
/* @web http://wovi.com.mx/ authors: m@gh / j@ms */
public class Main {
public static void main(String[] args) {
persona p = new persona();
Object [][] sc ;
sc = p.getDatos();
for(int i=0;i<sc.length ;i++){
System.out.println("> " + sc[i][0] + " - " + sc[i][1]);
}
p.con.desconectar();
}
}

Ejecuta el programa

Interfaz y base de datos con netbeans


Trabajando con las base de datos y extrayendo los datos para su uso con java en post
anteriores, ahora necesitamos crear una interfaz de usuario para poder interactuar de una
manera sencilla con nuestra aplicacin.
Comenzaremos por ahora solo con mostrar los datos que sacamos de la base de datos MySql,
poco a poco se ira perfeccionando la aplicacin para tener al final un proyecto bastante
complejo y bastante completo.
Paso1: Con el proyecto abierto (contactos)
crearemos un nuevo jFrame al que llamaremos
"tablaform", a esta nueva ventana le
aadiremos los controles JPanel y JTable como
se ve en la imagen

Al objeto JTable renombraremos a "tabla", la distribucion


de los objetos debe quedar asi:

Paso 2: Modificaremos la clase "persona.java", ms concretamente la funcion "getDatos()",


los cambios que hicimos fueron para poder leer todos los datos de nuestra tabla
public Object [][] getDatos(){
int registros = 0;
//obtenemos la cantidad de registros existentes en la tabla
try{
PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(1) as
total FROM persona ");
ResultSet res = pstm.executeQuery();
res.next();
registros = res.getInt("total");
res.close();
}catch(SQLException e){
System.out.println(e);
}

Object[][] data = new String[registros][5];


//realizamos la consulta sql y llenamos los datos en "Object"
try{
PreparedStatement pstm = con.getConnection().prepareStatement("SELECT " +
" id, Nombre, appPaterno, appMaterno, mail " +
" FROM persona" +
" ORDER BY id ");
ResultSet res = pstm.executeQuery();
int i = 0;
while(res.next()){
String estCodigo = res.getString("id");
String estNombre = res.getString("nombre");
String estpaterno = res.getString("appPaterno");
String estmaterno = res.getString("appMaterno");
String estmail = res.getString("mail");
data[i][0] = estCodigo;
data[i][1] = estNombre;
data[i][2] = estpaterno;
data[i][3] = estmaterno;
data[i][4] = estmail;
i++;
}
res.close();
}catch(SQLException e){
System.out.println(e);
}
return data;
}
Paso 3: a nuestro "tablaform", le aadimos "import javax.swing.table.DefaultTableModel;",
al jframe le aadimos la funcin WindowOpened y colocaremos el siguiente cdigo:
private void formWindowOpened(java.awt.event.WindowEvent evt) {
//objeto para almacenar datos
Object[][] dtPer;
String[] columNames = {"id","Nombre","ap. Paterno","ap. Materno", "E-Mail"};
// se utiliza la funcion
dtPer = p.getDatos();
// se colocan los datos en la tabla
DefaultTableModel datos = new DefaultTableModel(dtPer,columNames);
tabla.setModel(datos);
}

Ya solo queda ejecutar la aplicacin:

Agregar registros a base de datos con netbeans


Continuando con nuestro mini-proyecto, ahora llego la hora de agregar/eliminar/actualizar
registros a la base de datos de forma visual.
Nuestro proyecto se llama "contactos", las clases que utilizamos son conectate.java y
persona.java, la base de datos (dbcontactos) y tabla (persona) que usamos las puedes ver
aqu.
Clase persona.java
package contactos;
import java.sql.*;
/* @web http://wovi.com.mx/ authors: m@gh / j@ms */public class persona {
conectate con;
public persona (){
con = new conectate();
}

/*Aade un nuevo registro*/


public void NuevaPersona(String name, String ap, String am, String mail){
try {
PreparedStatement pstm = con.getConnection().prepareStatement("insert into " +
"persona(Nombre, appPaterno, appMaterno, mail) " +
" values(?,?,?,?)");
pstm.setString(1, name);
pstm.setString(2, ap);
pstm.setString(3, am);
pstm.setString(4, mail);
pstm.execute();
pstm.close();
}catch(SQLException e){
System.out.println(e);
}
}

/*obtenemos todos los datos de la tabla*/


public Object [][] getDatos(){
int registros = 0;
//obtenemos la cantidad de registros existentes en la tabla
try{
PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(1) as
total FROM persona ");
ResultSet res = pstm.executeQuery();
res.next();
registros = res.getInt("total");
res.close();
}catch(SQLException e){
System.out.println(e);
}

Object[][] data = new String[registros][5];


//realizamos la consulta sql y llenamos los datos en "Object"
try{
PreparedStatement pstm = con.getConnection().prepareStatement("SELECT " +
" id, Nombre, appPaterno, appMaterno, mail " +
" FROM persona" +
" ORDER BY id ");
ResultSet res = pstm.executeQuery();
int i = 0;
while(res.next()){
String estCodigo = res.getString("id");
String estNombre = res.getString("nombre");
String estpaterno = res.getString("appPaterno");
String estmaterno = res.getString("appMaterno");
String estmail = res.getString("mail");
data[i][0] = estCodigo;
data[i][1] = estNombre;
data[i][2] = estpaterno;
data[i][3] = estmaterno;
data[i][4] = estmail;
i++;
}
res.close();
}catch(SQLException e){
System.out.println(e);
}
return data;
}
}

Empezemos:
Paso 1: crea un jFrame "tablaform" y coloca
los siguientes controles, renmbralos como se
ve en la imagen de abajo. Cuidado con las
maysculas y minsculas!

Nos dirigimos a Source (su codigo) y realizaremos lo siguiente;


Paso 2: declara import javax.swing.table.DefaultTableModel; ya sabes donde
Paso 3: coloca estas lneas de cdigo.
/**
* @param args the command line arguments
*/
persona p= new persona();
Object[][] dtPer;
int fila = -1;

Paso 4: Aade estos dos mtodos, el primero updateTabla(), actualiza el objeto tabla cada vez
que se lo invoca, el mtodo nuevo(), su funcin es la de limpiar los jTextFields para aadir
nuevos datos.
private void updateTabla(){
String[] columNames = {"id","Nombre","ap. Paterno","ap. Materno", "E-Mail"};
// se utiliza la funcion
dtPer = p.getDatos();
// se colocan los datos en la tabla
DefaultTableModel datos = new DefaultTableModel(dtPer,columNames);
tabla.setModel(datos);
}

private void nuevo(){


txtname.setText("");
txtpaterno.setText("");
txtmaterno.setText("");
txtmail.setText("tu_correo@hotmail");
}

Paso 5: aade el evento WindowOpenend al jFrame, el evento ActionPerformed a los objetos


jButton y el evento MouseClicked al objeto jTable, aade el cdigo que se ve abajo
private void formWindowOpened(java.awt.event.WindowEvent evt) {
updateTabla();
nuevo();
}
private void cmdRegistroActionPerformed(java.awt.event.ActionEvent evt) {
String name = txtname.getText();
String pat = txtpaterno.getText();
String mat = txtmaterno.getText();
String mail = txtmail.getText();
p.NuevaPersona(name, mat, pat, mail);
updateTabla();
}

private void cmdNuevoActionPerformed(java.awt.event.ActionEvent evt) {


nuevo();
}

private void tablaMouseClicked(java.awt.event.MouseEvent evt) {


fila = tabla.rowAtPoint(evt.getPoint());
if (fila > -1){
txtname.setText(String.valueOf(tabla.getValueAt(fila, 1)));
txtpaterno.setText(String.valueOf(tabla.getValueAt(fila, 2)));
txtmaterno.setText(String.valueOf(tabla.getValueAt(fila, 3)));
txtmail.setText(String.valueOf(tabla.getValueAt(fila, 4)));
}
}

Paso 6: Compila y ejecuta el proyecto

** Eliminar/Borrar registros de base de datos con netbeans


Le aadiremos una nueva funcionalidad a nuestro proyecto base de datos y netbeans, esta
funcionalidad es la de poder eliminar registros de la base de datos, todo de una forma visual y
sencilla.
Recordemos un poco, nuestro proyecto se llama "contactos", las clases que utilizamos son
conectate.java y persona.java, la base de datos (dbcontactos) y contiene una tabla (persona)
puedes ver con ms detalle nuestra base de datos aqu.
Los cambios que realizamos son:
Aadiremos un nuevo jButton al proyecto, lo
llamaremos "cmdEliminar", nuestra interfaz
debe quedar de esta forma.

Para poder eliminar un registro de la base de


datos realizaremos una instruccin SQL con el
comando DELETE, para ello debemos tener
muy en cuenta la conformacin de nuestra
tabla "Persona".

En la clase persona.java, aadiremos la nueva funcion deletePersona(), dentro la cual


colocaremos la instruccion SQL, ejecutaremos la sentencia y cerramos.
public void deletePersona(String cod){
try {
PreparedStatement pstm = con.getConnection().prepareStatement("delete from
persona where id = ?");
pstm.setString(1, cod);
pstm.execute();
pstm.close();
}catch(SQLException e){
System.out.println(e);
}
}

Ahora en el JFrame correspondiente, al boton que creamos "cmdEliminar", le aadimos el


evento ActionPerformded, copias el siguiente codigo.
private void cmdEliminarActionPerformed(java.awt.event.ActionEvent evt) {
if (fila > -1){
String codigo = String.valueOf(tabla.getValueAt(fila, 0));
p.deletePersona(codigo);
updateTabla();
fila=-1;
}
}
Este cdigo lo que hace es revisar si la variable "fila" contiene un valor diferente a "-1", esto
sucede cuando se realiza un clic sobre el objeto "tabla", si esto es cierto, quiere decir que
tenemos una fila seleccionada, por lo tanto proceder a extraer el cdigo correspondiente y
con este cdigo har un llamado a deletePersona (cdigo), elimina el registro y reinicia el valor
de fila a -1 para evitar inconvenientes.

Actualizar/update registros de la base de datos con netbeans


Una ltima funcionalidad que le falta a nuestro miniproyecto de base de datos, es la de poder
"modificar" los datos ledos de la base de datos, para despus poder guardar esos cambios,
para ello:
- Aadimos un nuevo jButton a nuestro proyecto.
- En nuestra clase, persona.java aadimos el cdigo
public void updatePersona(String id, String name, String paterno, String materno, String mail){
try {
PreparedStatement pstm = con.getConnection().prepareStatement("update persona " +
"set Nombre = ? ," +
"appPaterno = ? ," +
"appMaterno = ? ," +
"mail = ? " +
"where id = ? ");
pstm.setString(1, name);
pstm.setString(2, paterno);
pstm.setString(3, materno);
pstm.setString(4, mail);
pstm.setString(5, String.valueOf(id));
pstm.execute();
pstm.close();
}catch(SQLException e){
System.out.println(e);
}
}

Explicacin: Esta nueva funcin, recibe como parmetros el "id" cdigo del registro que se
modificara, adems de los datos necesarios para realizar la consulta, como el nombre, apellido
paterno , materno y el mail de la persona. Luego se realiza una consulta SQL pasando esos
datos.
Ya en el jFrame de nuestro proyecto, al nuevo jButton que creamos, aadimos el siguiente
cdigo:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
if (fila > -1){
String codigo = String.valueOf(tabla.getValueAt(fila, 0));
String name = txtname.getText();
String pat = txtpaterno.getText();
String mat = txtmaterno.getText();
String mail = txtmail.getText();
p.updatePersona(codigo, name, pat, mat, mail);
updateTabla();
}
}

Lo nico que hace es capturar los datos del JTable, asignarlas a variables y llamar a la funcin
updatePersona().