Archivo

Posts Tagged ‘mysql’

MySQL Mapping DataBase

noviembre 15, 2010 1 comentario

Mucho tiempo sin escribir, Estaba trabajando en ATLConsultores , con DTE del SII y muchas cosas en DuocUC
Ademas, estaba haciendo un sistemita en PHP para Mapear y asi poder crear Modelo,Controlador y Vistas (MVC) a partir de la estructura de una base de datos en MySQL.

Aqui dejare las consultas SQL del Mapeador para que la ocupen en algunos proyectos…

Mostrar Todas las tablas de una base de datos

SHOW TABLES

Muestra la estructura de una tabla

DESC <NombreTabla>

Obtener las Constraints de una Tabla (FK,UNIQUE,DELETE-UPDATE ON CASCADE)

SELECT 	K.constraint_name,
		K.table_name 	AS 'local_table',
		K.column_name 	AS 'local_column',
		K.referenced_table_name		AS	'foreign_table',
		K.referenced_column_name	AS	'foreign_column',
		RC.update_rule,
		RC.delete_rule,
		RC.unique_constraint_name 
	FROM 	information_schema.referential_constraints RC 
		INNER JOIN information_schema.key_column_usage K 
		ON K.constraint_name = RC.constraint_name 
		WHERE 	K.table_name = '<NombreTabla>' 
		AND	RC.constraint_schema='<BaseDeDatos>'

Bueno , ese es mi aporte , espero que les sirva…

Saludos!

Categorías:SQL Etiquetas: , , , ,

Java Persistence: Crea Aplicaciones Rapidamente [Netbeans+Java+Mysql+TopLink]

Supongamos que tenemos una base de datos y de las tablas de esa base de datos queremos armar una aplicación.
Las Tablas son 2:

  • pais
  • ciudad
CREATE TABLE pais (
	p_id VARCHAR(3) NOT NULL,
	p_nombre VARCHAR(25),
	PRIMARY KEY (p_id)
);
CREATE TABLE ciudad (
	c_id VARCHAR(2) NOT NULL,
	c_nombre VARCHAR(25),
	p_id VARCHAR(3) ,
	c_habitantes INT,
	PRIMARY KEY (c_id) ,
	FOREIGN KEY(p_id) REFERENCES pais(p_id)
);

Esas tablas contienen los siguientes registros:

INSERT INTO pais VALUES('001','Chile');
INSERT INTO pais VALUES('002','Venezuela');
INSERT INTO pais VALUES('003','EEUU');
INSERT INTO pais VALUES('004','Francia');

INSERT INTO ciudad VALUES('01','Concepcion','001',222232);
INSERT INTO ciudad VALUES('02','La serena','001',234445);
INSERT INTO ciudad VALUES('03','Valparaiso','001',123434);
INSERT INTO ciudad VALUES('04','Maracaibo','002',89212);
INSERT INTO ciudad VALUES('05','Caracas','002',233456);
INSERT INTO ciudad VALUES('06','Nueva York','003',445212);
INSERT INTO ciudad VALUES('07','Washington','003',235211);
INSERT INTO ciudad VALUES('08','Paris','004',232452);
INSERT INTO ciudad VALUES('09','San Huano','003',445212);

Para crear una aplicación en Java deberiamos comunmente armar un sistema en 3 capas y crear clases para conexión, manipulacion de datos, etc… como lo hacia en este post: https://estebanfuentealba.wordpress.com/2009/03/12/mysql-java-netbeans-conectar-a-una-base-de-datos-con-java/

Bueno en este post mostraré como crear una aplicacion en simples pasos sin necesidad de mucho programar con Java Persistence.

1.- Creamos un proyecto Java Aplication

2.- Le Asignamos un Nombre a nuestro proyecto y Finalizamos

3.- Ahora agregaremos a nuestro proyecto una conexión a nuestra base de datos, Para eso vamos a la pestaña Services, damos click derecho a Databases y presionamos New Connection…

4.- Ahora Configuramos; Seleccionamos el driver de MYSQL y completamos con los datos de la base de dato yFinalizamos.

5.- Ahora vamos a la pestaña Proyects, click derecho en Libraries y Add Library...

Agregaremos el Driver de MySQL y TopLink


Ahora ya podemos empezar a trabajar. Ahora agregaremos clases a nuestro proyecto. TopLink puede mapear la base de datos y transformar bd relacional a programación objetual. Para eso agregamos a nuestro proyecto una clase mapeada de la base de datos llamada Entity Clases From Data Base…

