背景: 因为项目需要部署到项目现场,新的电脑环境虽然安装了MySQL,但是不一定配置了MySQL环境变量,加上部署人员不一定会执行数据库脚本。每次通过Navicat等软件也比较麻烦。所以想着在项目启动前检查是否存在数据库,如果不存在就创建数据库并且执行数据库脚本。如果存在就跳过。
项目配置文件application.yml
#环境配置
database:
#初始化数据名称
customDatabaseName: aaaaa
#初始化数据文件名称
initDatabaseFileName: bbbbbb
spring:
application:
name: xxxxx
profiles:
# 配置当前项目环境 值在常量类中统一管理
active: ssssss
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driverClassName: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/xxxxx?useUnicode=true&characterEncoding=UTF-8&useSSL=false
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
validationQuery: select 1
validationQueryTimeout: 5
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
filters: stat
webStatFilter:
enabled: true
urlPattern: /api/*
sessionStatEnable: true
sessionStatMaxCount: 1000
profileEnable: true
statViewServlet:
enabled: true
urlPattern: /druid/*
resetEnable: false
loginUsername: admin
loginPassword: admin
filter:
stat:
enabled: true
mergeSql: true
检查数据库执行类:
@Configuration 知识点
用于定义配置类,可替换XML配置文件,被注解的类内部包含一个或多个@Bean注解方法。可以被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext 进行扫描。用于构建bean定义以及初始化Spring容器。
@PostConstruct说明
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
@PreConstruct说明
被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前
3.程序实践(检查是否存在指定的数据库–不存在执行初始化脚本-否则跳过)
package com.xxx.xxxxx.common.base.config;
import com.xxx.xxxxxx.common.base.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.*;
/**
* Package: com.xxx.xxxxxx.common.base.config
*
* @author: yxs
* @created Date: 2021/1/15
* @decription:
*/
@Configuration
public class DatabaseInitConfig {
private static final Logger LOG = LoggerFactory