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 实体类场景。
如何使用
- 粘贴SQL DDL内容或输入参数。
- 选择输出为Java 实体类并设置转换选项。
- 查看结果并复制或下载。
常见应用场景
- 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_name→userName(推荐,符合 Java 规范) - 保持下划线命名:
user_name→user_name(特殊需求场景)
时间类型映射配置
- 映射为时间对象:
DATETIME→LocalDateTime(推荐,类型安全) - 映射为字符串:
DATETIME→String(兼容性考虑)
🔧 使用技巧
- 命名规范:根据项目需求选择驼峰命名或下划线命名
- 注解选择:可以选择性生成 JPA、Lombok、验证注解
- 包名设置:可以自定义生成代码的包名
- 序列化支持:可选择实现 Serializable 接口
- 约束处理:自动识别主键、唯一约束、默认值等
- 时间类型:根据业务需求选择时间对象或字符串映射
🎓 学习要点
- 理解 SQL DDL 语句的结构和语法
- 掌握 Java 实体类的设计和注解使用
- 学习 JPA 规范和 Hibernate 实现
- 了解数据库设计和 ORM 映射的最佳实践
这个 SQL DDL 转 Java 实体类工具是 Java 开发者的得力助手,让数据库实体的创建变得简单高效!