Nos pedirá la conexión y según ésta nos mostrará las tablas. Agregamos las tablas que deseamos ocupar en nuestro Proyecto y damos a Next.

Las tablas se mapearán y se convertirán en Clases , ahora nos pedirá el nombre que tendrán esas Clases mapeadas… Luego configuramos Persistence Unit… (Necesario para percistence)

Seleccionamos TopLink como Persistence Library y precionamos Create

Por Último presionamos Finish

Si todo sale Bien se habrán creado las clases que fueron mapeadas desde la base de datos

Ahora podemos empezar a programar :P , en este mini tutorial crearé el siguiente programa.

Un combobox con todos los países de la base de datos, al seleccionar algún país mostrará todas las ciudades asociadas a ese país.

Agregamos a nuestro proyecto un JFrame Form y agregamos JComboBox,JList y los JLabel’s correspondientes.

Agregamos los siguientes Atributos al JFrame Form:

    private EntityManagerFactory emf;
    private EntityManager em;

Ahora en el constructor del JFrame Form agregamos las siguientes lineas

    public NewJFrame() {
        initComponents();
        //inicializamos el EntityManagerFactory
        emf = Persistence.createEntityManagerFactory("TestPU");
        //inicializamos entity manager
        em = emf.createEntityManager();
        //Agregamos un Model al JList
        jList1.setModel(new DefaultListModel());
        //Posicionamos la ventana en el centro
        this.setLocationRelativeTo(null);
        //Llamamos al metodo que llena el combobox con paises
        loadComboBox();
    }

Ahora creamos el método loadComboBox que carga los países al combobox.

    public void loadComboBox() {
        //Creamos una Query
        //"Pais.findAll" es una query que fue definida automaticamente gracias al mapeo de la db
        //Luego obtenemos los resultados y los recorremos
        Iterator it = em.createNamedQuery("Pais.findAll").getResultList().iterator();
        while(it.hasNext()) {
            //Agrego el resultado al Combobox
            this.jComboBox1.addItem(((Pais)it.next()));
        }
    }

Ahora agregamos un evento al JCombobox para que al seleccionar cualquier Item llene el JList con las ciudades del País Seleccionado. El evento que usaremos es itemStateChanged

    private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
        if(evt.getStateChange() == 1) {
            //Creamos una Query con una consulta ya definida ""Ciudad.findByPId"
            Query query = em.createNamedQuery("Ciudad.findByPId");
            //Esa query requiere pasarle un valor "pId" , la id del Pais
            query.setParameter("pId", ((Pais)this.jComboBox1.getSelectedItem()).getPId());
            //Elimino todos los elementos agregados al Modelo del JList
            ((DefaultListModel)jList1.getModel()).removeAllElements();
            //Recorro los resultados de la Query
            Iterator it = query.getResultList().iterator();
            while(it.hasNext()) {
                //Agrego el resultado a la JList
                ((DefaultListModel)jList1.getModel()).addElement(((Ciudad)it.next()));
            }
        }
    }

Ahora cambiamos los metodos toString() de Ciudad y Pais para que muestre los nombres de Ciudad y Pais respectivamente.

Con eso ya tenemos una aplicación funcional, sin tocar SQL ya podemos manipular los datos de nuestra base de datos.

Con esto también podemos Agregar datos a la base de datos con solo crear objetos de las Entity Class y hacer otro tipo de consultas.

Espero que sirva de algo este mini tutorial, ahora pueden investigar mas sobre Java Persistence.

Codigo de Fuente: Test.Persistence.EstebanFuentealba.rar

Saludos

Categorías:Java Etiquetas: , , , , , ,

Creando Un mini WebService en PHP -> JSON-JSONP

Bueno hoy un poco aburrido hice este pequeño código en PHP para crear un mini WebService JSON-JSONP con base de datos ya creadas.

Para eso usaré una clase muy buena para la Base de datos “mysql-database-class-wrapper“. Para esa clase hice una función que consulta, y los resultados  los muestra como JSON o JSONP, acá la “function”:

