java初始化mysql数据库_java 项目启动创建数据库 执行初始化脚本

本文介绍了一个SpringBoot项目如何在启动时自动检查并创建MySQL数据库,如果数据库不存在,则创建,并执行初始化脚本init.sql。通过解析jdbc.properties配置文件,项目实现了数据库连接池的初始化,并提供了在用户安装数据库后自动创建数据库和导入数据的功能。
摘要由CSDN通过智能技术生成

在小项目中,给用户部署环境比较烦人, 数据库创建、导入能省则省。 设计初衷:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值