Beruflich Dokumente
Kultur Dokumente
Una vez instalado MySQL, descargado el driver para java de MySQL y con una base de
datos y una tabla creada en MySQL, vamos a hacer un pequeo programa en java que
nos permita conectarnos a la base de datos MySQL y consultar la tabla que hemos creado.
Instalar el Driver
En nuestro programa java, todos los import que necesitamos para manejar la base de
datos estn en java.sql.*. Puesto que casi todas los mtodos relativos a base de datos
pueden lanzar la excepcin SQLException, meteremos todo nuestro programa en un try-
catch.
Lo primero que tenemos que hacer es asegurarnos que el Driver se inicializa y se registra,
para ello
try
{
Class.forName("com.mysql.jdbc.Driver");
}catch(Exceptione)
{
e.printStackTrace();
}
Debemos tener el servidor de MySQL arrancado. Si hemos instalado y dejado esa opcin
como estaba, cada vez que encendamos el ordenador, se arrancar el servidor
de MySQL, por lo que no tenemos que preocuparnos por ello.
El servidor de MySQL abre por defecto el puerto 3306 para aceptar conexiones de
posibles clientes, de programas que quieran conectarse y acceder a la base de datos.
Nuestro programa java, si quiere consultar la tabla de base de datos que hemos creado,
deber conectarse a este servidor.
//Establecemoslaconexinconlabasededatos.
Connectionconexion=DriverManager.getConnection
("jdbc:mysql://localhost/prueba","root","la_clave");
jdb:mysql porque estamos utilizando un driver jdbc para MySQL, que es el que
nos hemos bajado.
localhost porque el servidor de base de datos, en mi caso, est en el mismo
ordenador en el que voy a correr el prorama java. Aqu puede ponerse una IP o un
nombre de mquina que est en la red.
Los otros dos parmetros son dos String. Corresponden al nombre de usuario y password
para acceder a la base de datos. Al instalar MySQL se crea el usuario root y se pide la
password para l. Como no hemos creado otros usuarios, usaremos este mismo.
Esta conexin es en realidad un socket entre java y la base de datos, aunque para
nosotros es transparente. Lo que s es importante, es saber que si varios hilos comparten
esta conexin, deben usarla sincronizadamente. Si no se hace as, los mensajes que van
por el socket se pueden entremezclar y los hilos pueden leer cachos de mensaje
destinados al otro hilo. Otra opcin es que cada hilo cree su propia conexin. Finalmente,
la mejor opcin de todas si nuestra aplicacin va a tener varios hilos intentando acceder a
la base de datos, es usar un Pool de conexiones.
Para realizar cualquier accin sobre la base de datos (consulta, insertar nuevos registros,
modificar los existentes o borrar), necesitamos una clase Statement. Para obtenerla, se le
pide dicha clase a la conexin. La forma de hacerlo, para una consulta, es la siguiente:
//Preparamoslaconsulta
Statements=conexion.createStatement();
ResultSetrs=s.executeQuery("select*frompersona");
La parte de createStatement() no tiene ning secreto, salvo que puede lanzar una
excepcin que hay que capturar.
El Statement obtenido tiene un mtodo executeQuery(). Este mtodo sirve para realizar
una consulta a base de datos.
//Recorremoselresultado,mientrashayaregistrosparaleer,y
escribimoselresultadoenpantalla.
while(rs.next())
{
System.out.println(rs.getInt(1)+""+rs.getString(2)+"
"+rs.getDate(3));
}
Es responsabilidad nuestra saber qu tipo de dato hay en cada columna, aunque si nos
equivocamos y RecordSet es capaz de hacer la conversin, la har por nosotros. Por
ejemplo, en cualquiera de los campos anteriores podemos pedir un getString() y nos
devolveran los nmeros como String y la fecha como String.
Cerrar la conexin
Una vez que terminamos de usar la conexin, se debera cerrar, o bien terminar el
programa, con lo que se cierra automticamente.
//Cerramoslaconexionalabasededatos.
conexion.close();
El ejemplo
Vamos ahora a ver ahora cmo meter los resultados de la consulta en un JTable.
Estadsticas y comentarios
Lo primero que vamos a hacer es importar las clases y/o paquetes que
vamos a utilizar (los llamados imports), en este caso solamente ser el
que se muestra a continuacin:
?
1 import java.sql.*;
?
1 public class MySQLBD {
2 private Connection conexion;
3 .
.
4
?
1
2 public Connection getConexion() {
3 return conexion;
}
4 public void setConexion(Connection conexion) {
5 this.conexion = conexion;
6 }
7 public MySQLBD conectar() {
try {
8 .
9 .
10 .
11 } catch (Exception e) {
12 e.printStackTrace();
}
13
14 return this;
15 }
16
17
18
Ahora bien, dentro del try-catch lo primero que realizaremos ser cargar
el driver en la memoria y posteriormente crear una cadena con la URL de
conexin a la base de datos como se muestra en el siguiente cdigo:
?
1
2 Class.forName("com.mysql.jdbc.Driver");
3 String BaseDeDatos = "jdbc:mysql://localhost/test?user=usuario&password=123";
password es la contrasea.
En este momento lo nico que nos falta para crear la conexin es llamar
al mtodo getConnection() del driver de la siguiente manera:
?
1 setConexion(DriverManager.getConnection(BaseDeDatos));
?
1
2 if (conexion != null) {
3 System.out.println("Conexion exitosa!");
4 } else {
5 System.out.println("Conexion fallida!");
}
6
Vamos a definir el mtodo para que sea pblico y nos devuelva un valor
booleano, true si se ejecuta la consulta correctamente, false si no. A su
vez recibir una cadena que contendr la consulta SQL a ejecutar.
?
1 public boolean ejecutar(String sql) {
2 .
3 .
4 .
}
5
?
1
2 public boolean ejecutar(String sql) {
3 try {
.
4 .
5 .
6 } catch (SQLException e) {
7 e.printStackTrace();
return false;
8 }
9 return true;
10 }
11
12
?
1 Statement sentencia = getConexion().createStatement(ResultSet.TYPE_FORWARD_ONLY,
2 ResultSet.CONCUR_READ_ONLY);
3 sentencia.executeUpdate(sql);
?
1 sentencia.close();
?
1 public boolean ejecutar(String sql) {
2 try {
3 Statement sentencia = getConexion().createStatement(ResultSet.TYPE_F
4 ResultSet.CONCUR_READ_ONLY);
sentencia.executeUpdate(sql);
5 sentencia.close();
6 } catch (SQLException e) {
7 e.printStackTrace();
8 return false;
9 } return true;
}
10
?
1
2 public ResultSet consultar(String sql) {
.
3 .
4 .
5 }
6
Lo primero que vamos a agregar es una declaracin del objeto de
tipo ResultSet y posteriormente encerraremos la ejecucin dentro de
un try-catch para capturar las excepciones que se puedan generar.
?
1
public ResultSet consultar(String sql) {
2 ResultSet resultado = null;
3 try {
4 } catch (SQLException e) {
5 e.printStackTrace();
6 return null;
}
7 return resultado;<
8 }
9
?
1 Statement sentencia = getConexion().createStatement(ResultSet.TYPE_FORWARD_ONLY,
2 ResultSet.CONCUR_READ_ONLY);
?
1
resultado = sentencia.executeQuery(sql);
2 getConexion().commit();
3
?
1 public ResultSet consultar(String sql) {
2 ResultSet resultado;
3 try {
4 Statement sentencia = getConexion().createStatement(ResultSet.TYPE_F
ResultSet.CONCUR_READ_ONLY);
5 resultado = sentencia.executeQuery(sql);
6 } catch (SQLException e) {
7 e.printStackTrace();
8 return null;
9 } return resultado;
}
10
Con esto tenemos completa nuestra clase que se encargar de realizar la
conexin, consulta y ejecucin de sentencias en la base de datos Oracle.
Probar el funcionamiento
Para verificar que todo funciona bien podemos crear una tabla en la base
de datos de nombre TEST con 2 campos, IDENTIFICADOR de
tipo INTEGER y DESCRIPCION de tipo VARCHAR y ejecutar lo siguiente
dentro del mtodo main:
?
1
2 public static void main(String[] args) {
3 MySQLBD baseDatos = new MySQLBD().conectar();
4
5 if (baseDatos.ejecutar("INSERT INTO TEST(IDENTIFICADOR,DESCRIPCION) VALUES
6 System.out.println("Ejecucin correcta!");
7 } else {
System.out.println("Ocurri un problema al ejecutar!");
8 } ResultSet resultados = baseDatos.consultar("SELECT * FROM TEST");
9 try {
10 System.out.println("IDENTIFICADOR DESCRIPCION");
11 System.out.println("--------------------------------");
while (resultados.next()) {
12
System.out.println(""+resultados.getBigDecimal("IDENTIFICADOR"
13 }
14 } catch (Exception e) {
15 e.printStackTrace();
16 }
}
17 }
18
19
Descargar XAMPP
Slo tenemos que dar clic en Start para el MySQL y Apache Servers.
Hemos completado el primer paso de nuestro proceso. Veamos qu
sigue.
public void MySQLConnection(String user, String pass, String db_name) throws Exception
1
{
2
try {
3
Class.forName("com.mysql.jdbc.Driver");
4
Conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/" +
5 db_name, user, pass);
1 }
1
}
4 }
Ahora crearemos otro mtodo, esta vez para crear una base de datos.
Lo llamaremos createDB(). El cdigo es el siguiente:
1
public void createDB(String name) {
2
try {
3
String Query = "CREATE DATABASE " + name;
4
Statement st = Conexion.createStatement();
5
st.executeUpdate(Query);
6
closeConnection();
7
MySQLConnection("root", "", name);
8
JOptionPane.showMessageDialog(null, "Se ha creado la base de datos " + name + " de
9 forma exitosa");
1 }
2
3 try {
8 Statement st = Conexion.createStatement();
9 st.executeUpdate(Query);
2
public void insertData(String table_name, String ID, String name, String lastname, String
3 age, String gender) {
4 try {
3
public void getValues(String table_name) {
4
try {
5
String Query = "SELECT * FROM " + table_name;
6
Statement st = Conexion.createStatement();
7
java.sql.ResultSet resultSet;
8
resultSet = st.executeQuery(Query);
9
1
while (resultSet.next()) {
0
System.out.println("ID: " + resultSet.getString("ID") + " "
1
1 + "Nombre: " + resultSet.getString("Nombre") + " " +
resultSet.getString("Apellido") + " "
1
2 + "Edad: " + resultSet.getString("Edad") + " "
1 + "Sexo: " + resultSet.getString("Sexo"));
3
}
1
4
1 }
7
1
8
SELECT * FROM seguidas del nombre de la tabla. El asterisco indica que se desean consultar
todos los valores de una fila determinada. Para hacer la consulta necesitamos crear
un resultSet. Esta variable funciona como una cabeza lectora que va leyendo fila a fila. Con el
mtodo getString() leemos las columnas que deseamos.
7
} catch (SQLException ex) {
8
System.out.println(ex.getMessage());
9
JOptionPane.showMessageDialog(null, "Error borrando el registro especificado");
1
0 }
1 }
1
1 package mysql_test;
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.SQLException;
6 import java.sql.Statement;
7 import java.util.logging.Level;
8 import java.util.logging.Logger;
9 import javax.swing.JOptionPane;
10
12
16 try {
17 Class.forName("com.mysql.jdbc.Driver");
18 Conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/" +
db_name, user, pass);
19
System.out.println("Se ha iniciado la conexin con el servidor de forma exitosa");
20
} catch (ClassNotFoundException ex) {
21
Logger.getLogger(MySQL.class.getName()).log(Level.SEVERE, null, ex);
22
} catch (SQLException ex) {
23
Logger.getLogger(MySQL.class.getName()).log(Level.SEVERE, null, ex);
24
}
25
}
26
27
public void closeConnection() {
28
try {
29
Conexion.close();
30
System.out.println("Se ha finalizado la conexin con el servidor");
31
} catch (SQLException ex) {
32
Logger.getLogger(MySQL.class.getName()).log(Level.SEVERE, null, ex);
33
}
34
}
35
36
public void createDB(String name) {
37
try {
38
String Query = "CREATE DATABASE " + name;
39
Statement st = Conexion.createStatement();
40
st.executeUpdate(Query);
41
MySQLConnection("root", "", name);
42
JOptionPane.showMessageDialog(null, "Se ha creado la base de datos " + name +
43 " de forma exitosa");
62
public void insertData(String table_name, String ID, String name, String lastname,
63 String age, String gender) {
64 try {
65 String Query = "INSERT INTO " + table_name + " VALUES("
66 + "\"" + ID + "\", "
67 + "\"" + name + "\", "
68 + "\"" + lastname + "\", "
69 + "\"" + age + "\", "
70 + "\"" + gender + "\")";
71 Statement st = Conexion.createStatement();
72 st.executeUpdate(Query);
73 JOptionPane.showMessageDialog(null, "Datos almacenados de forma exitosa");
74 } catch (SQLException ex) {
75 JOptionPane.showMessageDialog(null, "Error en el almacenamiento de datos");
76 }
77 }
78
87
while (resultSet.next()) {
88
System.out.println("ID: " + resultSet.getString("ID") + " "
89
+ "Nombre: " + resultSet.getString("Nombre") + " " +
90 resultSet.getString("Apellido") + " "
93 }
94
97 }
98 }
99
10
7
}
10
8
3 w.setVisible(true);
4 }
2 db.createDB("MySQL_Test");
3 db.createTable("Registros");
Ejecutemos el programa para ver si todo est en orden.
2 jButtonConnect.setEnabled(false);
3 jButtonDelete.setEnabled(true);
4 jButtonGet.setEnabled(true);
5 jButtonRegister.setEnabled(true);
3 db.deleteRecord("Registros", jTextFieldID.getText());
4 db.closeConnection();
5 this.dispose();
3 db.insertData("Registros", jTextFieldID.getText(),
4 jTextFieldNombre.getText(),
5 jTextFieldApellido.getText(),
6 jTextFieldEdad.getText(),
7 jComboBoxSexo.getSelectedItem().toString());
8 db.closeConnection();
9 this.dispose();
MySQL_Test
import paquete.Clase;
Hola y buen da a todos mis lectores, hoy veremos de nuevo un tema para
principiantes en lenguaje Java, y el tema (como dice ah arriba) es Cmo mostrar
un dialogo de mensaje en Java para logra tal cosa usaremos la clase JOptionPane.
Aqu abajo hay una imagen que muestra lo que haremos ms adelante,
comencemos
Dentro de la programacin, la comunicacin con el usuario es una de las cosas ms
importantes (y a mi parecer la ms importante, ya que es el fin de cualquier
programa), anteriormente ya habamos hablado de eso en otro de mis artculos,
pero hoy nos centraremos especficamente en cmo mostrar diferentes tipos de
mensajes, ya sea un simple aviso, un mensaje de error, de advertencia, pregunta,
etc.
02
04
05 /**
07 */
11 }
12
14 lanzarMensaje();
15 }
16
17 }
Sencillo, verdad? Como vieron, esto va dentro de algn mtodo ya sea el main o
cualquier otro, un constructor, lo que sea. Ahora, veamos algo un poco mejor, y
qu es mejor que un mensaje de una lnea? Pues un mensaje de 2 lneas :D (o las
que queramos).
Para mostrar un dialogo de varias lneas, necesitamos un salto de lnea, para esto,
llamaremos a una propiedad del sistema, esto ser tal como dar \n en C++ y en
Java es tambin vlido, pero esta no es la forma ms extensible de hacerlo Por
qu? Pues recordemos que Java es multiplataforma, puede que no en todos los
sistemas operativos tomen esto como un salto de lnea, en algunos es algo
como \n\r o dependiendo, as que para no complicarnos, lo haremos de la siguiente
manera:
02
03 public final class Mensajes {
04
05 /**
07 */
11 }
12
13 /**
15 */
18 String nl = System.getProperty("line.separator");
19 //Lanzamos el mensaje:
23 }
24
26 lanzarMensajeVariasLneas();
27 }
28
29 }
Y el resultado es:
Ahora, esos son mensajes sencillos, muy tiles claro, pero JOptionPane (la clase
que estamos usando) tiene an muchos trucos bajo la manga, podemos hacer
muchos tipos de dilogos de manera sencilla, como por ejemplo:
02
04
05 /**
07 */
11 }
12
13 /**
15 */
18 String nl = System.getProperty("line.separator");
19 //Lanzamos el mensaje:
23 }
24
25 /**
27 */
30 String nl = System.getProperty("line.separator");
35
36 /*
39 * ms ordenado:
40 */
41 JOptionPane.showMessageDialog(null,
42 msj, //Mensaje
43 "Mensaje Plano", //Ttulo
45
46 JOptionPane.showMessageDialog(null,
47 msj, //Mensaje
50
51 JOptionPane.showMessageDialog(null,
52 msj, //Mensaje
55
56 JOptionPane.showMessageDialog(null,
57 msj, //Mensaje
60
61 JOptionPane.showMessageDialog(null,
62 msj, //Mensaje
65 }
66
68 lanzarTiposDeMensaje();
69 }
70
71 }
Al correr este cdigo veremos 5 mensajes de dialogo (se muestra el siguiente dando
click al botn Aceptar) con diferente icono, como se muestra en la siguiente
imagen (Sin el bonito fondo verde ni el texto obviamente :P)
El segundo mtodo que enlistamos pide lo mismo que el primero pero adems
podemos poner un cono a nuestro gusto en el ltimo argumento (Icon), en lugar de
uno de los que ya vienen por parte deJOptionPane.
showMessageDialog
Ok, para probar est mtodo, lo nico que haremos ser crear una
clase con un mtodo main, vamos a suponer que la clase se llama,
MessageDialog:
1 public class MessageDialog {
5 }
6}
Bien, fcil, ahora, vamos a jugar un poco con esto, para acceder a
este mtodo simplemente tenemos que importar la clase
JOptionPane, aunque normalmente netbeans lo hace por nosotros
pondr la lnea de cdigo por cualquier cosa:
1 import javax.swing.JOptionPane;
5 }
7}
Bien, explicacin rpida, el primer parmetro, representa el
componente padre sobre el cual el mensaje se mostrar, si
nosotros no le enviamos ninguno, como en este caso lo estamos
haciendo, simplemente mostrar una ventana similiar a la siguiente:
Si nosotros le enviamos un
componente, se colocar encima de el, sin ninguna variacin en el
funcionamiento, el segundo parmetro obviamente, es el mensaje
que queremos observar, y listo, un mensaje fcil de hacer, bien,
ahora veamos otra cosa, el anterior fue el mtodo con dos
parmetros, ahora bien, cuando utilizamos el mtodo de cuatro
parmetros tenemos un poco ms de personalizacin, veamos:
1 import java.awt.Component;
2 import java.awt.Graphics;
3 import java.awt.Image;
4 import javax.swing.Icon;
5 import javax.swing.ImageIcon;
9 @Override
1
3
@Override
1
public int getIconWidth() {
4
return 50;
1
5 }
1
6
1
7
1
8
1
9 @Override
2 public int getIconHeight() {
0
return 50;
2
1 }
2
2
}
2
3
2
4
2
5
Listo, con esto tendremos nuestro icono, ya se, tanto rollo para un
icono, pero bueno, somos programadores, ahora bien,
necesitaremos, antes de mostrar nuestro mensaje de dialogo, crear
una instancia de esta clase, y posteriormente, podremos utilizar el
mtodo de 5 parametros:
showInputDialog
Bien, para trabajar con el showInputDialog, vamos a crear
nuevamente una clase a la cual le llame InputDialog nuevamente
con un mtodo main:
4 }
5}
1 JOptionPane.showInputDialog(Mensaje);
Explicacin: Bueno, este es el mtodo ms sencillo, slo requiere
de un parmetro, y este es el mensaje que va a mostrar, como les
comente en un principio, la mayoria de los InputDialog devuelven
un String, por consecuente, su utilizacin sera la siguiente:
Mtodo 2:
Mtodo 3:
1 JOptionPane.showInputDialog(Componente padre, Mensaje);
Mtodo 4:
Mtodo 5:
Mtodo 6:
String[] carreras = {
1
"Ingeniera en sistemas computacionales",
2
"Ingeniera industrial",
3
"Ingeniera en mecatrnica",
4
"Ingeniera en informatica",
5
"Ingeniera petroqumica"
6
};
7
MyIcon icon = new MyIcon();
8
String resp = (String) JOptionPane.showInputDialog(null, "Seleccione una carrera a
9
cursar", "Carrera", JOptionPane.DEFAULT_OPTION, icon, carreras, carreras[0]);
siguiente: Excelente
presentacin para un cuadro de dialogo
showConfirmDialog
Una vez que hemos dominado los mtodos anteriores, utilizar un
showConfirmDialog es super sencillo, este, cuenta con cuatro
sobrecargas del mtodo, y los veremos de manera super rpida,
para esto hagamos una clase con cualquier nombre (en mi caso
showConfirmDialog) y pongamosle un mtodo main para comenzar
a trabajar, y veamos como funcionan estos mtodos:
Mtodo 1:
Mtodo 2:
showOptionDialog
El mtodo anterior, nos enseo una manera de darle a escoger al
usuario mas de una opcin en una ventana de dialogo, como una
manera ms personalizada de hacer esto, podemos utilizar el
mtodo showOptionDialog que nos proporciona JOptionPane,
este mtodo no tiene sobrecarga y cuenta con los siguientes
parmetros.
Los nicos que hay que dejar en claro despus de leer este post
son el tipo de seleccin, que utilizamos un tipo de seleccion como
el del showConfirmDialog, el tipo de mensaje que ya sabemos cual
es, y las opciones, que es un arreglo con las opciones que se le
mostraran al usuario y por ultimo, el valor por default, cabe
destacar, que este mtodo, devuelve un valor en int del valor que
haya seleccionado el usuario, veamos un ejemplo de esto:
http://youtube.com/watch?v=hBewvo8KS6E
http://youtube.com/watch?v=QvlBuCpM1xo
http://youtube.com/watch?v=hBewvo8KS6E&t=982s
http://youtube.com/watch?v=xuO94ROMCsE
http://youtube.com/watch?v=_AtUevapQ80
http://youtube.com/watch?v=yzucvVv4dWI
http://youtube.com/watch?v=G4EgwvdMFKI
http://youtube.com/watch?v=4YkUYcczW2Y
localhost/phpmyadmin/index.php?db=dodega&token=da372931a29453d249d100742879dc4c
<?php
/* Servers configuration */
$i = 0;
$cfg['blowfish_secret'] = 'h]C+{nqW$omNoTIkCwC$%z-LTcy%p6_j$|
$Wv[mwngi~|e'; //What you want
$cfg['MySQLManualBase'] = 'http://dev.mysql.com/doc/refman/5.7/en/';
/* End of servers configuration */
?>
<?php
/* Servers configuration */
$i = 0;
$cfg['blowfish_secret'] = 'h]C+{nqW$omNoTIkCwC$%z-LTcy%p6_j$|
$Wv[mwngi~|e'; //What you want
/* Server: localhost [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'localhost';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
$cfg['Servers'][$i]['AllowNopassword'] = 'true';
$cfg['MySQLManualBase'] = 'http://dev.mysql.com/doc/refman/5.7/en/';
/* End of servers configuration */
?>
http://localhost/phpmyadmin/sql.php?
server=1&db=registro&table=personal&pos=0&token=5ee4cb8e277f3ae81794c36a1e8a6dda