Siguiendo con el tema de JDBI está ocasión veremos una pequeña aplicación del tipo CRUD (altas, bajas, consultas y modificaciones).
Necesitamos crear una base de datos;
CREATE DATABASE test;
Una vez creada procedemos a seguir con estos pasos.
- Crear un archivo *.sql llamado bien.sql para la creación de la tabla
- Crear una BD en MySQL
- Usar el archivo *.sql de la siguiente manera: $ mysql -u USUARIO -pCLAVE test < bien.sql
- Crear un archivo froovy llamado Dao2.groovy
- Importar las librerías necesarias para manipular datos y crear un log: jdbi, slf4j, y mysql mediante @Grapes
- Crear una interface llamada BienDAO; esta interface contendrá los métodos con las declaraciones necesarias para la gestión de los datos
- Crear una clase serializable llamada ModeloBien
- Crear una clase que implemente la interface ResultSetMapper
- Crear una clase principal (en este caso tendrá el mismo nombre del archivo)
CREATE TABLE IF NOT EXISTS bien(id int auto_increment primary key,numero int, usuario varchar(45), password varchar(32), maquina ENUM('pc','macosx','laptop_pc','laptop_macosx','movil'), sistema ENUM('windows','macosx','linux','android'), area ENUM('direccion','sistemas','soporte','hemeroteca','evaluacion','investigacion'), ip varchar(15), no_bien varchar(45));
INSERT INTO bien (numero, usuario, password, maquina, sistema, area, ip, no_bien) VALUES ('39','Yuri Gagarin','5432','pc','windows','sistemas','148.215.24.39','7749'),('36','Maria Petrovska','009GT2b','pc','linux','hemeroteca','148.215.24.36','7767'),('90','Tulio Alvarez','$36@L77','laptop_macosx','macosx','investigacion','172.215.22.25','4343');
UPDATE bien SET area='investigacion' WHERE id=2;
UPDATE bien SET area='soporte' WHERE id=1;
DELETE FROM bien WHERE id=3;
SELECT * FROM bien;
$ mysql -u TUUSUARIO -pTUCLAVE test < bien.sql
Esto nos permitirá cargar los datos contenidos en el archivo.
El programa consiste en un menú que te dará las opciones de insertar, consultar por id, consultar todos los registros, actualizar los datos por id y eliminar datos por id.
compilar: groovyc Dao2.groovy
ejecutar: groovy Dao2.groovy TUUSUARIO TUCLAVE
Ejemplo de uso y salida:
$ mysql -u root -p5432 test < bien.sql
$ groovyc Dao2.groovy
$groovy Dao2.groovy root 5432
[main] INFO jdbi - Iniciando script ...
[main] INFO jdbi - usuario: root
[main] INFO jdbi - password: 5432
******* Menu *******
1. Insertar datos
2. Consultar datos por id
3. Consultar total de datos
4. Actualizar datos por id
5. Eliminar datos por id
6. Salir
*******************************
Escoge una opción:2
[Consulta por id]
Escribe el id:
2
>> Id: 2
>> Número: 36
>> Usuario: Maria
>> Password: 009GT2b
>> Máquina: pc
>> Sistema: linux
>> Área: investigacion
>> Ip: 148.215.24.36
>> No_bien: 7767
Búsqueda realizada
******* Menu *******
1. Insertar datos
2. Consultar datos por id
3. Consultar total de datos
4. Actualizar datos por id
5. Eliminar datos por id
6. Salir
*******************************
Escoge una opción:
Dao2.groovy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
*@author Codemonkey Junior Blogspot | |
*@description Uso de JDBI | |
*/ | |
//compilación: groovy Dao2.groovy | |
//ejecución: groovy Dao2.groovy rootMySQL clave | |
@Grapes( [ | |
@Grab(group='org.slf4j', module='slf4j-api', version='1.7.25'), | |
@Grab(group='org.slf4j', module='slf4j-simple', version='1.7.6'), | |
@Grab(group='org.jdbi', module='jdbi', version='2.77'), | |
@Grab(group='mysql', module='mysql-connector-java', version='5.1.26'), | |
@GrabConfig(systemClassLoader=true) | |
] | |
) | |
import java.sql.ResultSet; | |
import java.sql.SQLException; | |
import java.util.Scanner; | |
import org.skife.jdbi.v2.sqlobject.Bind; | |
import org.skife.jdbi.v2.sqlobject.SqlQuery; | |
import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper; | |
import org.skife.jdbi.v2.DBI; | |
import org.skife.jdbi.v2.Handle; | |
import org.skife.jdbi.v2.tweak.*; | |
import org.skife.jdbi.v2.*; | |
import org.skife.jdbi.v2.util.*; | |
import org.skife.jdbi.v2.sqlobject.Bind; | |
import org.skife.jdbi.v2.sqlobject.GetGeneratedKeys; | |
import org.skife.jdbi.v2.sqlobject.SqlQuery; | |
import org.skife.jdbi.v2.sqlobject.SqlUpdate; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
class Dao2{ | |
static main(args) { | |
def log1 = LoggerFactory.getLogger('jdbi'); | |
log1.info 'Iniciando script ...' | |
log1.info 'usuario: '+args[0] | |
log1.info 'password: '+args[1] | |
if(args.length > 0){ | |
for(;;){ | |
int opc= Integer.parseInt(menu()) | |
principal(opc, args[0], args[1]) | |
} | |
} | |
} | |
static String menu(){ | |
String opc; | |
println "\t******* Menu *******" | |
println "1. Insertar datos" | |
println "2. Consultar datos por id" | |
println "3. Consultar total de datos" | |
println "4. Actualizar datos por id" | |
println "5. Eliminar datos por id" | |
println "6. Salir" | |
println "*******************************" | |
opc=System.console().readLine 'Escoge una opción:' | |
return opc; | |
} | |
static void principal(int opcion, String user, String passw){ | |
def id=0 | |
def numero=0 | |
def usuario="" | |
def password="" | |
def maquina="" | |
def sistema="" | |
def area="" | |
def ip="" | |
def no_bien="" | |
def log2 = LoggerFactory.getLogger('jdbi'); | |
Scanner sc = new Scanner(System.in); | |
DBI dbi = new DBI("jdbc:mysql://localhost:3306/test",user,passw); | |
BienDAO dao= null; | |
try { | |
dao=dbi.open(BienDAO.class); | |
switch(opcion) { | |
case 1: | |
println "\t[Inserción]\n" | |
println "Número: " | |
numero= sc.nextInt(); | |
usuario=System.console().readLine 'Usuario:' | |
password=System.console().readLine 'Password:' | |
maquina=System.console().readLine 'Máquina:' | |
sistema=System.console().readLine 'Sistema:' | |
area=System.console().readLine 'Área:' | |
ip=System.console().readLine 'Ip:' | |
no_bien=System.console().readLine 'No.bien:' | |
dao.insertar(numero, usuario, password, maquina, sistema, area, ip, no_bien); | |
println "\tInserción realizada" | |
break; | |
case 2: | |
println "\t[Consulta por id]\n" | |
println "Escribe el id: " | |
id= sc.nextInt(); | |
println "\t>> Id: "+dao.encontrarPorId(id).id | |
println "\t>> Número: "+dao.encontrarPorId(id).numero | |
println "\t>> Usuario: "+dao.encontrarPorId(id).usuario | |
println "\t>> Password: "+dao.encontrarPorId(id).password | |
println "\t>> Máquina: "+dao.encontrarPorId(id).maquina | |
println "\t>> Sistema: "+dao.encontrarPorId(id).sistema | |
println "\t>> Área: "+dao.encontrarPorId(id).area | |
println "\t>> Ip: "+dao.encontrarPorId(id).ip | |
println "\t>> No_bien: "+dao.encontrarPorId(id).no_bien | |
println "\tBúsqueda realizada" | |
break; | |
case 3: | |
println "\t[Consulta total]\n" | |
if(dao.verTodo().size() > 0){ | |
println "Lista de persona llena!!: "+dao.verTodo().size(); | |
for(int i=0 ; i < dao.verTodo().size(); i++){ | |
println "\t**Id:"+dao.verTodo().get(i).id; | |
println "Número:"+dao.verTodo().get(i).numero; | |
println "Usuario:"+dao.verTodo().get(i).usuario; | |
println "Password:"+dao.verTodo().get(i).password; | |
println "Máquina:"+dao.verTodo().get(i).maquina; | |
println "Sistema:"+dao.verTodo().get(i).sistema; | |
println "Área:"+dao.verTodo().get(i).area; | |
println "Ip:"+dao.verTodo().get(i).ip; | |
println "No.bien:"+dao.verTodo().get(i).no_bien; | |
} | |
} | |
break; | |
case 4: | |
println "\t[Actualización por id]\n" | |
println "Escribe el id: " | |
id= sc.nextInt(); | |
println "Número: " | |
numero= sc.nextInt(); | |
usuario=System.console().readLine 'Usuario:' | |
password=System.console().readLine 'Password:' | |
maquina=System.console().readLine 'Máquina:' | |
sistema=System.console().readLine 'Sistema:' | |
area=System.console().readLine 'Área:' | |
ip=System.console().readLine 'Ip:' | |
no_bien=System.console().readLine 'No.bien:' | |
dao.modificarPorId(id, numero, usuario, password, maquina, sistema, area, ip, no_bien); | |
println "\tActualización realizada" | |
break; | |
case 5: | |
println "\t[Eliminación por id]\n" | |
println "Escribe el id: " | |
id= sc.nextInt(); | |
dao.eliminarPorId(id); | |
println "\tEliminación realizada" | |
break; | |
case 6: | |
println "\t[Adiós]\n" | |
log2.info 'Cerrando conexión' | |
dao.close(); | |
System.exit(0) | |
break; | |
default: | |
println "\tEsa opción no existe" | |
break; | |
} | |
} | |
catch(Exception e) { | |
log2.error 'Error: '+e.toString() | |
} | |
} | |
} | |
class ModeloBien implements java.io.Serializable{ | |
private static final long serialVersionUID=1L; | |
int id | |
int numero | |
String usuario | |
String password | |
String maquina | |
String sistema | |
String area | |
String ip | |
String no_bien | |
} | |
class ModeloBienMapper implements ResultSetMapper<ModeloBien> { | |
@Override | |
public ModeloBien map(int arg0, ResultSet r, StatementContext arg2) throws SQLException { | |
ModeloBien mbien=new ModeloBien(); | |
mbien.id=r.getInt("id") | |
mbien.numero=r.getInt("numero") | |
mbien.usuario=r.getString("usuario") | |
mbien.password=r.getString("password") | |
mbien.maquina=r.getString("maquina") | |
mbien.sistema=r.getString("sistema") | |
mbien.area=r.getString("area") | |
mbien.ip=r.getString("ip") | |
mbien.no_bien=r.getString("no_bien") | |
return mbien; | |
} | |
} | |
@RegisterMapper(ModeloBienMapper.class) | |
interface BienDAO { | |
@SqlUpdate("INSERT INTO test.bien (numero, usuario, password, maquina, sistema, area, ip, no_bien) VALUES(:numero, :usuario, :password, :maquina, :sistema, :area, :ip, :no_bien)") | |
void insertar(@Bind("numero") int numero, @Bind("usuario") String usuario, @Bind("password") String password,@Bind("maquina") String maquina,@Bind("sistema") String sistema,@Bind("area") String area,@Bind("ip") String ip, @Bind("no_bien") String no_bien); | |
@SqlQuery("SELECT * FROM test.bien where id = :id") | |
ModeloBien encontrarPorId(@Bind("id") int id); | |
@SqlQuery("SELECT test.bien.id, test.bien.numero, test.bien.usuario, test.bien.password, test.bien.maquina, test.bien.sistema,test.bien.area,test.bien.ip,test.bien.no_bien FROM test.bien") | |
List<ModeloBien> verTodo(); | |
@SqlUpdate("UPDATE test.bien SET numero = :numero, usuario = :usuario, password = :password, maquina = :maquina, sistema = :sistema, area = :area, ip = :ip, no_bien = :no_bien where id = :id") | |
void modificarPorId(@Bind("id") int id, @Bind("numero") int numero,@Bind("usuario") String usuario, @Bind("password") String password,@Bind("maquina") String maquina,@Bind("sistema") String sistema,@Bind("area") String area,@Bind("ip") String ip, @Bind("no_bien") String no_bien); | |
@SqlUpdate("DELETE FROM test.bien where id = :id") | |
void eliminarPorId(@Bind("id") int id); | |
void close(); | |
} |