比如我要初始化一个系统管理员

1.需要先检查这个用户是否存在,若存在则不执行插入用户的sql脚本

需要将检查的sql语句放在配置文件中

sql:init:checksql:"1-sys_user-DML": "select case when exists(select 1 from sys_user su where su.login_name='admin') then 1 else 0 end as result from dual"

2.如果不存在就执行插入用户的sql文件中的sql语句,把需要初始化的sql脚本文件,放在resource资源文件夹中,名称要和配置文件中的key名称一致

sql/init/1-sys_user-DML.sql

INSERT INTO sys_user (id, login_name, credential_value, user_type, deleted, gmt_creare, gmt_modified) VALUES (1409695958421741550, 'admin', '7a6746bdbda9c1a662ceba4ec05b0721', 1, 0, NOW(), NOW());

3.然后还需要一个检查sql的配置类来管理检查sql

package cn.gt.authoritycenter.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;/*** @ClassName SqlInitCheckSqlConfig* @Description: 初始化Sql用配置类* @Author Jason* @Date 2021/6/7**/
@Component
@ConfigurationProperties(prefix = "sql.init")
public class SqlInitCheckSqlConfig {private Map<String, String> checksql = new HashMap();public Map<String, String> getChecksql() {return checksql;}public void setChecksql(Map<String, String> checksql) {this.checksql = checksql;}@Overridepublic String toString() {return "SqlInitCheckSqlConfig{" +"checksql=" + checksql +'}';}
}

4.还需要一个项目运行的配置类来管理和保证数据初始化的工作

package cn.gt.authoritycenter.config;import org.eclipse.jetty.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.lang.NonNull;import javax.sql.DataSource;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;/*** @ClassName InitSqlConfig* @Description: 项目运行初始化数据* @Author Jason* @Date 2021/6/4**/
@Configuration
public class InitSqlConfig {private final Logger logger = LoggerFactory.getLogger(InitSqlConfig.class);@Autowiredprivate SqlInitCheckSqlConfig sqlInitCheckSqlConfig;@Autowiredprivate JdbcTemplate jdbcTemplate;@Beanpublic DataSourceInitializer dataSourceInitializer(final DataSource dataSource) throws IOException {final DataSourceInitializer initializer = new DataSourceInitializer();initializer.setDataSource(dataSource);initializer.setDatabasePopulator(this.databasePopulator());return initializer;}/*** 初始化数据策略** @author ljs* @exception IOException*/private DatabasePopulator databasePopulator() throws IOException {final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();populator.addScripts(this.getResources());return populator;}/*** 初始化数据资源** @author ljs* @exception IOException*/private Resource[] getResources() throws IOException {ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources("classpath*:sql/init/*.sql");List<Resource> resultList = new LinkedList<>();//"加载初始化脚本文件---------start"String checkSqlStr;Integer resutlNum;String dqlSqlMatch = "";int n = 0;for (Resource resource : resources) {String fileFullName = resource.getFilename();// 如果DQL语句都没有执行,则默认要执行DML语句/*if (fileFullName.matches(".*DML.*") && StringUtil.isNotBlank(dqlSqlMatch)&& fileFullName.matches(dqlSqlMatch)) {resultList.add(resource);continue;}*/// 获得验证脚本checkSqlStr = this.getCheckSql(fileFullName);if (StringUtil.isNotBlank(checkSqlStr)) {resutlNum = jdbcTemplate.queryForObject(checkSqlStr, Integer.class);if (resutlNum != null && resutlNum == 0) {resultList.add(resource);if (fileFullName.matches(".*DML.*")) {logger.trace("sql初始化脚本文件[{}]验证结果为0,执行该脚本", fileFullName);dqlSqlMatch += this.buildDqlSqlMatch(fileFullName, dqlSqlMatch);}} else {logger.trace("sql初始化脚本文件[{}]验证结果为1,跳过该脚本", fileFullName);}}}//"加载初始化脚本文件---------end"return resultList.toArray(new Resource[0]);}/*** 获取去掉后缀的文件名** @author ljs* @param fileFullName*            资源文件全名* @return java.lang.String 文件名*/private String getCheckSql(@NonNull String fileFullName) {String fileName = fileFullName.replace(".sql", "");String checkSqlStr = sqlInitCheckSqlConfig.getChecksql().get(fileName);if (StringUtil.isBlank(checkSqlStr)) {logger.trace("sql脚本文件[{}.sql]的执行验证语句未配置~~~~~不执行该SQL脚本", fileName);}return checkSqlStr;}/*** 构建DQL语句匹配规则** @author ljs* @param fileFullName*            全文件名* @param dqlSqlMatch*            DQL语句匹配规则* @return java.lang.String 构建结果*/private String buildDqlSqlMatch(String fileFullName, String dqlSqlMatch) {String[] fileFullNameSplit = fileFullName.split("-");StringBuilder sb = new StringBuilder();if (StringUtil.isBlank(dqlSqlMatch)) {sb.append(".*\\-");} else {sb.append("|.*\\-");}sb.append(fileFullNameSplit[1]);sb.append("\\-.*");return sb.toString();}
}

注意:

若要初始化多个脚本,增加脚本文件即可,要注意顺序

项目启动初始化SQL脚本相关推荐

  1. springboot启动时初始化sql脚本

    文章目录 1.初始化mysql数据库脚本 1.使用springboot jdbc初始化数据库 2.使用原生mybatis执行sql脚本 3.改良springboot jdbc初始化数据库 参考地址 基 ...

  2. java 项目启动初始化_Spring Boot解决项目启动时初始化资源的方法

    前言 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初 ...

  3. java 项目启动初始化_Spring项目启动时执行初始化方法

    一.applicationContext.xml配置bean init-method="initKeyWord"> classpath:sensitive-word.xml ...

  4. dockers达梦镜像启动执行sql脚本

    可以在启动 Docker 达梦镜像时指定执行 SQL 脚本的命令. 具体操作如下: 将 SQL 脚本文件保存到本地,例如文件名为 "script.sql". 在启动 Docker ...

  5. MicroERP数据初始化SQL脚本

    --use MicroERP insert into tbUserGroup(GroupName,Remark) values('管理员组','具备所有权限') insert into tbUser( ...

  6. Springboot项目启动前执行数据库初始化脚本

    背景:项目里面遇到了要在springboot项目启动前做数据库初始化的需求.总结一下几种方案: 1.使用flywaydb,启动工程的时候同时初始化脚本.集成倒是不难,主要是要解决bean的顺序加载问题 ...

  7. SpringBoot2.x整合JDBC及初始化data.sql和schema.sql脚本

    今天在使用SpringBoot2.x版本整合JDBC时遇到了一些问题:由于我之前一直用SpringBoot1.5的版本,所以直接在yml里按照1.5的版本配置了属性,没想到2.x直接不能用了.首先是数 ...

  8. Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源

    在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资 ...

  9. Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源

    Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源 在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spri ...

最新文章

  1. Javascript--键盘事件的组合使用
  2. OKR与Scrum如何强强联手
  3. 【UIKit】表格 UITableView
  4. MongoDB和Redis区别
  5. android的线程管理器,[Android开源]:一款安全、轻巧、简单的线程池管理器EasyThread...
  6. 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
  7. Linux 命令之 unxz -- 解压缩文件
  8. ZOJ 2562 More Divisors
  9. linux .forward,linux forward的实现
  10. 077 Combinations 组合
  11. Python稳基修炼的经典案例15(计算机二级、初学者必会字符格式处理)
  12. 第14章 火柴人的无尽冒险(《C和C++游戏趣味编程》配套教学视频)
  13. Log4net日志记录包
  14. 变压器绕组降低邻近效应_低频变压器初级短路的原因及解决方案
  15. 2021年第十二届蓝桥杯javaB组真题及部分答案
  16. 汽车硬件测试基准介绍
  17. 数据包络分析-超效率模型
  18. 2022年PYTHON应用行业,PYTHON就业方向
  19. 云计算laas、paas、saas介绍和分类
  20. 吃字母------线程同步与互斥的学习

热门文章

  1. 天气图标下载_50种免费天气图标集可供下载
  2. 怎么做百度360今日头条1688搜狗下拉词?宙斯下拉、54小超人下拉、超人2下拉
  3. uniapp自定义导航栏的开发
  4. 开源 iOS 项目分类索引大全 - 待整理
  5. QPushButton禁用状态文字变形变粗
  6. dparsf是什么_老师,我用DPARSF做Slice Timeing时老报错,请问您是什么原因呢?
  7. python话圣诞树_python画圣诞树
  8. SpringBoot的优点
  9. NB-IoT窖井井盖解决方案
  10. 过程裁剪的理念和表现形式