Guest User

Untitled

a guest
Oct 20th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.07 KB | None | 0 0
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package mx.hashsoft.hibernateanotaciones;
  7.  
  8. import java.lang.reflect.Field;
  9. import java.sql.Connection;
  10. import java.sql.DatabaseMetaData;
  11. import java.sql.DriverManager;
  12. import java.sql.ResultSet;
  13. import java.sql.SQLException;
  14. import java.util.ArrayList;
  15. import javax.persistence.Column;
  16. import javax.persistence.Table;
  17.  
  18. /**
  19. *
  20. * @author David
  21. */
  22. public class DataBaseTester {
  23.  
  24. static public void main(String[] args) {
  25. try {
  26. DataBaseTester dataBaseTester = new DataBaseTester();
  27. Connection cx = dataBaseTester.crearConexion();
  28. ArrayList<Class> clases = dataBaseTester.clasesVerificar();
  29. Boolean resultadoTablas=true, resultadoCampos=true;
  30.  
  31. for(Class clase : clases) {
  32. // Obtenemos la anotacion Tabla de la clase
  33. Table tabla = (Table) clase.getAnnotation(Table.class);
  34.  
  35. // Obtenemos el nombre de la clase SIN el esquema
  36. int punto = tabla.name().indexOf(".");
  37. String nombreTabla = tabla.name().substring(punto +1);
  38.  
  39. // Buscamos si la tabla existe
  40. Boolean tablaOK = dataBaseTester.existeTabla(cx, nombreTabla);
  41. resultadoTablas = resultadoTablas && tablaOK;
  42.  
  43. if(tablaOK) {
  44. // Obtenemos todos los campos de la clase indicada
  45. Field[] fields = clase.getDeclaredFields();
  46. Boolean camposOK = dataBaseTester.existenColumnas(cx, nombreTabla, fields);
  47.  
  48. resultadoCampos = resultadoCampos && camposOK;
  49. }
  50. }
  51.  
  52. System.out.println("\n");
  53. if((resultadoTablas && resultadoCampos) == true) {
  54. System.out.println("La base de datos contiene todas las tablas y campos necesarios");
  55. } else {
  56. System.out.println("FALTAN TABLAS Y/O CAMPOS VALIDE CON LA SALIDA");
  57. }
  58.  
  59. } catch (SQLException | ClassNotFoundException e) {
  60. System.out.println("Error al conectar a dB");
  61. e.printStackTrace();
  62. }
  63. }
  64.  
  65. /**
  66. * Verifica que la tabla indicada
  67. * @param conexion Conexion a base de datos
  68. * @param nombreTabla Nombre de la tabla que deseamos verificar
  69. * @return True si la tabla existe, false en caso contrario
  70. */
  71. Boolean existeTabla(Connection conexion, String nombreTabla) throws SQLException {
  72. Boolean existe = false;
  73.  
  74. // Obtenemos los metadatos de la conexion
  75. DatabaseMetaData metadata = conexion.getMetaData();
  76. // Buscamos la tabla con el nombre indicado
  77. ResultSet tabla = metadata.getTables(null, null, nombreTabla, null);
  78.  
  79. // Para evitar falsos positivos buscamos que el nombre EXACTO exista
  80. while(tabla.next() == true) {
  81. String nombre = tabla.getString("TABLE_NAME");
  82.  
  83. if(nombre.compareTo(nombreTabla) == 0) {
  84. System.out.println("EXISTE tabla " + nombreTabla);
  85. existe = true;
  86. }
  87. }
  88.  
  89. if(existe == false) {
  90. System.out.println("NO EXISTE tabla " + nombreTabla);
  91. }
  92.  
  93. return existe;
  94. }
  95.  
  96. /**
  97. * Verificamos que las columnas de la tabla indicadas en la clase existan
  98. * @param conexion Conexion a base de datos
  99. * @param nombreTabla Nombre de la tabla
  100. * @param campos Campos que deseamos verificar en la tabla
  101. * @return True si todos los campos existen, false si hay faltantes
  102. */
  103. public Boolean existenColumnas(Connection conexion, String nombreTabla, Field[] campos) throws SQLException {
  104. Boolean existen = true;
  105. // Metadatos d ela conexion
  106. DatabaseMetaData metadata = conexion.getMetaData();
  107.  
  108. // Buscamos cada campo del arreglo
  109. for(Field campo: campos) {
  110. // Obtenemos la anotacion Column
  111. Column columna = campo.getAnnotation(Column.class);
  112. ResultSet data = metadata.getColumns(null, null, nombreTabla, columna.name());
  113. Boolean campoExacto = false;
  114.  
  115. // Para evitar falsos positivos buscamos el nombre EXACTO de la columna
  116. while(data.next() == true) {
  117. String nombreCampo = data.getString("COLUMN_NAME");
  118.  
  119. if(nombreCampo.compareTo(columna.name()) == 0) {
  120. System.out.println("\tEXISTE el campo " + nombreTabla + "." + columna.name());
  121. campoExacto = true;
  122. }
  123. }
  124.  
  125. if(campoExacto == false) {
  126. System.out.println("\tNO EXISTE el campo " + nombreTabla + "." + columna.name());
  127. }
  128.  
  129. existen = existen && campoExacto;
  130. }
  131. return existen;
  132. }
  133.  
  134. /**
  135. * Creamos la conexion a base de datos
  136. * @return Conexion a base de datos
  137. * @throws ClassNotFoundException
  138. * @throws SQLException
  139. */
  140. public Connection crearConexion() throws ClassNotFoundException, SQLException {
  141. Class.forName("com.mysql.cj.jdbc.Driver");
  142. Connection conexion = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/" + "?" + "user=" + "tester" + "&" + "password=" + "primeTester" + "");
  143.  
  144. return conexion;
  145. }
  146.  
  147. /**
  148. * Regresa la lista de clases VO que deseamos verificar
  149. * @return Lista de clases
  150. */
  151. public ArrayList<Class> clasesVerificar() {
  152. ArrayList<Class> clases = new ArrayList<>();
  153.  
  154. // Obtenemos el objecto Class de las clases
  155. Class<FoliosVO> foliosVO = FoliosVO.class;
  156. Class<ReplicaVO> replicaVO = ReplicaVO.class;
  157.  
  158. // Agregamos las clases al arreglo
  159. clases.add(foliosVO);
  160. clases.add(replicaVO);
  161.  
  162. return clases;
  163. }
  164. }
Add Comment
Please, Sign In to add comment