Cómo generar una clase Java desde SQL

Pega una o varias sentencias CREATE TABLE y pulsa «SQL a clase Java». Cada tabla se convierte en una clase public propia, con un campo private por columna, getter y setter para cada campo y las importaciones de java.math y java.time que necesitan los tipos asignados.

El analizador admite una parte documentada del DDL, no toda la gramática SQL: tipos de columna de MySQL, PostgreSQL, SQL Server, Oracle y SQLite, identificadores con comillas, comillas invertidas o corchetes, comentarios de columna y restricciones de tabla. Todo ocurre en esta pestaña, así que un esquema que no deberías subir a un servidor también se puede convertir aquí.

  1. Pega la sentencia CREATE TABLE en el área de texto o pulsa «Ejemplo» para cargar una tabla con clave primaria, índice, clave ajena y comentarios de columna.
  2. Pulsa «SQL a clase Java». Se genera una clase por tabla; si dos tablas darían el mismo nombre de clase, la segunda recibe un sufijo numérico.
  3. Lee la línea de estado sobre el resultado: indica cuántas clases y campos se generaron o explica por qué no se generó nada (entrada vacía, ninguna sentencia CREATE TABLE o una tabla sin columnas).
  4. Pulsa «Copiar» para llevar la clase a tu editor y «Limpiar» para vaciar el área antes del siguiente esquema.

Qué contiene la clase generada

Cómo se asignan los tipos de columna

Las anchuras enteras se respetan: int, integer, smallint, mediumint y serial dan int; bigint da long; tinyint(1) da boolean y el resto de tinyint da int; un int unsigned da long y un bigint unsigned da BigInteger. float, real y double dan double.

decimal y numeric se leen por precisión y escala: escala 0 con hasta 9 dígitos da int, hasta 18 dígitos long y el resto BigDecimal, de modo que decimal(10,2) es BigDecimal y no un double que redondearía el importe. char, varchar, text, json, xml, enum, set y uuid dan String; date, time, datetime y timestamp dan LocalDate, LocalTime, LocalDateTime o, con zona horaria, OffsetDateTime; bit(1) da boolean y bit(n), binary, varbinary y la familia blob dan byte[]. Un tipo no reconocido da Object con una nota // unmapped SQL type, nunca una suposición silenciosa.

Qué se omite, se renombra o se comenta

Las restricciones de tabla se descartan en lugar de convertirse en campos: se reconocen y omiten PRIMARY KEY (id), KEY, UNIQUE, CONSTRAINT ... FOREIGN KEY, CHECK e INDEX, mientras que una columna con su propia restricción —id int PRIMARY KEY— se conserva. Los comentarios --, # y /* */ se eliminan antes del análisis, incluso si ocuparían el resto de la línea, y los marcadores dentro de una cadena literal se respetan. Un COMMENT 'buyer id' de columna se copia al campo como nota // buyer id.

Los identificadores pierden las comillas: `address_id`, "user name" y [order] salen como addressId, userName y order. snake_case pasa a camelCase, las palabras reservadas de Java reciben un guion bajo inicial (class pasa a _class) y también los nombres que empiezan por dígito (2fa pasa a _2fa); el accesor elimina ese guion, así que el setter es setClass. Cuando el nombre Java difiere del nombre SQL, el campo lleva además una nota // column: ... para que el cambio se vea al revisar.

Privacidad, tamaño y lo que no es

La conversión ocurre en la página: mientras trabaja no hace ninguna petición y el esquema no se envía a ningún sitio. Los resultados de hasta 120.000 caracteres se colorean; una clase mayor se muestra como texto plano para que la pestaña siga respondiendo. Medido en Chrome en esta página: 500 columnas (94 KB de Java) tardan medio segundo con coloreado, 1.000 columnas (188 KB) unos 30 ms y 2.000 columnas (385 KB) unos 40 ms sin él.

El resultado es un punto de partida, no un mapeo ORM: no hay anotaciones JPA ni Hibernate, ni Lombok, ni constructores, equals, hashCode o toString, ni relaciones de clave ajena, ni nulabilidad: una columna NOT NULL no se marca. Revisa nombres y tipos contra el esquema antes de llevar la clase a un proyecto; para una muestra JSON usa la página JSON a clase Java.

Herramientas recientes: