国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot實現(xiàn)第一次啟動時自動初始化數(shù)據(jù)庫流程詳解

這篇具有很好參考價值的文章主要介紹了Spring Boot實現(xiàn)第一次啟動時自動初始化數(shù)據(jù)庫流程詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

package com.gitee.swsk33.sqlinitdemo.config;
import cn.hutool.core.io.resource.ClassPathResource;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 用于第一次啟動時,初始化數(shù)據(jù)庫的配置類
 */
@Slf4j
@Configuration
public class DatabaseInitialize {
	/**
	 * 讀取連接地址
	 */
	@Value("${spring.datasource.url}")
	private String url;
	/**
	 * 讀取用戶名
	 */
	@Value("${spring.datasource.username}")
	private String username;
	/**
	 * 讀取密碼
	 */
	@Value("${spring.datasource.password}")
	private String password;
	/**
	 * 檢測當(dāng)前連接的庫是否存在(連接URL中的數(shù)據(jù)庫)
	 *
	 * @return 當(dāng)前連接的庫是否存在
	 */
	private boolean currentDatabaseExists() {
		// 嘗試以配置文件中的URL建立連接
		try {
			Connection connection = DriverManager.getConnection(url, username, password);
			connection.close();
		} catch (SQLException e) {
			// 若連接拋出異常則說明連接URL中指定數(shù)據(jù)庫不存在
			return false;
		}
		// 正常情況下說明連接URL中數(shù)據(jù)庫存在
		return true;
	}
	/**
	 * 執(zhí)行SQL腳本
	 *
	 * @param path        SQL腳本文件的路徑
	 * @param isClasspath SQL腳本路徑是否是classpath路徑
	 * @param connection  數(shù)據(jù)庫連接對象,通過這個連接執(zhí)行腳本
	 */
	private void runSQLScript(String path, boolean isClasspath, Connection connection) {
		try (InputStream sqlFileStream = isClasspath ? new ClassPathResource(path).getStream() : new FileInputStream(path)) {
			BufferedReader sqlFileStreamReader = new BufferedReader(new InputStreamReader(sqlFileStream, StandardCharsets.UTF_8));
			// 創(chuàng)建SQL腳本執(zhí)行器對象
			ScriptRunner scriptRunner = new ScriptRunner(connection);
			// 使用SQL腳本執(zhí)行器對象執(zhí)行腳本
			scriptRunner.runScript(sqlFileStreamReader);
			// 最后關(guān)閉文件讀取器
			sqlFileStreamReader.close();
		} catch (Exception e) {
			log.error("讀取文件或者執(zhí)行腳本失敗!");
			e.printStackTrace();
		}
	}
	/**
	 * 執(zhí)行SQL腳本以創(chuàng)建數(shù)據(jù)庫
	 */
	private void createDatabase() {
		try {
			// 修改連接語句,重新建立連接
			// 重新建立的連接不再連接到指定庫,而是直接連接到整個MySQL
			// 使用URI類解析并拆解連接地址,重新組裝
			URI databaseURI = new URI(url.replace("jdbc:", ""));
			// 得到連接地址中的數(shù)據(jù)庫平臺名(例如mysql)
			String databasePlatform = databaseURI.getScheme();
			// 得到連接地址和端口
			String hostAndPort = databaseURI.getAuthority();
			// 得到連接地址中的庫名
			String databaseName = databaseURI.getPath().substring(1);
			// 組裝新的連接URL,不連接至指定庫
			String newURL = "jdbc:" + databasePlatform + "://" + hostAndPort + "/";
			// 重新建立連接
			Connection connection = DriverManager.getConnection(newURL, username, password);
			Statement statement = connection.createStatement();
			// 執(zhí)行SQL語句創(chuàng)建數(shù)據(jù)庫
			statement.execute("create database if not exists `" + databaseName + "`");
			// 關(guān)閉會話和連接
			statement.close();
			connection.close();
			log.info("創(chuàng)建數(shù)據(jù)庫完成!");
		} catch (URISyntaxException e) {
			log.error("數(shù)據(jù)庫連接URL格式錯誤!");
			throw new RuntimeException(e);
		} catch (SQLException e) {
			log.error("連接失??!");
			throw new RuntimeException(e);
		}
	}
	/**
	 * 該方法用于檢測數(shù)據(jù)庫是否需要初始化,如果是則執(zhí)行SQL腳本進(jìn)行初始化操作
	 */
	@PostConstruct
	private void initDatabase() {
		log.info("開始檢查數(shù)據(jù)庫是否需要初始化...");
		// 檢測當(dāng)前連接數(shù)據(jù)庫是否存在
		if (currentDatabaseExists()) {
			log.info("數(shù)據(jù)庫存在,不需要初始化!");
			return;
		}
		log.warn("數(shù)據(jù)庫不存在!準(zhǔn)備執(zhí)行初始化步驟...");
		// 先創(chuàng)建數(shù)據(jù)庫
		createDatabase();
		// 然后再次連接,執(zhí)行腳本初始化庫中的表格
		try (Connection connection = DriverManager.getConnection(url, username, password)) {
			runSQLScript("/create-table.sql", true, connection);
			log.info("初始化表格完成!");
		} catch (Exception e) {
			log.error("初始化表格時,連接數(shù)據(jù)庫失??!");
			e.printStackTrace();
		}
	}
}

文章來源地址http://www.zghlxwxcb.cn/news/detail-650198.html

