数据库初始化版本更新
							parent
							
								
									c2bb2dc2ae
								
							
						
					
					
						commit
						ccfacf81f3
					
				| @ -0,0 +1,81 @@ | |||||||
|  | package com.glxp.api.admin.config; | ||||||
|  | 
 | ||||||
|  | import cn.hutool.core.io.IORuntimeException; | ||||||
|  | import cn.hutool.core.io.IoUtil; | ||||||
|  | import cn.hutool.core.lang.UUID; | ||||||
|  | import com.glxp.api.admin.dao.info.DbVersionDao; | ||||||
|  | import com.glxp.api.admin.entity.info.DbVersionEntity; | ||||||
|  | import com.glxp.api.admin.entity.info.SchemaData; | ||||||
|  | import lombok.extern.slf4j.Slf4j; | ||||||
|  | import org.springframework.boot.ApplicationArguments; | ||||||
|  | import org.springframework.boot.ApplicationRunner; | ||||||
|  | import org.springframework.core.annotation.Order; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  | 
 | ||||||
|  | import javax.annotation.Resource; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Date; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | @Order(1) | ||||||
|  | @Component | ||||||
|  | @Slf4j | ||||||
|  | public class HdSchemaExecutor implements ApplicationRunner { | ||||||
|  | 
 | ||||||
|  |     @Resource | ||||||
|  |     DbVersionDao hdCommonDao; | ||||||
|  | 
 | ||||||
|  |     private List<SchemaData> schema = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void run(ApplicationArguments args) throws Exception { | ||||||
|  |         //初始版本列表
 | ||||||
|  |         buildSchemas(); | ||||||
|  |         //定义sql文件路径
 | ||||||
|  |         String basePath = "schemas/"; | ||||||
|  |         //非版本控制,初始化脚本
 | ||||||
|  |         ClassLoader loader = this.getClass().getClassLoader(); | ||||||
|  |         //通过流的方式获取项目路径下的文件
 | ||||||
|  |         InputStream inputStream = loader.getResourceAsStream(basePath + "init.sql"); | ||||||
|  |         //获取文件内容
 | ||||||
|  |         String sql = IoUtil.readUtf8(inputStream); | ||||||
|  |         try { | ||||||
|  |             //判断版本表是否存在
 | ||||||
|  |             int count = hdCommonDao.selectTableExist("hd_version"); | ||||||
|  |             if (count == 0) { | ||||||
|  |                 hdCommonDao.updateSql(sql); | ||||||
|  |             } | ||||||
|  |             for (SchemaData schemaData : schema) { | ||||||
|  |                 //查询版本记录是否存在
 | ||||||
|  |                 count = hdCommonDao.selectVersion(schemaData.getVersion()); | ||||||
|  |                 if (count == 0) { | ||||||
|  |                     log.info("--------------执行数据脚本,版本:" + schemaData.getVersion()); | ||||||
|  |                     //获取对应sql脚本
 | ||||||
|  |                     inputStream = loader.getResourceAsStream(basePath + schemaData.getFileName()); | ||||||
|  |                     sql = IoUtil.readUtf8(inputStream); | ||||||
|  |                     hdCommonDao.updateSql(sql); | ||||||
|  |                     DbVersionEntity entity = new DbVersionEntity(); | ||||||
|  |                     entity.setId(UUID.randomUUID().toString()); | ||||||
|  |                     entity.setVersion(schemaData.getVersion()); | ||||||
|  |                     entity.setCreated(new Date()); | ||||||
|  |                     entity.setRemark(schemaData.getFileName()); | ||||||
|  |                     //写入版本记录
 | ||||||
|  |                     hdCommonDao.insertVersion(entity); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } catch (IORuntimeException e) { | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } finally { | ||||||
|  |             //关闭流
 | ||||||
|  |             inputStream.close(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void buildSchemas() { | ||||||
|  | //        schema.add(new SchemaData("v2.1", "schema_v2.1.sql"));
 | ||||||
|  | //        schema.add(new SchemaData("v2.2", "schema_v2.2.sql"));
 | ||||||
|  | //        schema.add(new SchemaData("v2.3", "schema_v2.3.sql"));
 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | package com.glxp.api.admin.dao.info; | ||||||
|  | 
 | ||||||
|  | import com.glxp.api.admin.entity.info.DbVersionEntity; | ||||||
|  | import org.apache.ibatis.annotations.Mapper; | ||||||
|  | import org.apache.ibatis.annotations.Param; | ||||||
|  | import org.apache.ibatis.annotations.Update; | ||||||
|  | 
 | ||||||
|  | @Mapper | ||||||
|  | public interface DbVersionDao { | ||||||
|  | 
 | ||||||
|  |     int selectVersion(@Param("version") String version); | ||||||
|  | 
 | ||||||
|  |     //查询版本表是否存在
 | ||||||
|  |     int selectTableExist(@Param("tableName") String tableName); | ||||||
|  | 
 | ||||||
|  |     //新增版本
 | ||||||
|  |     int insertVersion(DbVersionEntity entity); | ||||||
|  | 
 | ||||||
|  |     //执行sql
 | ||||||
|  |     @Update("${sql}") | ||||||
|  |     void updateSql(@Param("sql") String sql); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package com.glxp.api.admin.entity.info; | ||||||
|  | 
 | ||||||
|  | import lombok.Data; | ||||||
|  | 
 | ||||||
|  | import java.util.Date; | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | public class DbVersionEntity { | ||||||
|  | 
 | ||||||
|  |     private String id; | ||||||
|  |     private String version; | ||||||
|  |     private String remark; | ||||||
|  |     private Date created; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | package com.glxp.api.admin.entity.info; | ||||||
|  | 
 | ||||||
|  | import lombok.Data; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | public class SchemaData { | ||||||
|  |     /** | ||||||
|  |      * 版本号 | ||||||
|  |      */ | ||||||
|  |     public String version; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 文件名 | ||||||
|  |      */ | ||||||
|  |     public String fileName; | ||||||
|  | 
 | ||||||
|  |     public SchemaData(String version, String fileName) { | ||||||
|  |         this.version = version; | ||||||
|  |         this.fileName = fileName; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||||
|  | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | ||||||
|  | 
 | ||||||
|  | <mapper namespace="com.glxp.api.admin.dao.info.DbVersionDao"> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <select id="selectVersion" resultType="int"> | ||||||
|  |         selecT count(1) | ||||||
|  |         from db_version | ||||||
|  |         where version = #{version} | ||||||
|  |     </select> | ||||||
|  | 
 | ||||||
|  |     <select id="selectTableExist" resultType="int"> | ||||||
|  |         select count(*) count | ||||||
|  |         from information_schema.TABLES | ||||||
|  |         where TABLE_NAME = #{tableName} and table_schema = (select database()) | ||||||
|  | 
 | ||||||
|  |     </select> | ||||||
|  | 
 | ||||||
|  |     <insert id="insertVersion"> | ||||||
|  |         insert into db_version(id, version, remark, created) | ||||||
|  |         values (uuid(), #{version}, #{remark}, #{created}) | ||||||
|  |     </insert> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </mapper> | ||||||
| @ -0,0 +1,109 @@ | |||||||
|  | SET NAMES utf8mb4; | ||||||
|  | SET | ||||||
|  | FOREIGN_KEY_CHECKS = 0; | ||||||
|  | DROP TABLE IF EXISTS `db_version`; | ||||||
|  | CREATE TABLE `db_version` | ||||||
|  | ( | ||||||
|  |     `id`      varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, | ||||||
|  |     `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '版本号', | ||||||
|  |     `created` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', | ||||||
|  |     `remark`  varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', | ||||||
|  |     PRIMARY KEY (`id`) USING BTREE | ||||||
|  | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据版本' ROW_FORMAT = Dynamic; | ||||||
|  | 
 | ||||||
|  | SET | ||||||
|  | FOREIGN_KEY_CHECKS = 1; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* 创建函数Pro_Temp_ColumnWork操作表字段 */ | ||||||
|  | DROP PROCEDURE IF EXISTS Pro_Temp_ColumnWork; | ||||||
|  | CREATE PROCEDURE `Pro_Temp_ColumnWork`(TableName VARCHAR ( 50 ), ColumnName VARCHAR ( 50 ), SqlStr VARCHAR ( 4000 ), | ||||||
|  |                                        CType INT) | ||||||
|  | BEGIN | ||||||
|  |     DECLARE | ||||||
|  | Rows1 INT; | ||||||
|  | 
 | ||||||
|  |     SET | ||||||
|  | Rows1 = 0; | ||||||
|  | SELECT COUNT(*) | ||||||
|  | INTO Rows1 | ||||||
|  | FROM INFORMATION_SCHEMA.COLUMNS | ||||||
|  | WHERE table_schema = DATABASE() | ||||||
|  |   AND upper(table_name) = TableName | ||||||
|  |   AND upper(column_name) = ColumnName; | ||||||
|  | IF | ||||||
|  | ( CType = 1 AND Rows1 <= 0 ) THEN | ||||||
|  | 
 | ||||||
|  |         SET SqlStr := CONCAT( 'ALTER TABLE ', TableName, ' ADD COLUMN ', ColumnName, ' ', SqlStr ); | ||||||
|  | 
 | ||||||
|  |     ELSEIF | ||||||
|  | ( CType = 2 AND Rows1 > 0 ) THEN | ||||||
|  | 
 | ||||||
|  |         SET SqlStr := CONCAT( 'ALTER TABLE ', TableName, ' MODIFY  ', ColumnName, ' ', SqlStr ); | ||||||
|  | 
 | ||||||
|  |     ELSEIF | ||||||
|  | ( CType = 3 AND Rows1 > 0 ) THEN | ||||||
|  | 
 | ||||||
|  |         SET SqlStr := CONCAT( 'ALTER TABLE  ', TableName, ' DROP COLUMN  ', ColumnName ); | ||||||
|  | ELSE | ||||||
|  |         SET SqlStr := ''; | ||||||
|  | 
 | ||||||
|  | END IF; | ||||||
|  |     IF | ||||||
|  | ( SqlStr <> '' ) THEN | ||||||
|  | 
 | ||||||
|  |         SET @SQL1 = SqlStr; | ||||||
|  | PREPARE stmt1 | ||||||
|  |     FROM | ||||||
|  |     @SQL1; | ||||||
|  | EXECUTE stmt1; | ||||||
|  | 
 | ||||||
|  | END IF; | ||||||
|  | 
 | ||||||
|  | END; | ||||||
|  | /** 函数创建结束 **/ | ||||||
|  | 
 | ||||||
|  | /*创建定义普通索引函数*/ | ||||||
|  | DROP PROCEDURE IF EXISTS Modify_index; | ||||||
|  | 
 | ||||||
|  | CREATE PROCEDURE Modify_index( | ||||||
|  |     TableName VARCHAR ( 50 ), | ||||||
|  |     ColumnNames VARCHAR ( 500 ), | ||||||
|  |     idx_name VARCHAR ( 50 ), | ||||||
|  |     idx_type VARCHAR ( 50 )) | ||||||
|  | BEGIN | ||||||
|  |     DECLARE | ||||||
|  | Rows1 int; | ||||||
|  |     DECLARE | ||||||
|  | SqlStr VARCHAR(4000); | ||||||
|  |     DECLARE | ||||||
|  | target_database VARCHAR ( 100 ); | ||||||
|  | SELECT DATABASE | ||||||
|  |            () | ||||||
|  | INTO target_database; | ||||||
|  | 
 | ||||||
|  | SET | ||||||
|  | Rows1 = 0; | ||||||
|  | SELECT COUNT(*) | ||||||
|  | INTO Rows1 | ||||||
|  | FROM information_schema.statistics | ||||||
|  | WHERE table_schema = DATABASE() | ||||||
|  |   AND upper(table_name) = upper(TableName) | ||||||
|  |   AND upper(index_name) = upper(idx_name); | ||||||
|  | IF | ||||||
|  | Rows1<=0 THEN | ||||||
|  |         SET SqlStr := CONCAT( 'alter table ', TableName, ' ADD INDEX ', idx_name, '(', ColumnNames, ') USING ', idx_type ); | ||||||
|  | END IF; | ||||||
|  |     IF | ||||||
|  | ( SqlStr <> '' ) THEN | ||||||
|  | 
 | ||||||
|  |         SET @SQL1 = SqlStr; | ||||||
|  | PREPARE stmt1 | ||||||
|  |     FROM | ||||||
|  |     @SQL1; | ||||||
|  | EXECUTE stmt1; | ||||||
|  | 
 | ||||||
|  | END IF; | ||||||
|  | 
 | ||||||
|  | END; | ||||||
|  | /*创建定义普通索引函数结束*/ | ||||||
					Loading…
					
					
				
		Reference in New Issue