Entradas con la etiqueta ‘mysql’

Insertar NULL en CSV para importarlo desde PHPMyadmin hacia MySQL

Lunes, 28 de Diciembre de 2009

Siguiendo con la importación de un Excel hacia Mysql, tenemos el problema de que los campos que no se han rellenado se insertan como “” (cadena vacía) o como 0 (cero) según sean texto o números lo que estamos insertando.

Bien, si queremos que se guarde un NULL debemos insertar el siguiente carácter: \N

Como en la anterior entrada, simple pero efectivo.

Quitar espacios entre números o palabras en excel (o calc)

Lunes, 28 de Diciembre de 2009

En una migración desde Excel a Mysql tenemos el problema de que en un campo numérico obtenemos espacios, y el entero se nos trunca. Lo que debería ser: 93 222 2222 se guarda como: 93 es decir, se trunca por el primer espacio que encuentra.

La manera más cómoda de solucionar este problema que he encontrado ha sido seleccionar la columna en cuestión y hacer un buscar/reemplazar de un espacio por nada.

Una vez hecho podemos guardar como CSV e importar desde phpmyadmin a nuetra base de datos mysql. Simple pero efectivo.

Java con MySql

Viernes, 3 de Julio de 2009

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 ;)

Consulta SQL para manejar intervalos de campos tipo fecha

Lunes, 4 de Agosto de 2008

Tenemos una tabla Mysql que contiene información sobre pedidos. Ésta dispone, entre otros, de un campo fecha del tipo datetime con la fecha y la hora en las que se registra cada pedido. Otro campo, del tipo int, determina el identificador del estado en que se halla cada pedido. Estamos interesados en realizar un script php para consultar cada día esta tabla y eliminar (o en nuestro caso, cambiarlos de estado) todos los pedidos realizados hace más de 7 días que todavía no hayan sido pagados. Es decir, el campo identificador del estado nos dará la información del pago.

La consulta SQL realizada es la siguiente:

UPDATE `Pedido` SET `idEstado` = ‘5′ WHERE (`idEstado` = 2) AND (`fecha` < DATE_SUB(CURDATE(), INTERVAL 7 DAY))

Con esta consulta UPDATE simplemente estamos actualizando el estado de los pedidos que se hallan en estado 2 (estado pendiente de pago) y que el campo fecha indica que fueron registrados anteriormente al periodo comprendido entre la fecha actual y los últimos 7 días. Los registros que cumplen estas condiciones pasarán a estado 5 (estado de cancelado, descartado o anulado).

Como se puede observar, ha sido preciso utilizar la función de Mysql DATE_SUB. Esta función necesita dos argumentos: una fecha de inicio y un parámetro de intervalo de tiempo para establecer un período pasado a partir de la fecha de inicio. Si se desea hacer lo mismo pero haciendo que el intervalo sea futuro a partir de la fecha de inicio (en vez de pasado) existe la función análoga la cual se llama DATE_ADD y precisa exactamente de los mismos argumentos. Esta función nos ha permitido efectuar operaciones de comparación con fechas.

En nuestro caso particular los parámetros que le hemos pasado a la función han sido:

  • fecha de inicio: CURDATE(). Esta función devuelve la fecha actual.
  • intervalo: INTERVAL 7 DAY. Instrucción que configura el intervalo.

Para ver como configurar el argumento del intervalo y conocer más detalles de estas dos funciones podéis hacer click aquí.

Si queréis ver como disparar automáticamente en el servidor un script php podéis consultar la entrada ejecutar diariramente un fichero PHP mediante crontab + wget.