到了這里,關(guān)于Spring Boot實現(xiàn)第一次啟動時自動初始化數(shù)據(jù)庫流程詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【2023新教程】樹莓派4B開機(jī)啟動-樹莓派第一次啟動-樹莓派不使用顯示器啟動-樹莓派從購買到啟動一步一步完全版!

    【2023新教程】樹莓派4B開機(jī)啟動-樹莓派第一次啟動-樹莓派不使用顯示器啟動-樹莓派從購買到啟動一步一步完全版!

    閑來無事,在咸魚上買了一個樹莓派4B。買來配件都十分齊全,于是就想著啟動來測試一下。下面是樹莓派無顯示器第一次啟動的全過程,包含安裝系統(tǒng)。 網(wǎng)上的教程大多需要額外使用顯示器、鼠標(biāo)、鍵盤之類的外設(shè)。然而,樹莓派本身就是便捷靈活開發(fā)的代表,在真實開發(fā)

    2024年02月13日
    瀏覽(65)
  • Spring Boot實現(xiàn)在啟動時執(zhí)行一次的功能

    此方法可能是最常用的 可以使用Spring Boot的@PostConstruct注解來實現(xiàn)在啟動時執(zhí)行一次的功能。@PostConstruct注解標(biāo)記的方法會在Bean初始化完成后自動調(diào)用,可以在該方法中執(zhí)行只需要在啟動時執(zhí)行一次的操作。 如果想在生成對象時完成某些初始化操作,而偏偏這些初始化操作又

    2024年02月06日
    瀏覽(20)
  • 第一次使用ThreadPoolTaskExecutor實現(xiàn)線程池的經(jīng)歷,反復(fù)修改了多次代碼才正常使用

    1、前言 ??在一個向第三方平臺推送消息的場景中,為了提高程序的執(zhí)行效率,每次發(fā)送消息,都創(chuàng)建一個新的線程來完成發(fā)送消息的任務(wù),為了提供線程的使用性能,我選擇了ThreadPoolTaskExecutor線程池,結(jié)果在使用的過程中,出現(xiàn)了較多的問題,這里記錄一下避免以后再出

    2024年02月08日
    瀏覽(24)
  • 當(dāng)我第一次通過Kotlin和Compose來實現(xiàn)一個Canvas時, 我收獲了什么?

    自從2019年Google推薦Kotlin為Android開發(fā)的首選語言以來已經(jīng)經(jīng)歷了將近四年的時間, Compose的1.0版本也發(fā)布了將近2年的時間, Kotlin+Compose在現(xiàn)階段的Android開發(fā)過程中還遠(yuǎn)遠(yuǎn)達(dá)不到主流的程度. 我們是否應(yīng)該開始嘗試這個組合? 這個組合有會給我們帶來什么? 對于我來說, 我是個守舊又

    2023年04月27日
    瀏覽(24)
  • docker第一次作業(yè)

    docker第一次作業(yè) 1.安裝docker服務(wù),配置鏡像加速器 ?yum install -y yum-utils device-mapper-persistent-data lvm2 y um-config-manager --add-repo https: //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i \\\'s+download.docker.com+mirrors.aliyun.com/docker-ce+\\\' ?/etc/yum.repos.d/docker-ce.repo yum makecache fast yum -y install docke

    2024年02月12日
    瀏覽(26)
  • 樹莓派第一次開機(jī)

    樹莓派第一次開機(jī)

    樹莓派由英國的樹莓派基金會發(fā)行,旨在通過發(fā)行這個廉價開源的可隨意破解的微型計算機(jī),推動中小學(xué)編程教育,發(fā)行之后很快在全世界的開源創(chuàng)客圈中流行。截止到2018年10月,最新版本的樹莓派主板是3B+,國內(nèi)某寶上賣230元左右,還有更微型的樹莓派主板Zero,國內(nèi)某寶賣

    2024年02月13日
    瀏覽(19)
  • 新學(xué)期第一次課

    新學(xué)期第一次課

    在信息化飛速發(fā)展的今天,大數(shù)據(jù)技術(shù)的應(yīng)用日益廣泛,其重要性也日益凸顯。對于大數(shù)據(jù)學(xué)院的同學(xué)來說,掌握行業(yè)前沿技術(shù)是至關(guān)重要的。本篇文章將詳細(xì)指導(dǎo)同學(xué)們?nèi)绾渭尤隥Q群、云班課,并學(xué)會使用思維導(dǎo)圖和CSDN博客。 我們有兩個QQ群,分別是2021計應(yīng)1班行業(yè)前沿技

    2024年02月10日
    瀏覽(27)
  • 第一次PR經(jīng)歷

    第一次PR經(jīng)歷

    ? ? ?

    2024年02月13日
    瀏覽(25)
  • 第一次面試復(fù)盤

    這個秋招到目前為止第一次拿到了面試機(jī)會,雖然是小公司,但是人家是有官網(wǎng)的?。。『軔?!先趕緊復(fù)盤一下,因為還有很多筆試沒有復(fù)盤。 你們的數(shù)學(xué)建模解決了什么問題?你覺得你們?yōu)槭裁茨苣玫竭@個成績 說下對java這門語言的了解 它是一種面向?qū)ο蟮木幊陶Z言,所以

    2024年01月22日
    瀏覽(27)
  • python 第一次作業(yè)

    python 第一次作業(yè)

    因為筆者有一些 c/c++ 語言的基礎(chǔ),所以應(yīng)該學(xué) python 會稍微簡單一些 輸入的時候所有的輸入都是字符串類型,我們需要進(jìn)行類型轉(zhuǎn)換 參見資源里面的第三題和第四題,為了方便起見,直接把代碼貼在下面

    2024年03月25日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包