SQL DDL 转 Java 实体类工具

将 SQL DDL 语句转换为 Java 实体类,支持 JPA、Lombok、验证注解等功能

数据类型映射

字符串类型

  • VARCHAR, CHAR, TEXT → String
  • LONGTEXT, MEDIUMTEXT → String
  • ENUM → String

数字类型

  • INT, INTEGER → Integer
  • BIGINT → Long
  • SMALLINT → Short
  • TINYINT → Byte
  • DECIMAL, NUMERIC → BigDecimal
  • FLOAT, DOUBLE → Double

时间类型

  • DATETIME, TIMESTAMP → LocalDateTime
  • DATE → LocalDate
  • TIME → LocalTime

其他类型

  • BOOLEAN, BOOL → Boolean
  • BLOB, BINARY → byte[]
  • JSON → String

命名规范

驼峰命名:user_name → userNameaccess_date → accessDate
下划线命名:user_name → user_nameaccess_date → access_date

时间类型映射

启用时间对象:DATETIME → LocalDateTimeDATE → LocalDateTIME → LocalTime
禁用时间对象:DATETIME → StringDATE → StringTIME → String

工具简介:SQL DDL 转 Java 实体类工具

在 Java 开发中,特别是使用 Spring Boot 和 JPA 框架时,经常需要根据数据库表结构创建对应的实体类。手动编写这些实体类不仅耗时,还容易出错。本工具可以自动将 SQL DDL 语句转换为标准的 Java 实体类,大大提高开发效率。

什么是SQL DDL 转 Java 实体类工具?

SQL DDL 转 Java 实体类用于在SQL DDL与Java 实体类之间快速转换,输出可直接用于Java 实体类场景。

如何使用

  1. 粘贴SQL DDL内容或输入参数。
  2. 选择输出为Java 实体类并设置转换选项。
  3. 查看结果并复制或下载。

常见应用场景

  • SQL DDL 与 Java 实体类 之间的格式迁移与对接
  • 将 SQL DDL 数据用于 Java 实体类 生态或代码生成
  • 调试与验证转换是否符合规范

❓ 常见问题 FAQ

Q1:转换失败或结果为空?
A:请确认SQL DDL格式是否有效,必要时先格式化或清洗输入。

Q2:转换后顺序或缩进改变?
A:输出会遵循Java 实体类语法规则,可能调整空白或键顺序。

Q3:如何批量处理?
A:建议分批转换以避免单次输入过大。

✨ 主要特性

  • 🔄 智能转换:自动解析 CREATE TABLE 语句,生成对应的 Java 实体类
  • 🏷️ 多注解支持:支持生成 JPA、Lombok、Bean Validation 注解
  • 📊 类型映射:完整的 SQL 数据类型到 Java 类型映射
  • ⚙️ 可配置选项:自定义包名、注解生成选项、命名规范、时间类型映射
  • 🔧 约束处理:自动处理主键、外键、唯一约束、默认值等
  • 📝 代码规范:生成符合 Java 命名规范的代码
  • 🎯 命名灵活性:支持驼峰命名和下划线命名两种风格
  • 时间类型选择:可选择将时间字段映射为时间对象或字符串

📖 使用示例

基本表结构转换

输入 SQL DDL:

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    age INT,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

输出 Java 实体类:

package com.example.entity;

import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "users")
public class Users implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "username", nullable = false, unique = true)
    private String username;

    @Column(name = "email", nullable = false)
    private String email;

    @Column(name = "age")
    private Integer age;

    @Column(name = "is_active")
    private Boolean isActive;

    @Column(name = "created_at")
    private LocalDateTime createdAt;

    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
}

复杂表结构转换

输入 SQL DDL:

CREATE TABLE orders (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_no VARCHAR(32) NOT NULL UNIQUE,
    user_id BIGINT NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') DEFAULT 'pending',
    order_data JSON,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

输出 Java 实体类:

package com.example.entity;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "orders")
public class Orders implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "order_no", nullable = false, unique = true)
    private String orderNo;

    @Column(name = "user_id", nullable = false)
    private Long userId;

    @Column(name = "total_amount", nullable = false)
    private BigDecimal totalAmount;

    @Column(name = "status")
    private String status;

    @Column(name = "order_data")
    private String orderData;

    @Column(name = "created_at")
    private LocalDateTime createdAt;
}

🎯 应用场景

1. Spring Boot 项目开发

