Advertisement
Guest User

Untitled

a guest
May 8th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.48 KB | None | 0 0
  1. import java.io.InputStreamReader;
  2. import java.sql.*;
  3. import java.util.ArrayList;
  4. import java.util.LinkedList;
  5. import java.io.BufferedReader;
  6. import java.io.FileReader;
  7. import java.util.Scanner;
  8.  
  9. public class Diagnostico {
  10.  
  11.     private final String DATAFILE = "data/disease_data.data";
  12.     private Connection connection = null;
  13.  
  14.     private void showMenu() {
  15.  
  16.         int option = -1;
  17.         do {
  18.             System.out.println("Bienvenido a sistema de diagnóstico\n");
  19.             System.out.println("Selecciona una opción:\n");
  20.             System.out.println("\t1. Creación de base de datos y carga de datos.");
  21.             System.out.println("\t2. Realizar diagnóstico.");
  22.             System.out.println("\t3. Listar síntomas de una enfermedad.");
  23.             System.out.println("\t4. Listar enfermedades y sus códigos asociados.");
  24.             System.out.println("\t5. Listar síntomas existentes en la BD y su tipo semántico.");
  25.             System.out.println("\t6. Mostrar estadísticas de la base de datos.");
  26.             System.out.println("\t7. Salir.");
  27.             try {
  28.                 option = readInt();
  29.                 switch (option) {
  30.                     case 1:
  31.                         crearBD();
  32.                         break;
  33.                     case 2:
  34.                         realizarDiagnostico();
  35.                         break;
  36.                     case 3:
  37.                         listarSintomasEnfermedad();
  38.                         break;
  39.                     case 4:
  40.                         listarEnfermedadesYCodigosAsociados();
  41.                         break;
  42.                     case 5:
  43.                         listarSintomasYTiposSemanticos();
  44.                         break;
  45.                     case 6:
  46.                         mostrarEstadisticasBD();
  47.                         break;
  48.                     case 7:
  49.                         exit();
  50.                         break;
  51.                 }
  52.             } catch (Exception e) {
  53.                 System.err.println("Opción introducida no válida!");
  54.                 e.printStackTrace();
  55.             }
  56.         } while (option != 7);
  57.         exit();
  58.     }
  59.  
  60.     private void exit() {
  61.         try {
  62.             connection.close();
  63.             System.out.println("Saliendo... ¡hasta otra!");
  64.         } catch (SQLException e) {
  65.             e.printStackTrace();
  66.         }
  67.         System.exit(0);
  68.     }
  69.  
  70.     /**
  71.      * Método para establecer conexión con la base de datos.
  72.      *
  73.      * @throws Exception Puede lanzar excepción.
  74.      */
  75.     private void conectar() throws Exception {
  76.         if (connection == null) {
  77.             try {
  78.                 Class.forName("com.mysql.jdbc.Driver");
  79.                 connection = DriverManager.getConnection(
  80.                         "jdbc:mysql://localhost:3306/",
  81.                         "bddx",
  82.                         "bddx_pwd");
  83.             } catch (Exception e) {
  84.                 e.printStackTrace();
  85.             }
  86.         }
  87.     }
  88.  
  89.     /**
  90.      * Método para crear la base de datos, tablas e importar datos.
  91.      *
  92.      * @throws Exception Puede lanzar alguna excepción, en cuyo caso,
  93.      *                   hace ROLLBACK y elimina las tablas y base de datos creadas.
  94.      */
  95.     private void crearBD() {
  96.  
  97.         /*
  98.          * Se conecta con JDBC a través del método conectar(). Acto seguido,
  99.          * seprocede a crear la base de datos y las tablas para dejar paso
  100.          * a importación de datos posteriormente.
  101.          */
  102.         try {
  103.             conectar();
  104.             LinkedList<String> archivo = readData();
  105.             ArrayList<String> sentenciasSQL = new ArrayList<>();
  106.             sentenciasSQL.add("CREATE DATABASE diagnostico;");
  107.             sentenciasSQL.add("USE diagnostico;");
  108.             sentenciasSQL.add("CREATE TABLE disease (" +
  109.                     "disease_id INT AUTO_INCREMENT, " +
  110.                     "name VARCHAR(255), " +
  111.                     "PRIMARY KEY (disease_id)" +
  112.                     ");");
  113.             sentenciasSQL.add("CREATE TABLE disease_has_code (" +
  114.                     "disease_id INT, " +
  115.                     "code VARCHAR(255), " +
  116.                     "source_id INT, " +
  117.                     "FOREIGN KEY (disease_id) REFERENCES disease(disease_id), " +
  118.                     "FOREIGN KEY (code) REFERENCES code(code), " +
  119.                     "FOREIGN KEY (source_id) REFERENCES source(source_id)" +
  120.                     ");");
  121.             sentenciasSQL.add("CREATE TABLE disease_symptom (" +
  122.                     "disease_id INT, " +
  123.                     "cui VARCHAR(25), " +
  124.                     "FOREIGN KEY (disease_id) REFERENCES disease(disease_id), " +
  125.                     "FOREIGN KEY (cui) REFERENCES symptom(cui)" +
  126.                     ");");
  127.             sentenciasSQL.add("CREATE TABLE code (" +
  128.                     "code VARCHAR(255), " +
  129.                     "source_id INT, " +
  130.                     "PRIMARY KEY (code), " +
  131.                     "FOREIGN KEY source_id REFERENCES source(source_id)" +
  132.                     ");");
  133.             sentenciasSQL.add("CREATE TABLE source (" +
  134.                     "source_id INT AUTO_INCREMENT, " +
  135.                     "name VARCHAR(255), " +
  136.                     "PRIMARY KEY (source_id)" +
  137.                     ");");
  138.             sentenciasSQL.add("CREATE TABLE symptom (" +
  139.                     "cui VARCHAR(25), " +
  140.                     "name VARCHAR(255), " +
  141.                     "st VARCHAR(45)" +
  142.                     "PRIMARY KEY (cui)" +
  143.                     ");");
  144.  
  145.             /*
  146.              * Dado que las sentencias CREATE implican un COMMIT automático, comenzaremos la
  147.              * transacción antes de las sentencias INSERT. Ahora se interpretan y segmentan los
  148.              * datos de disease_data.data y se crean las sentencias de importación.
  149.              */
  150.             sentenciasSQL.add("START TRANSACTION;");
  151.             for (String linea : archivo) {
  152.                 String[] d1 = linea.split("=");
  153.                 String[] e1 = d1[0].split(":");
  154.                 String nombreEnfermedad = e1[0];
  155.                 sentenciasSQL.add("INSERT INTO disease VALUES (" +
  156.                         "" + nombreEnfermedad + "" +
  157.                         ");");
  158.                 String[] datosEnfermedad = e1[1].split(";");
  159.                 for (String dato : datosEnfermedad) {
  160.                     String[] e2 = dato.split("@");
  161.                     String codigoE = e2[0];
  162.                     String vocabularioE = e2[1];
  163.                     sentenciasSQL.add("INSERT INTO source VALUES (" +
  164.                             "" + vocabularioE + "" +
  165.                             ");");
  166.                     sentenciasSQL.add("INSERT INTO code VALUES (" +
  167.                             "" + codigoE + ", " +
  168.                             "(SELECT source_id FROM source WHERE `name`='" + vocabularioE + "')" +
  169.                             ");");
  170.                     sentenciasSQL.add("INSERT INTO disease_has_code VALUES (" +
  171.                             "(SELECT disease_id FROM disease WHERE `name`='" + nombreEnfermedad + "')," +
  172.                             "" + codigoE + ", " +
  173.                             "(SELECT source_id FROM code WHERE `code`='" + codigoE + "')" +
  174.                             ");");
  175.                 }
  176.                 String[] s1 = d1[1].split(";");
  177.                 for (String dato : s1) {
  178.                     String[] datosSintoma = dato.split(":");
  179.                     String nombreSintoma = datosSintoma[0];
  180.                     String codigoSintoma = datosSintoma[1];
  181.                     String semanticaSintoma = datosSintoma[2];
  182.                     sentenciasSQL.add("INSERT INTO symptom VALUES (" +
  183.                             "" + codigoSintoma + ", " +
  184.                             "" + nombreSintoma + ", " +
  185.                             "" + semanticaSintoma + "" +
  186.                             ");");
  187.                 }
  188.             }
  189.  
  190.             /*
  191.              * Una vez termino el proceso de segmentar e interpretar los datos de disease_data.data, y
  192.              * colectar todas las sentencias de importación correspondientes, se añade al final de esta
  193.              * colección la sentencia COMMIT. Finalmente se procede a ejecutar en orden las sentencias.
  194.              */
  195.             sentenciasSQL.add("COMMIT;");
  196.             for (String sentencia : sentenciasSQL) {
  197.                 PreparedStatement ps = connection.prepareStatement(sentencia);
  198.                 ps.execute();
  199.             }
  200.         } catch (Exception e) {
  201.             e.printStackTrace();
  202.  
  203.             /*
  204.              * En caso de un error en el proceso anterior, se parará el progreso y se optará por eliminar totalmente
  205.              * la base de datos, deshaciendo así todos los cambios. Esto ocurre porque se presume que siempre que se
  206.              * ejecute el método crearDB(), no existe la base de datos.
  207.              */
  208.             try {
  209.                 PreparedStatement ps = connection.prepareStatement("DROP DATABASE IF EXISTS diagnostico;");
  210.                 ps.execute();
  211.             } catch (SQLException ex) {
  212.                 System.out.println("No pudo borrarse la base de datos.");
  213.             }
  214.         }
  215.     }
  216.  
  217.     private void realizarDiagnostico() {
  218.         //TODO: Parte de Dani2.
  219.     }
  220.  
  221.     /**
  222.      * Método para crear imprimir la lista de síntomas de una enfermedad.
  223.      *
  224.      * @throws Exception Puede lanzar excepción si el proceso de consulta en
  225.      *                   SQL ha fallado o la ID de enfermedad introducida es inválida.
  226.      */
  227.     private void listarSintomasEnfermedad() {
  228.         System.out.println("Escoge una de las siguientes enfermedades introduciendo su ID:");
  229.  
  230.         /*
  231.          * Se consulta a la base de datos las enfermedades almacenadas y sus IDs correspondientes.
  232.          */
  233.         try {
  234.             PreparedStatement ps = connection.prepareStatement("SELECT disease_id,name FROM disease;");
  235.             ResultSet listadoEnfermedades = ps.executeQuery();
  236.             while (listadoEnfermedades.next()) {
  237.                 System.out.println(listadoEnfermedades.getInt("disease_id") + "  |  " +
  238.                         listadoEnfermedades.getString("disease"));
  239.             }
  240.  
  241.             /*
  242.              * A través de un Scanner, se pide al usuario que introduzca una
  243.              * ID. Acto seguido, se consulta y lista los síntomas de la enfermedad correspondiente.
  244.              */
  245.             Scanner sc = new Scanner(System.in);
  246.             int ID = sc.nextInt();
  247.             PreparedStatement ps2 = connection.prepareStatement(
  248.                     "SELECT name FROM symptom WHERE `cui`=(" +
  249.                             "SELECT cui FROM disease_symptom WHERE `disease_symptom`='" + ID + "');");
  250.             ResultSet listadoSintomas = ps2.executeQuery();
  251.             while (listadoSintomas.next()) {
  252.                 System.out.println("* " + listadoSintomas.getString("name"));
  253.             }
  254.         } catch (Exception e) {
  255.             System.out.println("Ha ocurrido un error:");
  256.             e.printStackTrace();
  257.         }
  258.     }
  259.  
  260.     /**
  261.      * Método para crear imprimir las enfermedades con sus códigos y vocabularios.
  262.      *
  263.      * @throws Exception Puede lanzar excepción si el proceso de consulta en SQL ha fallado.
  264.      */
  265.     private void listarEnfermedadesYCodigosAsociados() {
  266.         System.out.println("Las enfermedades guardadas en la base de datos y sus códigos asociados son:");
  267.  
  268.         /*
  269.          * Se realiza una consulta a través de la cual se diseña un ResultSet cuya primera columna posee
  270.          * el nombre de la enfermedad, segunda columna el código y tercera columna el vocabulario del código.
  271.          */
  272.         try {
  273.             PreparedStatement ps = connection.prepareStatement(
  274.                     "SELECT disease.name,disease_has_code.code,source.name FROM disease_has_code " +
  275.                             "INNER JOIN disease ON disease_has_code.disease_id=disease.disease_id " +
  276.                             "INNER JOIN source ON disease_has_code.source_id=source.source_id;");
  277.             ResultSet resultados = ps.executeQuery();
  278.             while (resultados.next()) {
  279.                 System.out.println(resultados.getString(1) +
  280.                         " | " + resultados.getString(2) +
  281.                         " - " + resultados.getString(3));
  282.             }
  283.         } catch (Exception e) {
  284.             System.out.println("Ha ocurrido un error:");
  285.             e.printStackTrace();
  286.         }
  287.     }
  288.  
  289.     /**
  290.      * Método para crear imprimir los síntomas y sus tipos semánticos.
  291.      *
  292.      * @throws Exception Puede lanzar excepción si el proceso de consulta en SQL ha fallado.
  293.      */
  294.     private void listarSintomasYTiposSemanticos() {
  295.         System.out.println("Los síntomas guardados en la base de datos y sus tipos semanticos son:");
  296.  
  297.         /*
  298.          * Se realiza una consulta para obtener todos los síntomas y sus tipos semánticos.
  299.          */
  300.         try {
  301.             PreparedStatement ps = connection.prepareStatement("SELECT name,st FROM symptom;");
  302.             ResultSet resultados = ps.executeQuery();
  303.             while (resultados.next()) {
  304.                 System.out.println(resultados.getString("name") +
  305.                         " - " + resultados.getString("st"));
  306.             }
  307.         } catch (SQLException e) {
  308.             System.out.println("Ha ocurrido un error:");
  309.             e.printStackTrace();
  310.         }
  311.     }
  312.  
  313.     private void mostrarEstadisticasBD() {
  314.         try {
  315.             ArrayList<String> setenciasSQL = new ArrayList<>();
  316.             setenciasSQL.add("SELECT COUNT(disease) FROM disease;");
  317.             setenciasSQL.add("SELECT COUNT(name) FROM symptom;");
  318.             setenciasSQL.add("SELECT disease.name,symptom.name FROM disease_symptom " +
  319.                     "INNER JOIN symptom ON disease_symptom.cui=symptom.cui " +
  320.                     "INNER JOIN disease ON disease_symptom.disease_id=disease.disease_id");
  321.  
  322.         } catch (Exception e) {
  323.  
  324.         }
  325.     }
  326.  
  327.     /**
  328.      * Método para leer números enteros de teclado.
  329.      *
  330.      * @return Devuelve el número leído.
  331.      * @throws Exception Puede lanzar excepción.
  332.      */
  333.     private int readInt() throws Exception {
  334.         try {
  335.             System.out.print("> ");
  336.             return Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
  337.         } catch (Exception e) {
  338.             throw new Exception("Not number.");
  339.         }
  340.     }
  341.  
  342.     /**
  343.      * Método para leer cadenas de teclado.
  344.      *
  345.      * @return Devuelve la cadena leída.
  346.      * @throws Exception Puede lanzar excepción.
  347.      */
  348.     private String readString() throws Exception {
  349.         try {
  350.             System.out.print("> ");
  351.             return new BufferedReader(new InputStreamReader(System.in)).readLine();
  352.         } catch (Exception e) {
  353.             throw new Exception("Error reading line.");
  354.         }
  355.     }
  356.  
  357.     /**
  358.      * Método para leer el fichero que contiene los datos.
  359.      *
  360.      * @return Devuelve una lista de String con el contenido.
  361.      * @throws Exception Puede lanzar excepción.
  362.      */
  363.     private LinkedList<String> readData() throws Exception {
  364.         LinkedList<String> data = new LinkedList<String>();
  365.         BufferedReader bL = new BufferedReader(new FileReader(DATAFILE));
  366.         while (bL.ready()) {
  367.             data.add(bL.readLine());
  368.         }
  369.         bL.close();
  370.         return data;
  371.     }
  372.  
  373.     public static void main(String args[]) {
  374.         new Diagnostico().showMenu();
  375.     }
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement