1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.lang.reflect.Field;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import org.hibernate.hql.internal.ast.SqlGenerator;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. public class Test {
  10. private static final Logger logger = LoggerFactory.getLogger(SqlGenerator.class);
  11. public static void main(String[] args) {
  12. //实体类所在的package在磁盘上的绝对路径
  13. String packageName = "d:/workspace/";
  14. //生成sql的文件夹
  15. String filePath = "I:/create/";
  16. //项目中实体类的路径
  17. String prefix = "com.zh.entity.";
  18. String className = "";
  19. StringBuffer sqls = new StringBuffer();
  20. //获取包下的所有类名称
  21. List<String> list = getAllClasses(packageName);
  22. for (String str : list) {
  23. className = prefix + str.substring(0, str.lastIndexOf("."));
  24. String sql = generateSql(className, filePath);
  25. sqls.append(sql);
  26. }
  27. System.out.println(sqls.toString());
  28. StringToSql(sqls.toString(), filePath + "report.sql");
  29. }
  30. /**
  31. * 根据实体类生成建表语句
  32. * @author
  33. * @date 2019年1月14日
  34. * @param className 全类名
  35. * @param filePath 磁盘路径 如 : d:/workspace/
  36. */
  37. public static String generateSql(String className,String filePath){
  38. try {
  39. Class<?> clz = Class.forName(className);
  40. className = clz.getSimpleName();
  41. Field[] fields = clz.getDeclaredFields();
  42. StringBuffer column = new StringBuffer();
  43. String varchar = " varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,";
  44. for (Field f : fields) {
  45. column.append(" \n `"+f.getName()+"`").append(varchar);
  46. }
  47. StringBuffer sql = new StringBuffer();
  48. sql.append("\n DROP TABLE IF EXISTS `"+className+"`; ")
  49. .append(" \n CREATE TABLE `"+className+"` (")
  50. .append(" \n `id` int(11) NOT NULL AUTO_INCREMENT,")
  51. .append(" \n "+column)
  52. .append(" \n PRIMARY KEY (`id`) USING BTREE,")
  53. .append("\n INDEX `id`(`id`) USING BTREE")
  54. .append(" \n ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci;");
  55. return sql.toString();
  56. } catch (ClassNotFoundException e) {
  57. logger.debug("该类未找到!");
  58. return null;
  59. }
  60. }
  61. /**
  62. * 获取包下的所有类名称,获取的结果类似于 XXX.java
  63. * @author
  64. * @date 2019年1月14日
  65. * @param packageName
  66. * @return
  67. */
  68. public static List<String> getAllClasses(String packageName){
  69. List<String> classList = new ArrayList<String>();
  70. String className="";
  71. File f = new File(packageName);
  72. if(f.exists() && f.isDirectory()){
  73. File[] files = f.listFiles();
  74. for (File file : files) {
  75. className = file.getName();
  76. classList.add(className);
  77. }
  78. return classList;
  79. }else{
  80. logger.debug("包路径未找到!");
  81. return null;
  82. }
  83. }
  84. /**
  85. * 将string 写入sql文件
  86. * @author
  87. * @date 2019年1月14日
  88. * @param str
  89. * @param path
  90. */
  91. public static void StringToSql(String str,String path){
  92. byte[] sourceByte = str.getBytes();
  93. if(null != sourceByte){
  94. try {
  95. File file = new File(path); //文件路径(路径+文件名)
  96. if (!file.exists()) { //文件不存在则创建文件,先创建目录
  97. File dir = new File(file.getParent());
  98. dir.mkdirs();
  99. file.createNewFile();
  100. }
  101. FileOutputStream outStream = new FileOutputStream(file); //文件输出流用于将数据写入文件
  102. outStream.write(sourceByte);
  103. outStream.flush();
  104. outStream.close(); //关闭文件输出流
  105. System.out.println("生成成功");
  106. } catch (Exception e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. }
  111. }

生成的代码截图如下:

原文地址:https://blog.csdn.net/zgsdzczh/article/details/86487149

通过实体类生成建表SQL语句实现方法的更多相关文章

  1. [04] 利用注解生成实体类对应的建表sql语句

    1.实现功能 我们已经对注解有了基本的认识,知道了如何自定义注解,如何使用和最基本的处理注解. 本篇主要介绍,如何使用运行时级别的注解,配合反射来自动生成建表的sql语句.如下例: 我们有实体类Stu ...

  2. powerdesigner中将表的name在生成建表sql时生成注释

    1.为powerdesigner的表设置注释方法: powerdesigner默认没有注释: 设置方法: 选择那个表 右键- >Properties- >Columns- >Cust ...

  3. sqlite3 根据实体自动生成建表语句

      public class BuildSqlTool { public static string GetCreateTableSql(object t) { //CREATE TABLE &quo ...

  4. 【原创】Hibernate通过实体类自动建表时type=MyISAM的问题

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 当使用的mysql数据库为5.5版本时,方言需要设置为 <property name="hibernate.dialect&q ...

  5. 1-基本建表sql语句

    基本的建表语句的总结 --建表语法 CREATE TABLE 表名( --约束可以没有 列名1 数据类型 [约束], 列名2 数据类型 [约束], ......, [约束], ..... ); --该 ...

  6. 配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  7. C#实体类生成Create Table SQL

    using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespac ...

  8. PostgreSQL建表SQL语句写法

    DROP TABLE IF EXISTS bus; CREATE TABLE bus( id SERIAL PRIMARY KEY, mac ) NOT NULL UNIQUE, route int ...

  9. 在线数据库表(sql语句)生成java实体类工具

    相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...

随机推荐

  1. Hadoop Tez框架

  2. JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。

    编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...

  3. 常用的JS方法(见到好的就添加进来)

    // 悬浮置顶 ; (function ($) { $.fn.crumbsFixedPosition = function (options) { var defaults = { cName: 'f ...

  4. HTML加载顺序

    一.js执行顺序 //1. 外部引入的js文件,会异步下载并且执行(<script>块中的语句),根据引入的位置会在不同时刻执行 //2.$().ready(function() {}) ...

  5. COGS2356 【HZOI2015】有标号的DAG计数 IV

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图进行计数. 这里加一个限制:此图必须是弱连通图. 输出答案mod 998244353的结果 输入格式 一个正整数n. 输出格式 一个数,表示答 ...

  6. 配置虚拟机上的RedHat6 Linux系统的网络(选择的是仅主机模式)

    1.启动虚机,网络选择:仅主机模式 2.进入自己的本地网络配置中,修改相关配置 1)修改VMware NetWork Adapter VMnet1 ip为192.168.137.1,子网掩码:255. ...

  7. ZuulFilter

    在服务网关中定义过滤器,只需要继承ZuulFilter抽象类,实现其定义的四个抽象函数,就可对请求进行拦截与过滤 过滤器两个功能: 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入 ...

  8. thinkphp 空控制器

    空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化. 大理石平台价格表 现在我们把前 ...

  9. 最大流Dinic算法的一些优化 [网络流][最大流]

    明天省夏要讲网络流啦!晚上翻出自己的模板发现是蓝书模板QwQ..拿出以前的提交代码(AC过的?) 曾经的提交记录 在luogu上重新提交一遍,结果gg...OVO 没有去除多余的inline 去除了多 ...

  10. JS调用C++

    1.注册C++函数. //注册回调函数宏 //根据不同需要支持注册两个函数原型,注意CONNECT_JS_CALL_SIMPLE_HANDLER中注册的函数 //需要提前和HTML调用协调好,参数必须 ...