// 用户服务类
@Service
@Transactional
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    public Users createUser(Users user) {
        // 验证用户名唯一性
        if (userRepository.existsByUsername(user.getUsername())) {
            throw new BusinessException("用户名已存在");
        }
        
        // 设置创建时间
        user.setCreatedAt(LocalDateTime.now());
        user.setUpdatedAt(LocalDateTime.now());
        user.setIsActive(true);
        
        return userRepository.save(user);
    }
    
    public Users updateUser(Long id, Users userUpdate) {
        Users existingUser = userRepository.findById(id)
            .orElseThrow(() -> new EntityNotFoundException("用户不存在"));
        
        // 更新字段
        existingUser.setEmail(userUpdate.getEmail());
        existingUser.setAge(userUpdate.getAge());
        existingUser.setUpdatedAt(LocalDateTime.now());
        
        return userRepository.save(existingUser);
    }
    
    public void deleteUser(Long id) {
        if (!userRepository.existsById(id)) {
            throw new EntityNotFoundException("用户不存在");
        }
        userRepository.deleteById(id);
    }
    
    public Page<Users> findUsers(Pageable pageable) {
        return userRepository.findAll(pageable);
    }
}

2. JPA Repository 接口

// 用户数据访问层
@Repository
public interface UserRepository extends JpaRepository<Users, Long> {
    
    // 根据用户名查找用户
    Optional<Users> findByUsername(String username);
    
    // 检查用户名是否存在
    boolean existsByUsername(String username);
    
    // 根据邮箱查找用户
    Optional<Users> findByEmail(String email);
    
    // 查找活跃用户
    List<Users> findByIsActiveTrue();
    
    // 根据年龄范围查找用户
    List<Users> findByAgeBetween(Integer minAge, Integer maxAge);
    
    // 自定义查询:查找最近注册的用户
    @Query("SELECT u FROM Users u WHERE u.createdAt >= :date ORDER BY u.createdAt DESC")
    List<Users> findRecentUsers(@Param("date") LocalDateTime date);
    
    // 更新用户状态
    @Modifying
    @Query("UPDATE Users u SET u.isActive = :active WHERE u.id = :id")
    int updateUserStatus(@Param("id") Long id, @Param("active") Boolean active);
}

📐 数据类型映射表

MySQL 类型映射

SQL 类型 Java 类型 说明
VARCHAR, CHAR, TEXT String 字符串类型
INT, INTEGER Integer 32位整数
BIGINT Long 64位整数
SMALLINT Short 16位整数
TINYINT Byte 8位整数
DECIMAL, NUMERIC BigDecimal 高精度小数
FLOAT Float 单精度浮点数
DOUBLE Double 双精度浮点数
BOOLEAN, BOOL Boolean 布尔值
DATETIME, TIMESTAMP LocalDateTime 日期时间
DATE LocalDate 日期
TIME LocalTime 时间
JSON String JSON 数据
BLOB, BINARY byte[] 二进制数据

PostgreSQL 类型映射

SQL 类型 Java 类型 说明
VARCHAR, TEXT String 字符串类型
INTEGER Integer 32位整数
BIGINT Long 64位整数
SMALLINT Short 16位整数
NUMERIC BigDecimal 高精度小数
REAL Float 单精度浮点数
DOUBLE PRECISION Double 双精度浮点数
BOOLEAN Boolean 布尔值
TIMESTAMP LocalDateTime 时间戳
DATE LocalDate 日期
TIME LocalTime 时间
JSONB, JSON String JSON 数据
BYTEA byte[] 二进制数据

⚙️ 配置选项详解

注解配置

  • 生成 JPA 注解:添加 @Entity@Table@Column@Id 等 JPA 标准注解
  • 生成 Lombok 注解:添加 @Data@NoArgsConstructor@AllArgsConstructor 注解
  • 生成验证注解:添加 @NotNull@Size 等 Bean Validation 注解
  • 实现 Serializable 接口:让生成的类实现序列化接口

命名规范配置

  • 启用驼峰命名user_nameuserName(推荐,符合 Java 规范)
  • 保持下划线命名user_nameuser_name(特殊需求场景)

时间类型映射配置

  • 映射为时间对象DATETIMELocalDateTime(推荐,类型安全)
  • 映射为字符串DATETIMEString(兼容性考虑)

🔧 使用技巧

  1. 命名规范:根据项目需求选择驼峰命名或下划线命名
  2. 注解选择:可以选择性生成 JPA、Lombok、验证注解
  3. 包名设置:可以自定义生成代码的包名
  4. 序列化支持:可选择实现 Serializable 接口
  5. 约束处理:自动识别主键、唯一约束、默认值等
  6. 时间类型:根据业务需求选择时间对象或字符串映射

🎓 学习要点

  • 理解 SQL DDL 语句的结构和语法
  • 掌握 Java 实体类的设计和注解使用
  • 学习 JPA 规范和 Hibernate 实现
  • 了解数据库设计和 ORM 映射的最佳实践

这个 SQL DDL 转 Java 实体类工具是 Java 开发者的得力助手,让数据库实体的创建变得简单高效!