Java con conexión a MySql

Buenas, para continuar la saga de clases que se conectan a MySql, hoy toca la versión para Java.

Preparativos

Para que funcione hay que bajarse el JDBC Driver for MySQL (Connector/J) desde la página web de MySql: http://www.mysql.com/products/connector/

Para el desarrollo yo utilizo NetBeans 6, no se si hay diferencia con otras herramientas pero por si acaso: http://www.google.es/url?q=http://www.netbeans.org/downloads/&ei=nUhOSpmCNNKNjAfU_JCrBQ&sa=X&oi=smap&resnum=1&ct=result&cd=1&usg=AFQjCNFc4ieVaELXOjfcaDa-Evb8sT2lZw

Incluir JAR

Del conector descargado desde MySql solo nos interesa el archivo Jar, que tiene una estructura de nombre parecida a esta: ‘mysql-connector-java-5.1.7-bin.jar’. Lo extraemos del empaquetado descargado y lo colocamos en la carpeta de nuestro proyecto en Java.
Luego, con el NetBeans y el proyecto abierto allí, damos click derecho sobre la carpeta ‘Biblioteca’ de nuestro proyecto y hacemos click en ‘Agregar JAR/Carpeta…’, allí seleccionamos el archivo JAR extraído y le indicamos a NetBeans que utilice rutas relativas (por eso he comentado de pegarla en la carpeta de proyecto).

Classe conexión Java con MySql

/*
* conexion.java
* Maneja la conexión con mysql y todas sus operaciones (select, insert,update y
* delete).
*
* Necesita el conector J.
* Bajar el conector J de mysql.
* NetBeans: boton derecho sobre Biblioteca->Agregar JAR
*/