#-#############################################
# autor: Esteban Fuentealba
# description: Con esta funcion podrás consultar y devolver el resultado en JSON
# params: Consulta SQL, nombre del callback
# returns: JSON
function query2JSON($sql,$callback='') {
	$rows = $this->fetch_all_array($sql);
	$total_rows=count($rows);
	$i=0;
	$str=$callback."({\r\n\tstatus: \"".(($this->query_id != 0) ? 1 : 0)."\",\r\n\titems: [";
	foreach($rows as $k){
		$j=0;
		$total_colums = count($k);
		$str .= "\r\n\t\t{ ";
		foreach($k as $key => $val) {
			$str .= $key." : \"".$val."\"";
			$j++;
			if($j<$total_colums) $str .= ",";
		}
		$str .= " }";
		$i++;
		if($i<$total_rows) $str .= ",";
	}
	$str .="\r\n\t]\r\n})";
	return $str;
}

Con la clase DataBase.class.php lista ahora vamos a nuestra base de datos y creamos una nueva tabla

CREATE TABLE Method (
			name	VARCHAR(100) PRIMARY KEY,
			tabla	VARCHAR(100),
			sentence	TEXT
		);

Ésta tabla guardará todos los métodos de nuestro WS casero xD.

Ahora vamos con el codigo en PHP , este archivo recibirá los parámetros por el metodo GET y me mostrará los resultados en JSON.

<?PHP
	//###
	//	@Autor	: 	Esteban Fuentealba
	//	@Url	:	https://estebanfuentealba.wordpress.com/
	//	@Email	:	mi [dot] warezx [at] gmail [dot] com
	// Ejemplo:		api.php?method=user.getNombre&id=<rut>
	//###

	//## Configuracion de la Base de datos
	require_once 'config.inc.php';
	//## Clase Base de Datos
	require_once 'class/Database.class.php';
	//## Obtengo los parametros pasados por el metodo GET
	$params	= $_GET;
	//## Si los parametros son mas de 0
	if(count($params) > 0) {
		//## Creo un objeto de Base de datos, con los parametros de configuración
		$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
		$db->connect();
		/*
			CODE
			200 OK
			202	OK pero sin resultados
			404	Method no existe
			405 ERROR Method nombre
		*/
		if($params['method']) {
			/*
				## Corto el parametro method en '.' y asi obtengo:
					- [0] 	nombre de la Tabla
					- [1]	nombre del WebService
			*/
			$data = explode('.',$params['method']);
			if(count($data) == 2) {
				//## Compruebo si el metodo del WS existe en la base de datos
				$rows = $db->query_first("SELECT * FROM Method WHERE tabla='".$data[0]."' AND name='".$data[1]."'");
				if($rows['sentence']) {
					//## Busco y reemplazo los parametros {ejemplo} por los parametros pasados por metodo GET
					preg_match_all('#\{(.[^\}]+)\}#',$rows['sentence'],$r);
					$sentenceSQL = $rows['sentence'];
					foreach($r[1] as $param) {
						$sentenceSQL = str_replace('{'.$param.'}',(is_numeric($params[$param])) ? ((int)$params[$param]) : "'".$db->escape($params[$param])."'",$sentenceSQL);
					}
					if($db->affected_rows>0) {
						//## Consulto la bd segun la sentencia y los resultados los muestro como JSON
						echo $db->query2JSON($sentenceSQL,$params['callback']);
					} else {
						echo '{ status :"ok",code: 202 }';
					}
				} else {
					echo '{ status :"error",code: 406 }';
				}
			} else {
				echo '{ status :"error",code: 405 }';
			}
		} else {
			echo '{ status :"error",code: 404 }';
		}
		$db->close();
	}
?>

Con eso ya podemos Usar nuestro WebService. la forma de uso es la siguiente:
Ejemplo:

api.php?method=tabla.nombreMethod&param1=valor1&callback=holaMundo

Ahora dejaré 3 archivos que hice para testear y agregar WebServices (Usenlos solo para Agregar metodos a los WS y luego los eliminan ya que no están validadas ni limpiadas las consultas)

Primero dejo este archivo PHP que agregara los WS a nuestra base de datos
Archivo: addApi.php

<?PHP
	require_once 'config.inc.php';
	require_once 'class/Database.class.php';
	$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
	$db->connect();
	$name			= $_POST['name'];
	$tabla			= $_POST['tabla'];
	$query			= $_POST['query'];
	$in['name'] 	= $name;
	$in['tabla']	= $tabla;
	$in['sentence']	= $query;
	$db->query_insert('Method',$in);
	$db->close();
?>

Ahora les dejo el archivo que testea las consultas:
Archivo: queryTest.php

<?PHP
	require_once 'config.inc.php';
	require_once 'class/Database.class.php';
	$sql	= $_GET['query'];
	$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
	$db->connect();
	echo $db->query2JSON($sql);
	$db->close();
