在小项目中,给用户部署环境比较烦人, 数据库创建、导入能省则省。 设计初衷:
1.用户安装数据库后系统自动创建数据库。
2.数据库自动导入。
3.数据库创建完成后,数据库连接池保持可用。
A.先来熟悉一下springboot 中datasource.schema配置:
# 数据库配置
#spring.datasource.driver-class-name=org.sqlite.JDBC
##jdbc:mysql://172.16.102.85:3306/version_manage?characterEncoding=utf8&useSSL=false
#spring.datasource.url=jdbc:sqlite:Server/sqlite/sql.db
#spring.datasource.username=#spring.datasource.password=#spring.datasource.initialization-mode=always
##spring.datasource.schema= classpath:sql/schema.sql #启动执行脚本
这个配置是项目启动后自动执行schema.sql ,增量数据变动比较好 ,不适合项目初始化用。
B. springboot中自己编写实现过程,具体逻辑实现为:
加载Datasource之前检查数据库DB1是否可用 。
如果DB1不存在则判断数据库连接下是否有mysql数据库
存在mysql库就连接mysql,用mysql库新建系统需要的数据库DB1
创建完数据库DB1后执行init.sql ,初始化数据库中的表。
全部完成后初始化DataSource bean
DB1的配置文件jdbc.properties :有需求的话可以添加一个操作界面,项目启动后让用户自己页面操作后写入文件
dbtype=mysql
ip=127.0.0.1port=3306dbname=DB1username=root
password=123456init=init.sql
@Configuration主要业务逻辑,此处只处理简单的mysql,sqlite两种数据库
package cn.sigutech.DataBase.config;
import cn.sigutech.DataBase.Mysql.*;
import cn.sigutech.DataBase.MysqlRstData;
import cn.sigutech.DataBase.Utils.PropertiesUtils;
import cn.sigutech.utils.Utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.dbcp.BasicDataSource;
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 javax.sql.DataSource;
@Configuration
public class MysqlConfig {
static final Logger logger = LoggerFactory.getLogger(MysqlConfig.class);
//数据库正常标志
public static boolean dbConnectFlag = false ;
public static JSONObject mysqlPro ;
static {
String basePath = System.getProperty("user.dir") ;
String dirName = basePath + "/conf/jdbc.properties";
mysqlPro = PropertiesUtils.parse(dirName);
}
@Bean
public DataSource createDatesource() {
if(mysqlPro.containsKey("dbtype") ){
if("mysql".equalsIgnoreCase(mysqlPro.get("dbtype").toString())){
if(!mysqlPro.containsKey("ip") || !mysqlPro.containsKey("dbname")
||!mysqlPro.containsKey("username") ||!mysqlPro.containsKey("password") ){
return null ;
}
IDBcontrolled mc = createIDBcontrolled();
MysqlRstData mysqlRstData = mc.testConn(mysqlPro) ;
//数据库存在,不存在dbname的库
if( mysqlRstData.getCode() .equals(MysqlRstData.ResultCode.NO_DB)){
if(!mysqlPro.containsKey("init")){
return null ;
}
mysqlRstData =mc.createDB(mysqlPro);
if( mysqlRstData.getCode() .equals(MysqlRstData.ResultCode.SUCCESS) ){
mysqlRstData = mc.importDB(mysqlPro);
}
}
if( !mysqlRstData.getCode() .equals(MysqlRstData.ResultCode.SUCCESS)){
return null ;
}
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl( String.format(MysqlDBUtil.baseurl,mysqlPro.getString("ip"),
mysqlPro.getString("port"),mysqlPro.getString("dbname")) );
dataSource.setDriverClassName(MysqlDBUtil.driver);
dataSource.setUsername(mysqlPro.getString("username") );
dataSource.setPassword(mysqlPro.getString("passwo