UpgradeService.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package com.gitee.gen.service;
  2. import com.gitee.gen.entity.ColumnInfo;
  3. import com.gitee.gen.mapper.UpgradeMapper;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.core.io.ClassPathResource;
  7. import org.springframework.stereotype.Service;
  8. import org.springframework.util.FileCopyUtils;
  9. import java.io.File;
  10. import java.io.FileOutputStream;
  11. import java.io.IOException;
  12. import java.util.List;
  13. import java.util.Objects;
  14. /**
  15. * 升级
  16. * @author tanghc
  17. */
  18. @Service
  19. public class UpgradeService {
  20. public static final String TABLE_DATASOURCE_CONFIG = "datasource_config";
  21. public static final String TABLE_TEMPLATE_CONFIG = "template_config";
  22. public static final String TABLE_TEMPLATE_GROUP = "template_group";
  23. public static final String TABLE_GENERATE_HISTORY = "generate_history";
  24. @Autowired
  25. private UpgradeMapper upgradeMapper;
  26. @Value("${spring.datasource.driver-class-name}")
  27. private String driverClassName;
  28. public static void initDatabase() {
  29. String filename = "gen.db";
  30. String filepath = System.getProperty("user.dir") + "/" + filename;
  31. File dbFile = new File(filepath);
  32. if (!dbFile.exists()) {
  33. ClassPathResource resource = new ClassPathResource(filename);
  34. try {
  35. FileCopyUtils.copy(resource.getInputStream(), new FileOutputStream(dbFile));
  36. } catch (IOException e) {
  37. throw new RuntimeException("初始化数据库失败", e);
  38. }
  39. }
  40. }
  41. /**
  42. * 升级
  43. */
  44. public void upgrade() {
  45. upgradeV1_4_0();
  46. }
  47. /**
  48. * 升级v1.4.0
  49. */
  50. private void upgradeV1_4_0() {
  51. this.createTable(TABLE_GENERATE_HISTORY);
  52. boolean isCreate = this.createTable(TABLE_TEMPLATE_GROUP);
  53. if (isCreate) {
  54. runSql("INSERT INTO `template_group` (`id`, `group_name`, `is_deleted`) VALUES (1,'default',0)");
  55. }
  56. this.addColumn(TABLE_DATASOURCE_CONFIG, "package_name", "varchar(100)");
  57. this.addColumn(TABLE_DATASOURCE_CONFIG, "del_prefix", "varchar(200)");
  58. this.addColumn(TABLE_DATASOURCE_CONFIG, "group_id", "int");
  59. this.addColumn(TABLE_TEMPLATE_CONFIG, "group_id", "int");
  60. this.addColumn(TABLE_TEMPLATE_CONFIG, "group_name", "varchar(100)");
  61. runSql("update template_config set group_id=1,group_name='default' where group_id IS NULL");
  62. }
  63. private void runSql(String sql) {
  64. upgradeMapper.runSql(sql);
  65. }
  66. /**
  67. * 添加表字段
  68. * @param tableName 表名
  69. * @param columnName 字段名
  70. * @param type 字段类型,如:varchar(128),text,integer
  71. * @return 返回true,插入成功
  72. */
  73. public boolean addColumn(String tableName, String columnName, String type) {
  74. if (!isColumnExist(tableName, columnName)) {
  75. if (isMysql()) {
  76. upgradeMapper.addColumnMysql(tableName, columnName, type);
  77. } else {
  78. upgradeMapper.addColumn(tableName, columnName, type);
  79. }
  80. return true;
  81. }
  82. return false;
  83. }
  84. /**
  85. * 创建表
  86. * @param tableName 表名
  87. * @return 创建成功返回true
  88. */
  89. public boolean createTable(String tableName) {
  90. if (!isTableExist(tableName)) {
  91. String sql = this.loadDDL(tableName);
  92. upgradeMapper.runSql(sql);
  93. return true;
  94. }
  95. return false;
  96. }
  97. private String loadDDL(String tableName) {
  98. String tmp_mysql = "ddl_%s_mysql.txt";
  99. String tmp_sqlite = "ddl_%s_sqlite.txt";
  100. String tmp = isMysql() ? tmp_mysql : tmp_sqlite;
  101. String filename = "upgrade/" + String.format(tmp, tableName);
  102. ClassPathResource resource = new ClassPathResource(filename);
  103. if (!resource.exists()) {
  104. throw new RuntimeException("找不到文件:" + filename);
  105. }
  106. try {
  107. byte[] bytes = FileCopyUtils.copyToByteArray(resource.getInputStream());
  108. return new String(bytes);
  109. } catch (IOException e) {
  110. e.printStackTrace();
  111. throw new RuntimeException("打开文件出错", e);
  112. }
  113. }
  114. /**
  115. * 判断列是否存在
  116. * @param tableName 表名
  117. * @param columnName 列名
  118. * @return true:存在
  119. */
  120. public boolean isColumnExist(String tableName, String columnName) {
  121. List<ColumnInfo> columnInfoList = isMysql() ? upgradeMapper.listColumnInfoMysql(tableName) :
  122. upgradeMapper.listColumnInfo(tableName);
  123. return columnInfoList
  124. .stream()
  125. .anyMatch(columnInfo -> Objects.equals(columnInfo.getName(), columnName));
  126. }
  127. /**
  128. * 表是否存在
  129. * @param tableName
  130. * @return
  131. */
  132. public boolean isTableExist(String tableName) {
  133. List<String> tableNameList;
  134. if (isMysql()) {
  135. tableNameList = upgradeMapper.listTableNameMysql();
  136. } else {
  137. tableNameList = upgradeMapper.listTableName();
  138. }
  139. return tableNameList != null && tableNameList.contains(tableName);
  140. }
  141. private boolean isMysql() {
  142. return this.driverClassName.contains("mysql");
  143. }
  144. }