?>

y por ultimo la pagina con el formulario para crear los webservice

<html>
<head>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
	<script type="text/javascript">
		$(function() {
			getSQL("SHOW TABLES","json",function(data) {
				$.each(data.items,function(i,it) {
					if(it.Tables_in_api != 'method') {
						$('<option>').attr('value',it.Tables_in_api).append(
							it.Tables_in_api
						).appendTo(
							$('#tables')
						);
					}
				});
			});
			$('#tables').change(function() {
				var thisTable = $(this).val();
				if(thisTable != "-1") {
					var sql = 'SELECT ';
					var fields = new Array();
					getSQL("DESC "+thisTable,"json",function(data) {
						$.each(data.items,function(i,it) {
							fields.push(it.Field);
						});
						sql += fields+" FROM "+thisTable;
						$('#query').val(sql);
					});
				}
			});
			$('#query').keyup(function(event) {
				var url = $('#query').val();
				var re  = /\{(.[^\}]+)\}/g;
				var match;
				var html = $('<fieldset>').append('Parametros:').attr('id','parametros');
				while (match = re.exec(url)) {
					$('<div>').append(
						match[1]+" "
					).append(
						$('<input>').attr('type','text').attr('id','{'+match[1]+'}')
					).appendTo(html);
				}
				$('#params').html(html);
			});
			$('#qTest').click(function() {
				var sql = $('#query').val();
				$.each($('#parametros :input'),function(i,item) {
					sql = sql.replace($(this).attr('id'),$(this).val());
				});
				getSQL(sql,"html",function(data) {
					$('#out').html(data);
				});
			});
			$('#qAdd').click(function() {
				$.post('addApi.php',{
									name: $('#name').val(),
									tabla: $('#tables').val(),
									query: $('#query').val()
				},function(data) {
					$('#boxB').html('OK').hide('slow');
				});
			});
			$('#name').blur(function() {
				getSQL("SELECT * FROM Method WHERE name='"+$(this).val()+"' and tabla='"+$('#tables').val()+"'","json",function(data) {
					if(data.items.length > 0) {
						alert('Method ya existe');
						$('#name').val('');
					}
				});
			});
		});
		function getSQL(sql,type,callback) {
			$.ajax({
				type: "GET",
				url: 'queryTest.php',
				data: 'query='+sql,
				dataType: type,
				success: callback
			});
		}
	</script>
</head>
<body>
<form>
	<fieldset>
		WebService Name:
		<select id="tables">
			<option value="-1">Tablas:</option>
		</select>.<input type="text" id="name" />
	</fieldset>
	<fieldset>
		WebService Query:
		<textArea id="query" style="width: 100%; height: 50px;"></textArea>
	</fieldset>
	<div id="params"></div>
	<input id="qTest" type="button" value="Test Query" />
	<input id="qAdd" type="button" value="Agrega WebService" />
</form>
<div id="box">
	<textArea id="out" style="width: 100%; height: 500px;"></textArea>
</div>
<div id="boxB"></div>
</body>
</html>

Acá les dejo una ScreenShot del sistema montado en mi netbook.

Selecciono la tabla, le agrego un nombre a mi Method , ingreso la consulta SQL y testeo. La consulta SQL puede tener Parametros , ejemplo en la ScreenShot definí un parametro entre llaves {id}, ese parametro lo asignaré cuando llame al WebService api.php.Dejo el Ejemplo de la llamada al WebService en la siguiente Imagen:

En la tabla user tenía 2 registros la id=1 pertenece al usuario caca Bueno ese es un ejemplo básico, ustedes pueden darle el uso que quieran.

Espero que les sirva esta pequeña aplicación. solo es una idea y la primera versión, debe tener muchos errores pero si alguien quiere aportar con alguna idea o mejora estará bien.

Saludos!.

Demo WebService :

Codigo de Fuente WebService: Webservice.EstebanFuentealba.rar

Categorías:PHP Etiquetas: , , , , , , ,

MySQL + Java + NetBeans [ Conectar a una Base de datos con JAVA ]

Este es un tutorial de lo que aprendi hoy xD, muestra como conectar a una base de datos (MYSQL) usando como lenguaje de programacion JAVA y como IDE NetBeans.

Primero que todo debemos instalar en nuestras máquinas MySQL , yo tengo xUbuntu asi que lo instalo abriendo una Terminal y escribiendo lo siguiente:

sudo apt-get install mysql-server mysql-client

Una vez instalado se cambia la contraseña (password), para eso tecleamos:

sudo /usr/bin/mysqladmin -u root password 

cambiando <tuclave> por la contraseña … ejemplo:

sudo /usr/bin/mysqladmin -u root password 123456

y ya tienes instalado MySQL :D , para entrar solo teclea:

mysql -u root -p

Una vez dentro de la consola mysql podremos crear bases de datos, tablas, seleccionar, etc…
Para crear una base de datos se usa el comando

create database  ;

ejemplo:

create database test;

Para entrar a la base de datos creada usamos el comando

use  ;

ejemplo:

use test;

Ojo con los punto y comas “;
Ya dentro de la base de datos podremos ejecutar sentencias DDL y DML

Ahora para efecto del tutorial creamos dos tablas, una tabla alumno y otra tabla nota , cada nota tiene referenciado un rut de algun alumno.

en la misma consola escribimos:

CREATE TABLE alumno (
rut integer,
nombre varchar(100),
direccion varchar(100),
CONSTRAINT pk_alumno_rut PRIMARY KEY(rut)
);
CREATE TABLE nota (
rut integer,
nota double,
CONSTRAINT fk_nota_rut FOREIGN KEY(rut) REFERENCES alumno(rut)
);

ahora insertamos algunos datos a esas tablas

INSERT INTO alumno VALUES
(123456,"Esteban Fuentealba","Talcahuano lalal 368"),
(654321,"Juan Perez","Lalalala 87 chile"),
(47,"Homero Simpson","Avenida siempre viva,Springfield");

y por ultimo ingresamos algunas notas

INSERT INTO nota VALUES
(123456,7.0),
(47,3.5),
(654321,6.1);

Ahora, teniendo una base de datos poblada, nos vamos a netbeans y creamos un nuevo proyecto
File/New Proyect y seleccionamos Java / Java Aplication , Le ponemos cualquier nombre.

Aqui dejo el codigo comentado paso a paso:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package mysqljava;
/*
*  Importamos todas las clases el package java.sql
*/
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author esteban
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args)  {
/*
Declaramos una variable "con" del tipo Connection
con ello podremos conectarnos a la base de datos
*/
Connection con = null;
try {
/*
Seteamos el driver-libreria de nuestro motor que usaremos, MySQL
*/
Class.forName("com.mysql.jdbc.Driver").newInstance();
/*
Creamos la coneccion, pasamos como parametros:
* /
* jdbc:mysql://localhost/test
*
* 
* root
*
* 
* root
*/
con = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
if (con != null) {
/*
creamos un objeto Statement , con el podremos enviar al servidor sql  consultas
*/
Statement st = con.createStatement();
/*
Ahora enviaremos una consulta para seleccionar todos los alumnos y que nota se han sacado
y lo guardaremos en un objeto del tipo ResultSet
*/
ResultSet r = st.executeQuery("SELECT a.nombre as nombre, n.nota as nota FROM alumno a,nota n WHERE n.rut = a.rut ORDER BY n.nota");
/*
Iteramos el resultado para mostrar cada fila y especificamos que columna queremos con el metodo getString o getDouble segun este en la base de datos
*/
while(r.next()) {
/*
Imprimo por consola el nombre y la nota de todos los alumnos ingresados a la base de datos
*/
System.out.println("[Alumno: "+r.getString("nombre")+"] [Nota:"+r.getDouble("nota")+"]");
}
}
} catch (InstantiationException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}

}

Por ultimo, falta lo mas importante, agregar a nuestro proyecto los drivers de MySQL para ser usados con JAVA, el driver (libreria) la pueden descargar desde la pagina de MySQL .

Una vez descargado el mysql-connector-java-X.X.X lo descomprimen y lo agregan al proyecto:

Click derecho en Libraries / Add Jar-Folder y buscamos el archivo que descomprimimos , en mi caso agregue mysql-connector-java-5.1.7-bin.jar

Compilamos , Corremos la aplicacion y el resultado es algo como esto

init:
deps-jar:
compile:
run:
[Alumno: Homero Simpson] [Nota:3.5]
[Alumno: Juan Perez] [Nota:6.1]
[Alumno: Esteban Fuentealba] [Nota:7.0]
BUILD SUCCESSFUL (total time: 10 seconds)

Los alumnos ordenados por nota de menor a mayor xD
Descargar Codigo Fuente :
mysqljava

Espero que les sirva,

Saludos!.

Categorías:Java Etiquetas: , , , ,