当前位置: 首页 > news >正文

简化开发流程:如何通过 JDBC 自动生成符合 Java 命名规范的实体类

在这篇博客中,我分享了如何通过 Java 和 JDBC 自动生成数据库实体类的过程。通常,手动编写实体类代码既繁琐又容易出错,尤其是在数据库表结构发生变化时,手动更新代码的工作量非常大。为了提高开发效率,我利用 JDBC 连接到数据库,通过 DatabaseMetaData 获取表的元数据,自动化获取表的字段信息(如列名、列类型和列注释)。接着,将数据库中的字段名转换为 Java 的驼峰命名法,并根据字段的类型生成合适的 Java 类型(如 String, Long, Integer 等)。此外,我还将数据库字段的注释转化为 Java 类的 Javadoc 注释,使得生成的实体类更加易于理解和维护。生成的实体类会被保存到指定的包路径中,确保项目结构的整洁。通过这种方式,我们能够轻松地为数据库中的每一张表生成相应的实体类,避免了手动编写实体类的繁琐过程,提高了开发效率,也保证了代码的一致性。文章中还提供了完整的代码示例,方便大家理解并应用到自己的项目中。

public class EntityGenerator {

    public static void main(String[] args) {String dbUrl = "jdbc:mysql://:/?useUnicode=true&characterEncoding=utf-8";String dbUsername = "";String dbPassword = "";
//        List<String> tableNames = Arrays.asList("kdb_store_profile_info", "kdb_task_factor");  // 要生成实体类的表名List<String> tableNames = Arrays.asList();  // 为空生成该数据库下所有表结构String packageName = "com.***.base";  // 生成实体类的包名generateEntityClasses(dbUrl, dbUsername, dbPassword, tableNames, packageName);}public static void generateEntityClasses(String dbUrl, String dbUsername, String dbPassword, List<String> tableNames, String packageName) {try (Connection connection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword)) {// 获取数据库元数据DatabaseMetaData metaData = connection.getMetaData();// 如果tableNames为空,获取数据库 "ymkdb" 中的所有表if (tableNames == null || tableNames.isEmpty()) {tableNames = getTableNamesFromDatabase(metaData, "ymkdb");}// 生成每个表的实体类int generatedTableCount = 0;for (String tableName : tableNames) {generateEntityClass(metaData, tableName, packageName);generatedTableCount++;}// 打印日志,显示总共生成了多少张表System.out.println("总共生成了 " + generatedTableCount + " 张表的实体类。");} catch (SQLException | IOException e) {e.printStackTrace();}
}// 获取 "ymkdb" 数据库中的所有表名
private static List<String> getTableNamesFromDatabase(DatabaseMetaData metaData, String databaseName) throws SQLException {List<String> tableNames = new ArrayList<>();ResultSet resultSet = metaData.getTables(databaseName, null, null, new String[] { "TABLE" });while (resultSet.next()) {String tableName = resultSet.getString("TABLE_NAME");tableNames.add(tableName);}return tableNames;
}// 根据表名生成实体类
public static void generateEntityClass(DatabaseMetaData metaData, String tableName, String packageName) throws SQLException, IOException {ResultSet columns = metaData.getColumns(null, null, tableName, null);// 获取表的注释String tableComment = getTableComment(metaData, tableName);StringBuilder classContent = new StringBuilder();//        // 类名转换为首字母大写String className = toClassName(tableName);// 包名和类名classContent.append("package ").append(packageName).append(";\n\n");// 导入语句classContent.append("import lombok.Data;\n");classContent.append("import java.io.Serializable;\n");classContent.append("import java.util.Date;\n\n");// 类定义前添加表名的注释classContent.append("/**\n").append(" * ").append(tableComment != null ? tableComment : tableName).append("\n").append(" */\n");// 类注解和定义classContent.append("@Data\n");classContent.append("public class ").append(className).append(" implements Serializable {\n");// 读取表字段信息while (columns.next()) {String columnName = columns.getString("COLUMN_NAME");String columnType = columns.getString("TYPE_NAME");String columnComment = columns.getString("REMARKS");  // 获取字段的注释// 将数据库字段名转换为驼峰式命名String fieldName = toCamelCase(columnName);String fieldType = getJavaType(columnType);// 添加字段声明classContent.append("\n    /**\n").append("     * ").append(columnComment != null ? columnComment : columnName).append("\n").append("     */\n").append("    private ").append(fieldType).append(" ").append(fieldName).append(";\n");}// 结束类定义classContent.append("\n}");// 保存文件String filePath = "src/main/java/" + packageName.replace('.', '/') + "/" + className + ".java";File file = new File(filePath);file.getParentFile().mkdirs();try (FileWriter writer = new FileWriter(file)) {writer.write(classContent.toString());System.out.println("Java 文件生成成功: " + filePath);}
}// 获取表的注释
private static String getTableComment(DatabaseMetaData metaData, String tableName) throws SQLException {ResultSet resultSet = metaData.getTables(null, null, tableName, new String[] { "TABLE" });if (resultSet.next()) {return resultSet.getString("REMARKS");}return null;  // 默认返回null
}// 将数据库字段名转换为驼峰命名
private static String toCamelCase(String columnName) {StringBuilder camelCaseString = new StringBuilder();String[] parts = columnName.split("_");for (String part : parts) {if (camelCaseString.length() == 0) {camelCaseString.append(part.toLowerCase());} else {camelCaseString.append(part.substring(0, 1).toUpperCase()).append(part.substring(1).toLowerCase());}}return camelCaseString.toString();
}// 将表名转换为类名
private static String toClassName(String tableName) {StringBuilder className = new StringBuilder();String[] parts = tableName.split("_");for (String part : parts) {className.append(part.substring(0, 1).toUpperCase()).append(part.substring(1).toLowerCase());}return className.toString();
}// 根据数据库字段类型映射到 Java 类型
private static String getJavaType(String sqlType) {switch (sqlType) {case "BIGINT":return "Long";case "VARCHAR":return "String";case "TINYINT":return "Integer";case "INT":return "Integer";case "DATETIME":return "Date";default:return "String";  // 默认返回 String 类型}
}

}

http://www.lryc.cn/news/509358.html

相关文章:

  • W25Q128存储器详解
  • Vite系列课程 | 11. Vite 配置文件中 CSS 配置(Modules 模块化篇)
  • Everspin代理MR25H10CDFR存储MRAM
  • cesium小知识:使用 EntityCollection的方法
  • Java 日志类库
  • 【Unity3D】Particle粒子特效或3D物体显示在UGUI上的方案
  • 有没有检测吸烟的软件 ai视频检测分析厂区抽烟报警#Python
  • 《鸣潮》游戏运行时弹出“xinput1_3.dll文件缺失”错误的处理方法,“xinput1_3.dll文件缺失”详解!
  • 大模型应用—HivisionIDPhotos 证件照在线制作!支持离线、换装、美颜等
  • 解决Ubuntu下无法装载 Windows D盘的问题
  • 一体成型电感
  • Reed-Muller(RM)码之编码
  • 【蓝桥杯——物联网设计与开发】基础模块8 - RTC
  • 聚类算法DBSCAN 改进总结
  • uniapp开发微信小程序实现获取“我的位置”
  • java中两个系统进行非对称加密,两个系统的公私钥可以用一套吗?
  • 无人设备遥控器之定向天线篇
  • 【电路笔记 信号】Metastability 平均故障间隔时间(MTBF)公式推导:进入亚稳态+退出亚稳态+同步器的可靠性计算
  • 计算机视觉:原理、分类与应用
  • Vue.js组件开发-使用watch进行深度观察
  • 明厨亮灶系统
  • 虚幻引擎结构之AActor
  • 基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
  • JAVA HTTP压缩数据
  • VSCode 配置远程连接免密登录 插件
  • VIVO C++开发面试题及参考答案
  • Unity3D用正则判断身份证号或邮箱
  • 【终端工具】FinalShell v4.5.12 官方版
  • 【阅读记录-章节6】Build a Large Language Model (From Scratch)
  • 面向未来的教育技术:智能成绩管理系统的开发