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. Django 前后端数据传输、ajax、分页器

    返回ORM目录 Django ORM 内容目录: 一.MTV与MVC模式 二.多对多表三种创建方式 三.前后端传输数据 四.Ajax ​ 五.批量插入数据 六.自定义分页器 一.MTV与MVC模式 M ...

  2. shell 命令 进程相关

     1. 进程标识号PID 唯一性 pid 为0    内核进程,linux内核创建 pid 为1    init进程,系统最早创建的进程,init是所有用户进程的祖先 2. 查看系统进程信息 (1)[ ...

  3. JS对象 Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒)。 定义一个时间对象 : var Udate=new Date();Date()的首字母须大写

    Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date()的首 ...

  4. Got permission denied while trying to connect to the Docker daemon

    答案:https://stackoverflow.com/questions/48568172/docker-sock-permission-denied

  5. 微信公众号支付出现:“当前页面的URL未注册”

    微信公众号H5调起支付时,点击支付按钮出现“当前页面的URL未注册”的提示.解决办法:由于2017年8月1日微信官方把关于支付的信息转移到了商户平台:公众平台微信支付公众号支付授权目录.扫码支付回调U ...

  6. js 异步编程思想

    一.js中的异步编程有四种情况 1.定时器 2.所有的事件绑定 3.ajax异步请求 4.回调函数

  7. win7防火墙里开启端口的图文教程 + SNMP测试感触

    转:http://www.cnblogs.com/vipsoft/archive/2012/05/02/2478847.html 开启端口:打开“控制面板”中的“Windows防火墙”,点击左侧的“高 ...

  8. Linux课程---12、linux中内存指令(top命令的作用是什么)

    Linux课程---12.linux中内存指令(top命令的作用是什么) 一.总结 一句话总结: top实时观察进程.内存和CPU情况 1.电脑出现反应慢情况,最先想到的是什么? 内存 2.linux ...

  9. PAT甲级——A1120 Friend Numbers【20】

    Two integers are called "friend numbers" if they share the same sum of their digits, and t ...

  10. map 与 lambda 的用法

    # 列表中的每个元素进行*2lis = [10, 30, 70]f = map(lambda li: li*2, lis) # 操作lis中的每个元素.print(list(f)) # 返回来一个新的 ...