package mysql;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class conexion {

private Connection conn;
private Statement stmt;

/*
* Constructor
* Necesita como parametros los datos de conexión a Base de Datos.
* El método constructor inicializa las dos variables de clase, conexion y
* statement.
*/
public conexion(String server, String user, String pass, String db){
//Ruta de conexion. Conecta al server especificado y la Base de datos
String url = “jdbc:mysql://”+server+”/”+db;
try{
//Instanciación del conextor jdbc
Class.forName(“com.mysql.jdbc.Driver”).newInstance();
//Realiza la conexión con la base de datos, es variable de clase privada.
conn = DriverManager.getConnection(url, user, pass);
//Crea un ejecutador de sentencia, es variable de clase privada.
stmt = conn.createStatement();
}catch(Exception e){
//Error generico.
e.printStackTrace();
}
}

/*
* getConexion()
* Devuelve la variable privada del tipo Connection.
*/
private Connection getConexion(){
return this.conn;
}

/*
* getStatement()
* Devuelve la variable privada del tipo Statement.
*/
private Statement getStatement(){
return this.stmt;
}

/*
* select(String sentencia)
* Dada una sentencia SQL del tipo select, devuelve un ResulSet con los
* resultados de la consulta.
*/
public ResultSet select(String sentencia){
ResultSet rs = null;
try {
rs = this.getStatement().executeQuery(sentencia);
} catch (SQLException ex) {
Logger.getLogger(conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return rs;
}

/*
* manipuladorDatos(String sentencia)
* Soporta sentencias del tipo insert, update y delete.
* Dada la sentencia, la ejecuta.
* Devuelve false si no ha funcionado, true si todo ha ido correcto.
*/
public boolean manipuladorDatos(String sentencia){
boolean rs = false;
try {
rs = this.getStatement().execute(sentencia);
} catch (SQLException ex) {
Logger.getLogger(conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return rs;
}

/*
* numeroFilas(String sentencia)
* Devuelve el numero de filas devueltas por una sentencia sql.
*/
public int numeroFilas(String sentencia){
ResultSet rs = null;
int numero = 0;
try {
rs = this.getStatement().executeQuery(sentencia);
while(rs.next()){
numero++;
}
rs.close();
} catch (SQLException ex) {
Logger.getLogger(conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return numero;
}

/*
* cerrarConexion()
* Termina la conexión establecida en la instanciación de la clase.
*/
public void cerrarConexion(){
try{
this.getStatement().close();
this.getConexion().close();
}catch(Exception e){
e.printStackTrace();
}
}
}

¿Como usarla?

Voy a poner unos ejemplos de utilización desde un proyecto en el que usé el entorno visual swing como aplicación Java.

Aunque el NetBeans os avisará, necesitareis algunos de estos imports en el proyecto

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

¿Cómo hacer una sentencia SELECT?

/*
* Lineas para cargar la información del usuario de BBDD en las cajas
* de edición de usuario
*/
conexion cnx = new conexion(“localhost”,”root”,”",”java”);
ResultSet rs = cnx.select(“select * from usuarios where idUsuario=”+idUsuario);
try {
while (rs.next()) {
jTextField1.setText(rs.getString(“user”));
jPasswordField1.setText(rs.getString(“pass”));
break;
}
} catch (SQLException ex) {
Logger.getLogger(Interior.class.getName()).log(Level.SEVERE, null, ex);
}
cnx.cerrarConexion();

¿Cómo hacer una sentencia UPDATE, INSERT o DELETE?

conexion cnx = new conexion(“localhost”,”root”,”",”java”);
boolean rs = cnx.manipuladorDatos(“UPDATE usuarios SET user=’”+usuario+”‘,pass=’”+passwd+”‘ where idUsuario=”+this.idUsuario);
cnx.cerrarConexion();

——

conexion cnx = new conexion(“localhost”,”root”,”",”java”);
cnx.manipuladorDatos(“Delete from gestion where idUsuario=”+this.idUsuario+” and idEntrada=”+id);
cnx.cerrarConexion();

——

conexion cnx = new conexion(“localhost”,”root”,”",”java”);
cnx.manipuladorDatos(“Insert into gestion values(‘0′,’”+this.idUsuario+”‘,’”+web+”‘,’”+user+”‘,’”+pass+”‘)”);
cnx.cerrarConexion();

Explicación

Como veis, hay dos métodos principales de interacción con el sistema gestor mysql, uno es el consultar(sql) y otro el manipuladorDatos(sql).

Mientras el consultar devuelve un ResultSet, con los datos obtenidos por una SELECT, para ser recorrido de la forma que interese, el manipuladorDatos(sql) devuelve un boolean indicando si ha ido o no ha ido bien la sentencia lanzada.

Por lo tanto, las selects se tratan con el método consultar(), y las sentencias update, delete y insert con el manipuladorDatos().

Además incluyo un método para consultar el número de filas que devuelve una sentencia SQL, en la que solo tienes que pasar una sentencia del tipo select, y devuelve un integer con el resultado.

Espero que os sea útil y si teneis dudas… no dudéis y comentar ;)

Dejar un comentario

Visual Basic .NET con Mysql, todas las operaciones

Clase conexión MySql

Hace un tiempo hice una nueva clase para conectar con mysql, realizar select, delete, update… en fin, todo lo que se puede necesitar para conectar un programa VB.NET con Mysql.

Imports MySql.Data.MySqlClient ‘llamo a la referencia agregada en (Proyecto->Agregar referencia->Examinar->MySql.Data.dll)

”’ <summary>
”’ Establece una conexión con un servidor del tipo MySql
”’ </summary>
”’ <remarks></remarks>
Public Class ConexionMySql
Private conexion As MySqlConnection ‘gestiona la conexion a la Base de Datos

Private db As String ‘guardaremos el nombre de la BBDD que servira para el método ultimo_id

”’ <summary>
”’ Parámetros de inicialización
”’ </summary>
”’ <param name=”server”>Dirección del servidor(pj. “localhost”)</param>
”’ <param name=”user”>Usuario (pj. “mi_usuario”)</param>
”’ <param name=”pass”>Contraseña (pj. “mi_contraseña”)</param>
”’ <param name=”db”>Base de datos (pj. “mi_base_datos”)</param>
”’ <remarks></remarks>
Public Sub New(ByVal server As String, ByVal user As String, ByVal pass As String, ByVal db As String)
Me.conexion = New MySqlConnection()
conexion.ConnectionString = “server=” & server & “;” & “user id=” & user & “;” & “password=” & pass & “;” & “database=” & db
Try
conexion.Open()
‘MessageBox.Show(“Conexión Abierta Con Éxito”)
Catch mierror As MySqlException
MessageBox.Show(“Error de Conexión a la Base de Datos: ” & mierror.Message)
Finally
‘conexion.Dispose()
End Try
Me.db = db
End Sub

”’ <summary>
”’ Realiza una consulta a la base de datos y devuelve un DataReader
”’ </summary>
”’ <param name=”sentenciaSql”>Sentencia SELECT a realizar</param>
”’ <returns>MySqlDataReader</returns>
”’ <remarks></remarks>
Public Function consulta(ByVal sentenciaSql As String) As MySqlDataReader
Dim lectura As MySqlDataReader
lectura = montadorSentencia(sentenciaSql).ExecuteReader() ‘ le digo a la variable lectora que lo que tiene que recojer es la ejecucion de la variable comandos
Return lectura ‘retorno una variable del tipo MysqlDataReader
End Function

”’ <summary>
”’ Realiza sentencias del tipo UPDATE o DELETE
”’ </summary>
”’ <param name=”sentenciaSql”>Sentencia INSERT, UPDATE o DELETE a realizar</param>
”’ <returns>Integer</returns>
”’ <remarks></remarks>
Public Function manipuladorDatos(ByVal sentenciaSql As String) As Integer
Dim a As Integer = montadorSentencia(sentenciaSql).ExecuteNonQuery() ‘ le digo a la variable lectora que lo que tiene que recojer es la ejecucion de la variable comandos
Return a
End Function

‘Método privado que monta la sentencia en la variable del tipo Command
Private Function montadorSentencia(ByVal sentenciaSql As String) As MySqlCommand
Dim comandos As New MySqlCommand()
comandos.CommandText = sentenciaSql
comandos.CommandType = CommandType.Text
comandos.Connection = conexion

Return comandos
End Function

”’ <summary>
”’ Para poder saber el ultimo ID auto incremental insertado en una tabla
”’ </summary>
”’ <param name=”tabla”>Tabla a saber el ultimo ID</param>
”’ <returns>Integer con el ID</returns>
”’ <remarks></remarks>
Public Function ultimo_id(ByVal tabla As String) As Integer
Dim ultimoId As Integer
Dim lectura As MySqlDataReader

lectura = Me.consulta(“select auto_increment from information_schema.tables where TABLE_SCHEMA=’” & Me.db & “‘ and TABLE_NAME=’” & tabla & “‘”)

While lectura.Read()
ultimoId = lectura.GetString(“auto_increment”) – 1
Exit While
End While

lectura = Nothing

Return ultimoId
End Function

”’ <summary>
”’ Cierra la conexión con la base de datos
”’ </summary>
”’ <remarks></remarks>
Public Sub cerrarConexion()
Me.conexion.Close()
End Sub

End Class

¿Como utilizar la clase?

Aquí unos ejemplillos:

INSERT, UPDATE y DELETE: el método manipularDatos unicamente lanza una consulta contra la base de datos, sin esperar recibir datos de filas como devolveria una select.

Dim cnx As ConexionMySql ‘variable conexion
cnx = New ConexionMySql(server, user, pass, bbdd)

cnx.manipuladorDatos(“INSERT INTO partida(nombre,jugadorBlanco,jugadorNegro,fecha) VALUES(‘” & txtNombre.Text & _
“‘,’” & txtJugadorBlanco.Text & “‘,’” & txtJugadorNegro.Text & “‘,’” & txtFecha.Text & “‘)”)

Dim idPartida As Integer = cnx.ultimo_id(“partida”) ‘recupero el id de partida recien insertado

‘cerrar conexion con mysql
cnx.cerrarConexion()

——-

cnx = New ConexionMySql(server, user, pass, bbdd)
cnx.manipuladorDatos(“delete from partida where idPartida=” & arrayCadena(0))
cnx.cerrarConexion()

SELECT

Dim cnx As ConexionMySql   ‘objeto

cnx = New ConexionMySql(server, user, pass, bbdd)
Dim lect As MySqlDataReader ‘variable lectora
lect = cnx.consulta(“select * from partida where 1″)
While lect.Read <> False
ListBox1.Items.Add(lect.GetString(“idPartida”) & “_” & lect.GetString(“nombre”) & “_” & lect.GetString(“jugadorBlanco”) _
& “_” & lect.GetString(“jugadorNegro”) & “_” & lect.GetString(“fecha”))
End While
cnx.cerrarConexion()

Sólo hay un apunte a resaltar en la utilización del método manipularDatos(). Y es que si vas a lanzar mas de una operacion de manipularDatos seguida, siempre hay que cerrar la conexión con cnx.cerrarConexion() y volver a instanciar el objeto para poder volver a llamar al manipularDatos(), si no el conector de mysql se vuelve loco y lanza una excepción extraña. Si sabeis la solucion para que sin cerrar se puedan lanzar dos manipularDatos() seguidos avisad!

Ésta nueva clase permite hacer todas las sentencias, la única cosa a tener en cuenta es que las selects van por el método consulta, y todo lo demás que no retorna mas que si ha ido bien o mal, van por el método manipuladorDatos.

Incluye un método que te retorna el ultimo id asignado a una tabla.

Si no se quisiera poder conectar con multiples usuarios en cada instanciación, solo habria que quitar los parametros del constructor, y establecerlos a mano en la sentencia de conexión.

La he dejado bastante abierta a cambios, espero que os sirva de ayuda!

Os dejo aquí de nuevo la descarga de la DLL: http://www.megaupload.com/?d=50P5FXVZ

Cualquier cosa comentar!

Comentarios (3)

10 buenos hacks para CSS

1. Vertical align div

http://stylizedweb.com/2008/02/01/vertical-align-div/

2. Min-Height

selector {
min-height:500px;
height:auto; !important
height:500px;
}

3. PNG transparency

http://stylizedweb.com/2007/12/30/png-transparency-issues/

4. Autoclear

.container:after {
content: “.”;
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.container {display: inline-table;}
/* Hides from IE-mac \*/
* html .container {height: 1%;}
.container {display: block;}
/* End hide from IE-mac */

5. Reset CSS

body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,
fieldset,input,p,blockquote,th,td {
margin:0; padding:0;
}
table {border-collapse:collapse;border-spacing:0;}
fieldset,img {border:0;}
address,caption,cite,code,dfn,em,strong,th,var {
font-style:normal;font-weight:normal;
}
ol,ul {list-style:none;}
caption,th {text-align:left;}
h1,h2,h3,h4,h5,h6 {font-size:100%;}
q:before,q:after {content:”;}

6. Scrolling Render IE

html {
background : url(null) fixed no-repeat;
}

7. Opacity

#transdiv {
filter:alpha(opacity=75);
-moz-opacity:.75;
opacity:.75;
}

8. PRE Tag

pre {
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}

9. Li Background Repeat IE

<!–[if lt IE 7]>
<style>
#leftnav li { zoom: 1;} /* haslayout=true */
</style>
<![endif]–>

10. Good to know

@charset “UTF-8″;

/* ———————————————————————-
WinIE7
———————————————————————- */
*:first-child+html selector{property:value;}

/* ———————————————————————-
WinIE6 & Mac IE
———————————————————————- */
* html selector{property:value;}

/* ———————————————————————-
WinIE6
———————————————————————- */
/*\*/
* html selector{property:value;}
/**/

/* ———————————————————————-
MacIE
———————————————————————- */
/*\*//*/
selector{property:value;}
/**/

Dejar un comentario

Obtener la dirección IP en Visual Basic .net 2005

Aquí dejo una función para obtener los datos referentes a la maquina local en Visual Basic .NET 2005:

Private Sub ObtenerDatos()
        Dim nombreHost As String = System.Net.Dns.GetHostName
        Dim hostInfo As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(nombreHost)

        lblNombreHost.Text = "El nombre de tu maquina es: " & hostInfo.HostName.ToString
        For Each ip As System.Net.IPAddress In hostInfo.AddressList
            lblDireccionHost.Text = "Tu direccion IP local es: " & ip.ToString
        Next
End Sub

Comentarios (6)

Visual Basic .Net con MySQL, como usarlo

Nueva versión propia de la clase de conexión a mysql aquí

En este post resumire un poco las distintas cosas que se pueden hacer, con mucho codigo y poca explicacion, porque de hecho no hay mucho que explicar, las consultas son con SQL puro y duro, y el visual… es visual!

Antes de nada recordar que para establecer una conexion con la base de datos se requiere la DLL que os adjunto. Una vez la tengais la colocais donde os vaya mejor, y desde el proyecto de visual basic haceis:

Proyecto->Agregar referencia…-Examinar, y la cargais.

La DLL la he colgado aqui:

http://www.pooox.es/MySql_Data.rar

Una vez hecho esto os cuento que hice yo:

1. Añadi la siguiente linea en el codigo de los formularios que manejan algo con base de datos:

Imports MySql.Data.MySqlClient

2. Hice una clase que manipulaba los datos, la cual la instancio desde el Form_Load(). La clase la llamo ‘consultas’, lo siguiente es un copiar y pegar de mi codigo:

http://www.pooox.es/consultas.txt

3. Desde el formulario principal, creo una variable del tipo consultas, la hago como global por preferencia mia. Despues uso la clase cuando necesito usarla, creo que no tiene perdida. Hice que las SELECT de la classe consultas devolviera una variable del tipo MysqlDataReader, con lo que siempre que se quiera recuperar los datos de una consulta habra que crear dicha variable en el formulario, o hacerla global y te olvidas.

Aqui os dejo la primera parte de mi formulario por si hay dudas:

Imports MySql.Data.MySqlClient  

Public Class Form1 

Dim cons As consultas
Dim lectura As MySqlDataReader 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles MyBase.Load

cons = New consultas("localhost", "nick","contraseña") 

lectura = cons.consulta("grupos")

Dim i As Integer
Try

For i = 0 To lectura.FieldCount - 1
lectura.Read()

ComboBox1.Items.Add(lectura.GetValue(1).ToString())

Next

Catch ex As MySqlException

End Try

lectura.Close()

End Sub

Si sirve de referencia, cabe decir que todo esto lo he hecho en local, con el xampp instalado que ya tiene el apache y el phpmyadmin instalados.

Para cualquier duda o sugerencia sobre esta mini explicacion hacermelo saber!
Espero que os sirva de mucho!

Comentarios (26)

« Entradas más recientes · Entradas más antiguas »