Como gerar uma classe Java a partir de SQL

Cole uma ou mais instruções CREATE TABLE e clique em “SQL para classe Java”. Cada tabela vira uma classe public própria, com um campo private por coluna, getter e setter para cada campo e os imports de java.math e java.time que os tipos mapeados exigem.

O analisador aceita uma parte documentada do DDL, não a gramática SQL inteira: tipos de coluna do MySQL, PostgreSQL, SQL Server, Oracle e SQLite, identificadores com crase, aspas ou colchetes, comentários de coluna e restrições de tabela. Tudo roda nesta aba, então um esquema que você não pode enviar para um servidor também pode ser convertido aqui.

  1. Cole a instrução CREATE TABLE na área de texto ou clique em “Exemplo” para carregar uma tabela com chave primária, índice, chave estrangeira e comentários de coluna.
  2. Clique em “SQL para classe Java”. É gerada uma classe por tabela; se duas tabelas produzirem o mesmo nome de classe, a segunda recebe um sufixo numérico.
  3. Leia a linha de status acima do resultado: ela informa quantas classes e campos foram gerados ou explica por que nada foi gerado (entrada vazia, nenhuma instrução CREATE TABLE ou tabela sem colunas).
  4. Clique em “Copiar” para levar a classe ao seu editor e em “Limpar” para esvaziar a área antes do próximo esquema.

O que a classe gerada contém

Como os tipos de coluna são mapeados

As larguras inteiras são respeitadas: int, integer, smallint, mediumint e serial viram int; bigint vira long; tinyint(1) vira boolean e os demais tinyint viram int; um int unsigned vira long e um bigint unsigned vira BigInteger. float, real e double viram double.

decimal e numeric são lidos por precisão e escala: escala 0 com até 9 dígitos vira int, até 18 dígitos long e o resto BigDecimal — assim decimal(10,2) é BigDecimal, não um double que arredondaria valores. char, varchar, text, json, xml, enum, set e uuid viram String; date, time, datetime e timestamp viram LocalDate, LocalTime, LocalDateTime ou, com fuso horário, OffsetDateTime; bit(1) vira boolean e bit(n), binary, varbinary e a família blob viram byte[]. Um tipo não reconhecido vira Object com a nota // unmapped SQL type, nunca um palpite silencioso.

O que é ignorado, renomeado ou comentado

As restrições de tabela são descartadas em vez de virarem campos: PRIMARY KEY (id), KEY, UNIQUE, CONSTRAINT ... FOREIGN KEY, CHECK e INDEX são reconhecidas e ignoradas, enquanto uma coluna com restrição própria — id int PRIMARY KEY — é mantida. Comentários --, # e /* */ são removidos antes da análise, inclusive quando ocupariam o resto da linha, e marcadores dentro de uma string literal são preservados. Um COMMENT 'buyer id' de coluna é copiado para o campo como nota // buyer id.

Os identificadores perdem as aspas: `address_id`, "user name" e [order] saem como addressId, userName e order. snake_case vira camelCase, palavras reservadas do Java recebem um sublinhado inicial (class vira _class) e nomes que começam com dígito também (2fa vira _2fa); o acessor remove esse sublinhado, então o setter é setClass. Quando o nome Java difere do nome SQL, o campo ainda leva a nota // column: ... para que a renomeação apareça na revisão.

Privacidade, tamanho e o que a ferramenta não é

A conversão acontece na página: enquanto trabalha, a ferramenta não faz nenhuma requisição e o esquema não é enviado a lugar algum. Resultados de até 120.000 caracteres recebem realce de sintaxe; uma classe maior é exibida como texto simples para a aba continuar responsiva. Medido no Chrome nesta página: 500 colunas (94 KB de Java) levam cerca de meio segundo com realce, 1.000 colunas (188 KB) cerca de 30 ms e 2.000 colunas (385 KB) cerca de 40 ms sem ele.

O resultado é um ponto de partida, não um mapeamento ORM: não há anotações JPA ou Hibernate, nem Lombok, nem construtores, equals, hashCode ou toString, nem relacionamentos de chave estrangeira, nem nulabilidade — uma coluna NOT NULL não é marcada. Confira nomes e tipos no esquema antes de levar a classe para um projeto; para uma amostra JSON, use a página JSON para classe Java.

Ferramentas recentes: