Skip to content

Instantly share code, notes, and snippets.

@HashRaygoza
Last active October 20, 2017 18:27
Show Gist options
  • Save HashRaygoza/e048cc684f9953073db2f87e25f80868 to your computer and use it in GitHub Desktop.
Save HashRaygoza/e048cc684f9953073db2f87e25f80868 to your computer and use it in GitHub Desktop.
Verifica la existencia de las tablas y columnas de la base de datos basandose en las anotaciones de las clases VO
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mx.hashsoft.hibernateanotaciones;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.persistence.Column;
import javax.persistence.Table;
/**
*
* @author David
*/
public class DataBaseTester {
static public void main(String[] args) {
try {
DataBaseTester dataBaseTester = new DataBaseTester();
Connection cx = dataBaseTester.crearConexion();
ArrayList<Class> clases = dataBaseTester.clasesVerificar();
Boolean resultadoTablas=true, resultadoCampos=true;
for(Class clase : clases) {
// Obtenemos la anotacion Tabla de la clase
Table tabla = (Table) clase.getAnnotation(Table.class);
// Obtenemos el nombre de la clase SIN el esquema
int punto = tabla.name().indexOf(".");
String nombreTabla = tabla.name().substring(punto +1);
// Buscamos si la tabla existe
Boolean tablaOK = dataBaseTester.existeTabla(cx, nombreTabla);
resultadoTablas = resultadoTablas && tablaOK;
if(tablaOK) {
// Obtenemos todos los campos de la clase indicada
Field[] fields = clase.getDeclaredFields();
Boolean camposOK = dataBaseTester.existenColumnas(cx, nombreTabla, fields);
resultadoCampos = resultadoCampos && camposOK;
}
}
System.out.println("\n");
if((resultadoTablas && resultadoCampos) == true) {
System.out.println("La base de datos contiene todas las tablas y campos necesarios");
} else {
System.out.println("FALTAN TABLAS Y/O CAMPOS VALIDE CON LA SALIDA");
}
} catch (SQLException | ClassNotFoundException e) {
System.out.println("Error al conectar a dB");
e.printStackTrace();
}
}
/**
* Verifica que la tabla indicada
* @param conexion Conexion a base de datos
* @param nombreTabla Nombre de la tabla que deseamos verificar
* @return True si la tabla existe, false en caso contrario
*/
Boolean existeTabla(Connection conexion, String nombreTabla) throws SQLException {
Boolean existe = false;
// Obtenemos los metadatos de la conexion
DatabaseMetaData metadata = conexion.getMetaData();
// Buscamos la tabla con el nombre indicado
ResultSet tabla = metadata.getTables(null, null, nombreTabla, null);
// Para evitar falsos positivos buscamos que el nombre EXACTO exista
while(tabla.next() == true) {
String nombre = tabla.getString("TABLE_NAME");
if(nombre.compareTo(nombreTabla) == 0) {
System.out.println("EXISTE tabla " + nombreTabla);
existe = true;
}
}
if(existe == false) {
System.out.println("NO EXISTE tabla " + nombreTabla);
}
return existe;
}
/**
* Verificamos que las columnas de la tabla indicadas en la clase existan
* @param conexion Conexion a base de datos
* @param nombreTabla Nombre de la tabla
* @param campos Campos que deseamos verificar en la tabla
* @return True si todos los campos existen, false si hay faltantes
*/
public Boolean existenColumnas(Connection conexion, String nombreTabla, Field[] campos) throws SQLException {
Boolean existen = true;
// Metadatos d ela conexion
DatabaseMetaData metadata = conexion.getMetaData();
// Buscamos cada campo del arreglo
for(Field campo: campos) {
// Obtenemos la anotacion Column
Column columna = campo.getAnnotation(Column.class);
ResultSet data = metadata.getColumns(null, null, nombreTabla, columna.name());
Boolean campoExacto = false;
// Para evitar falsos positivos buscamos el nombre EXACTO de la columna
while(data.next() == true) {
String nombreCampo = data.getString("COLUMN_NAME");
if(nombreCampo.compareTo(columna.name()) == 0) {
System.out.println("\tEXISTE el campo " + nombreTabla + "." + columna.name());
campoExacto = true;
}
}
if(campoExacto == false) {
System.out.println("\tNO EXISTE el campo " + nombreTabla + "." + columna.name());
}
existen = existen && campoExacto;
}
return existen;
}
/**
* Creamos la conexion a base de datos
* @return Conexion a base de datos
* @throws ClassNotFoundException
* @throws SQLException
*/
public Connection crearConexion() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conexion = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/" + "?" + "user=" + "tester" + "&" + "password=" + "primeTester" + "");
return conexion;
}
/**
* Regresa la lista de clases VO que deseamos verificar
* @return Lista de clases
*/
public ArrayList<Class> clasesVerificar() {
ArrayList<Class> clases = new ArrayList<>();
// Obtenemos el objecto Class de las clases
Class<FoliosVO> foliosVO = FoliosVO.class;
Class<ReplicaVO> replicaVO = ReplicaVO.class;
// Agregamos las clases al arreglo
clases.add(foliosVO);
clases.add(replicaVO);
return clases;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment