通過實體類生成建表SQL語句實現方法



   
   
  
  
          
  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM