commit c91477550f48914647dfb4c05f62a6c8327f1ac4 Author: llopez Date: Mon Mar 25 08:40:43 2024 -0500 first commit diff --git a/nb-configuration.xml b/nb-configuration.xml new file mode 100644 index 0000000..778cb62 --- /dev/null +++ b/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_21 + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c8d814c --- /dev/null +++ b/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + com.qsoft.generador.entidades + generador-entidades + 1.0-SNAPSHOT + jar + + UTF-8 + 17 + 17 + com.qsoft.generador.entidades.GeneradorEntidades + + + + com.mysql + mysql-connector-j + 8.2.0 + + + org.apache.commons + commons-lang3 + 3.14.0 + + + \ No newline at end of file diff --git a/src/main/java/com/qsoft/generador/entidades/GeneradorEntidades.java b/src/main/java/com/qsoft/generador/entidades/GeneradorEntidades.java new file mode 100644 index 0000000..97c3f5c --- /dev/null +++ b/src/main/java/com/qsoft/generador/entidades/GeneradorEntidades.java @@ -0,0 +1,271 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Project/Maven2/JavaApp/src/main/java/${packagePath}/${mainClassName}.java to edit this template + */ + +package com.qsoft.generador.entidades; + +import org.apache.commons.lang3.StringUtils; +import com.qsoft.generador.entidades.coneccion.Conexion; +import com.qsoft.generador.entidades.constantes.GenedorConstantes; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author developer2 + */ +public class GeneradorEntidades { + + public static void main(String[] args) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //Ya tenemos el "lector" + String mostrarTablas = "SHOW FULL TABLES FROM %s"; + String driver = "com.mysql.cj.jdbc.Driver"; + String database = "prueba"; + String host = "localhost"; + String port = "3306"; + String url = ""; + String user = "christian"; + String pass = "12345678"; + String linea = null; + String claveCompuesta = null; + try { + System.out.println(String.format(">>>>>>>>>>>> PENSADO EN SPRING<<<<<<<<<", driver)); + System.out.println(String.format("Driver [%s]:", driver)); + linea =br.readLine(); + driver = linea == null || linea.trim().equals("") ? driver : linea ; + + System.out.println(String.format("Database [%s]:", database)); + linea = br.readLine(); + database = linea == null || linea.trim().equals("") ? database : linea ; + + System.out.println(String.format("Host [%s]:", host)); + linea = br.readLine(); + host = linea == null || linea.trim().equals("") ? host : linea ; + + System.out.println(String.format("Port [%s]:", port)); + linea = br.readLine(); + port = linea == null || linea.trim().equals("") ? port : linea; + + url = String.format("jdbc:mysql://%s:%s/%s?useSSL=false", host,port,database); + System.out.println("URL: "+url); + + System.out.println(String.format("user [%s]:", user)); + linea = br.readLine(); + user = linea == null || linea.trim().equals("") ? user : linea; + + System.out.println(String.format("pass [%s]:", pass)); + linea = br.readLine(); + pass = linea == null || linea.trim().equals("") ? pass : linea; + + Conexion con = new Conexion(driver, database, host, port, url, user, pass); + + Connection conection = con.crearConexionMysql(); + System.out.println("Conexion>>"+conection); + + ResultSet rs = con.crearResult(conection,String.format(mostrarTablas, database)); + String nombreTabla; + ResultSet tb; + ResultSet tbnoPk; + String clase; + String tipoDato; + String paquete = "com.qsoft.ejemplo.rs.model"; + + String columna = null; + System.out.println(String.format("Paquete [%s]:", paquete)); + linea = br.readLine(); + paquete = linea == null || linea.trim().equals("") ? paquete : linea; + boolean auto_inc= Boolean.FALSE; + while (rs.next()) { /** recorre tablas*/ + StringBuilder paquetes = new StringBuilder("package "); + nombreTabla = rs.getString(1); + StringBuilder codigoClase = new StringBuilder(String.format("@Entity\n@Table(name = \"%s\")\n", nombreTabla)); + StringBuilder gettersSetters = new StringBuilder(String.format("@Entity\n@Table(name = \"%s\")\n", nombreTabla)); + codigoClase.append("public class ").append(StringUtils.capitalize(toCamelCase(nombreTabla))).append(" implements Serializable {\n\n"); + codigoClase.append("private static final long serialVersionUID = 1L;\n\n"); + tb = con.crearResult(conection, String.format(GenedorConstantes.SQL_CAMPOS_RELACIONES.concat(" and tc.CONSTRAINT_TYPE = 'PRIMARY KEY';"), database, nombreTabla)); + System.out.println(String.format(">>>>>>>>>>>>>>>>>>>>>>%s<<<<<<<<<<<<<<<<<<", nombreTabla)); + + paquetes.append(paquete).append(";\n"); + paquetes.append("import jakarta.persistence.*;\n"); + // primary key + int numeroFilas = 0; + List pks = new ArrayList<>(); + + while (tb.next()) { + try { + Integer.parseInt(tb.getObject(15).toString()); + auto_inc = Boolean.TRUE; + } catch (Exception e) { + auto_inc = Boolean.FALSE; + } + + numeroFilas++; + columna = tb.getString(3); + pks.add(String.format(GenedorConstantes.TAB.concat("private %s %s;\n\n"), tipoValor(tb.getString(5), tb.getInt(7), tb.getInt(8)),toCamelCase(columna))); + } + if(numeroFilas == 1){ + codigoClase.append(String.format(auto_inc? GenedorConstantes.FORMATO_ANOTACIONES_AUTO_INCREMENT_PK : GenedorConstantes.FORMATO_ANOTACIONES_PK, columna)); + codigoClase.append(pks.get(0)); + + } + if(numeroFilas> 1){ + claveCompuesta = procesarClavePrimaria(pks, paquete, nombreTabla,auto_inc); + codigoClase.append("\n@EmbeddedId\n"); + codigoClase.append(String.format("private %s %s;\n\n",StringUtils.capitalize(toCamelCase(nombreTabla)).concat("PK"), toCamelCase(nombreTabla).concat("PK"))); + } + + tbnoPk = con.crearResult(conection, String.format(GenedorConstantes.SQL_CAMPOS_RELACIONES.concat(" and tc.CONSTRAINT_TYPE <> 'PRIMARY KEY';"), database, nombreTabla)); + while (tbnoPk.next()) { + if(tb.getString(11).equals("FOREIGN KEY")){ + columna = tb.getString(3); + tipoDato = StringUtils.capitalize(tb.getString(13)); + } + numeroFilas++; + columna = tb.getString(3); + pks.add(String.format(GenedorConstantes.TAB.concat("private %s %s;\n\n"), tipoValor(tb.getString(5), tb.getInt(7), tb.getInt(8)),columna)); + + } + System.out.println("CLAVE>>\n"+codigoClase.toString()); + System.out.println("CLAVE>>\n"+claveCompuesta); + + } + + } catch (IOException|SQLException ex) { + ex.printStackTrace(); + } + } + /** + * el + */ + public static String toCamelCase(String texto){ + StringBuilder sb = new StringBuilder(); + String []textoSeparado = null; + if(texto.contains(" ")){ + textoSeparado = texto.trim().split(" "); + } + if(texto.contains("-")){ + textoSeparado = texto.trim().split("-"); + } + if(texto.contains("_")){ + textoSeparado = texto.trim().split("_"); + } + if(textoSeparado == null){ + textoSeparado = new String[]{texto}; + } + + + for (int i = 0; i < textoSeparado.length; i++) { + if(i == 0){ + sb.append(textoSeparado[i].toLowerCase()); + }else{ + sb.append(StringUtils.capitalize(texto.toLowerCase())); + } + } + return sb.toString(); + } + + public static String procesarClavePrimaria(List pks, String paquete, String nombreTabla,boolean auto_inc) { + StringBuilder sb ; + StringBuilder packetes ; + StringBuilder constructores; + StringBuilder gettersSetters; + String[] variableSplit; + String nombreDato = null; + StringBuilder valorPk; + + sb = new StringBuilder(GenedorConstantes.COMENTARIO_DESARROLLADOR); + packetes = new StringBuilder("package ").append(paquete).append(";\n"); + packetes.append("import jakarta.persistence.*;\nimport java.io.Serializable;\n"); + constructores = new StringBuilder(String.format(GenedorConstantes.FORMATO_CONSTRUCTOR, StringUtils.capitalize(nombreTabla).concat("PK"),"")); + constructores.append(GenedorConstantes.TAB).append("public ").append(StringUtils.capitalize(nombreTabla)).append("PK("); + + gettersSetters = new StringBuilder(); + sb.append("@Embeddable\npublic class "); + sb.append(StringUtils.capitalize(nombreTabla)).append("PK"); + sb.append(" implements Serializable {\n"); + int i = 0; + for (String pk : pks) { + variableSplit = pk.trim().split(" "); + + nombreDato = variableSplit[2].split(";")[0]; + + gettersSetters.append(String.format(GenedorConstantes.FORMATO_GET, variableSplit[1],StringUtils.capitalize(nombreDato),nombreDato)); + gettersSetters.append(String.format(GenedorConstantes.FORMATO_SET, StringUtils.capitalize(nombreDato),variableSplit[1],nombreDato,nombreDato,nombreDato)); + if(pk.contains("Date")){ + packetes.append("import java.util.Date;\n"); + } + if(pk.contains("BigDecimal")){ + packetes.append("import java.math.BigDecimal;\n"); + } + if(pk.contains("BigInteger")){ + packetes.append("import java.math.BigInteger;\n"); + } + constructores.append(variableSplit[1]).append(" ").append(nombreDato); + if(i != (pks.size()-1)){ + constructores.append(", "); + } + sb.append(GenedorConstantes.TAB).append("@Basic(optional = false)\n"); + if(i == 0 && auto_inc){ + sb.append(GenedorConstantes.TAB).append("@GeneratedValue(strategy = GenerationType.IDENTITY)\n"); + } + sb.append(GenedorConstantes.TAB).append(String.format("@Column(name = \"%s\")\n", nombreDato)); + sb.append(pk); + i++; + } + constructores.append("){\n }\n\n"); + valorPk = new StringBuilder(packetes).append(sb.append(constructores.append(gettersSetters.append("\n}")))); + + return valorPk.toString(); + } + + public static String tipoValor(String tipo, int presicion, int escala){ + String tipoJava = "String"; + + switch (tipo.toLowerCase()) { + case "int": + tipoJava = "Integer"; + if(escala == 0 ){ + if(presicion > 5){ + tipoJava = "Long"; + } + if(presicion == 1){ + tipoJava = "Short"; + } + + }else{ + tipoJava = "Double"; + + if(presicion > 7 && escala>2){ + tipoJava = "BigDecimal"; + } + } + break; + case "varchar": + tipoJava = "String"; + break; + case "number": + tipoJava = "Integer"; + break; + case "date": + tipoJava = "Date"; + break; + case "datetime": + tipoJava = "Date"; + break; + default: + throw new AssertionError(); + } + return tipoJava; + + + } +} diff --git a/src/main/java/com/qsoft/generador/entidades/coneccion/Conexion.java b/src/main/java/com/qsoft/generador/entidades/coneccion/Conexion.java new file mode 100644 index 0000000..42e765a --- /dev/null +++ b/src/main/java/com/qsoft/generador/entidades/coneccion/Conexion.java @@ -0,0 +1,139 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.qsoft.generador.entidades.coneccion; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * + * @author developer2 + */ +public class Conexion { + private String driver; + private String database; + private String host; + private String port; + private String url; + private String user; + private String pass; + + /** + Crear conexion a mysql + */ + public Connection crearConexionMysql(){ + Connection con = null; + try { + Class.forName(driver); + con = DriverManager.getConnection(url, user, pass); + } catch (ClassNotFoundException | SQLException e) { + e.printStackTrace(); + } + + return con; + } + public void cerrar(Connection con) throws SQLException { + if (con != null) { + con.close(); + } + } + + + + public ResultSet crearResult(Connection con, String consulta) throws SQLException{ + ResultSet rs = null; + PreparedStatement stmt = con.prepareStatement(consulta) ; + rs = stmt.executeQuery(); + + return rs; + } + + private void setBasics(){ + driver = "com.mysql.cj.jdbc.Driver"; + port = "3306"; + } + + public Conexion() { + setBasics(); + } + /** + * Constructor + */ + public Conexion(String driver, String database, String host, String port, String url, String user, String pass) { + this.driver = driver; + this.database = database; + this.host = host; + this.port = port; + this.url = url; + this.user = user; + this.pass = pass; + } + /** + * GETERS Y SETTERS + */ + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } + + public String getDatabase() { + return database; + } + + public void setDatabase(String database) { + this.database = database; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getPass() { + return pass; + } + + public void setPass(String pass) { + this.pass = pass; + } + + + + + +} diff --git a/src/main/java/com/qsoft/generador/entidades/constantes/GenedorConstantes.java b/src/main/java/com/qsoft/generador/entidades/constantes/GenedorConstantes.java new file mode 100644 index 0000000..262d23c --- /dev/null +++ b/src/main/java/com/qsoft/generador/entidades/constantes/GenedorConstantes.java @@ -0,0 +1,72 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.qsoft.generador.entidades.constantes; + +/** + * + * @author developer2 + */ +public class GenedorConstantes { + public static final String TAB = " "; + public static final String COMENTARIO_DESARROLLADOR = "/**\n *\n * @author Christian Ruales\n */\n"; + public static final String ESQUEMA_CLASE = "package %s;\n" + +"import jakarta.persistence.*;\n" + +"\n" + +"@Entity\n" + +"@Table(name = \"%s\")\n" + +"public class %s {\n" + +"\n" + +" public %s() {\n" + +" }\n" + +"\n" + +"\n" + +" public %s(%s %s) {\n" + +" this.%s = %s;\n" + +" }\n" + +"\n" + +"%s" + +"\n" + +"}"; + public static final String FORMATO_PK = " @Id\n" + +" @GeneratedValue(strategy = GenerationType.IDENTITY)\n" + +" @Column(name = \"%s\")\n" + +" private %s %s;\n" +";"; + public static final String FORMATO_ANOTACIONES_AUTO_INCREMENT_PK = " @Id\n" + +" @GeneratedValue(strategy = GenerationType.IDENTITY)\n" + +" @Column(name = \"%s\")\n" ; + public static final String FORMATO_ANOTACIONES_PK = " @Id\n" + +" @Basic(optional = false)\n" + +" @Column(name = \"%s\")\n"; + public static final String FORMATO_CAMPO_NORMAL= " @Column(name = \"%s\")\n" + +" private %s %s;\n" ; + public static final String FORMATO_CAMPO_RELACION = " @JoinColumn(name = \"%s\", insertable = false, updatable = false)\n" + +" @ManyToOne\n" + +" private %s %s;\n"; + + public static final String FORMATO_CONSTRUCTOR = " public %s(%s) {\n" + +" }\n\n"; + + public static final String FORMATO_GET=" public %s get%s() {\n" + +" return %s;\n" + +" }\n" + +"\n"; + public static final String FORMATO_SET=" public void set%s(%s %s) {\n" + +" this.%s = %s;\n" + +" }\n\n"; + + public static final String SQL_CAMPOS_RELACIONES = "SELECT c.TABLE_SCHEMA,c.TABLE_NAME,c.COLUMN_NAME,c.ORDINAL_POSITION,c.DATA_TYPE,\n" + +"c.CHARACTER_MAXIMUM_LENGTH,c.NUMERIC_PRECISION,c.NUMERIC_SCALE,c.COLUMN_KEY,\n" + +"t.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE,t.COLUMN_NAME, t.REFERENCED_TABLE_NAME, t.REFERENCED_COLUMN_NAME,tab.`AUTO_INCREMENT` \n" + +"FROM information_schema.`COLUMNS` c\n" + +" LEFT join information_schema.KEY_COLUMN_USAGE t on\n" + +" t.TABLE_SCHEMA = c.TABLE_SCHEMA and c.TABLE_NAME = t.TABLE_NAME \n" + +" AND c.COLUMN_NAME = t.COLUMN_NAME \n" + +" left join information_schema.TABLE_CONSTRAINTS tc on\n" + +" t.TABLE_SCHEMA = tc.TABLE_SCHEMA and t.TABLE_NAME = tc.TABLE_NAME \n" + +" and t.CONSTRAINT_NAME = tc.CONSTRAINT_NAME \n" + +"left join information_schema.TABLES tab on\n" + +" t.TABLE_SCHEMA = tab.TABLE_SCHEMA and t.TABLE_NAME = tab.TABLE_NAME \n"+ +"where c.TABLE_SCHEMA = '%s' and c.TABLE_NAME = '%s'" ; +} diff --git a/target/classes/com/qsoft/generador/entidades/GeneradorEntidades.class b/target/classes/com/qsoft/generador/entidades/GeneradorEntidades.class new file mode 100644 index 0000000..e885a7d Binary files /dev/null and b/target/classes/com/qsoft/generador/entidades/GeneradorEntidades.class differ diff --git a/target/classes/com/qsoft/generador/entidades/coneccion/Conexion.class b/target/classes/com/qsoft/generador/entidades/coneccion/Conexion.class new file mode 100644 index 0000000..1cb5465 Binary files /dev/null and b/target/classes/com/qsoft/generador/entidades/coneccion/Conexion.class differ diff --git a/target/classes/com/qsoft/generador/entidades/constantes/GenedorConstantes.class b/target/classes/com/qsoft/generador/entidades/constantes/GenedorConstantes.class new file mode 100644 index 0000000..15a1df8 Binary files /dev/null and b/target/classes/com/qsoft/generador/entidades/constantes/GenedorConstantes.class differ diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..cc758aa --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +/home/developer2/NetBeansProjects/generador-entidades/src/main/java/com/qsoft/generador/entidades/constantes/GenedorConstantes.java +/home/developer2/NetBeansProjects/generador-entidades/src/main/java/com/qsoft/generador/entidades/coneccion/Conexion.java +/home/developer2/NetBeansProjects/generador-entidades/src/main/java/com/qsoft/generador/entidades/GeneradorEntidades.java