Inhaltsverzeichnis
SpringBoot startet und initialisiert die Ausführung von SQL-Skripten
Schauen wir uns zuerst den Quellcode an
Lassen Sie uns diese beiden Methoden überprüfen
Heim Java javaLernprogramm Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

May 13, 2023 am 10:58 AM
sql springboot

    SpringBoot startet und initialisiert die Ausführung von SQL-Skripten

    Was sollen wir tun, wenn wir beim Start des Projekts einige SQL-Skripte ausführen möchten? SpringBoot stellt uns diese Funktion zur Verfügung, mit der das Skript beim Starten des SpringBoot-Projekts ausgeführt werden kann Schauen wir uns unten um.

    Schauen wir uns zuerst den Quellcode an

    Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

    boolean createSchema() {
    	//会从application.properties或application.yml中获取sql脚本列表
    	List<Resource> scripts = this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");
        if (!scripts.isEmpty()) {
        	if (!this.isEnabled()) {
            	logger.debug("Initialization disabled (not running DDL scripts)");
                return false;
            }
    
            String username = this.properties.getSchemaUsername();
            String password = this.properties.getSchemaPassword();
            //运行sql脚本
            this.runScripts(scripts, username, password);
        }
        return !scripts.isEmpty();
    }
    private List<Resource> getScripts(String propertyName, List<String> resources, String fallback) {
    	if (resources != null) {
    		//如果配置文件中配置,则加载配置文件
        	return this.getResources(propertyName, resources, true);
       	} else {
       		//指定schema要使用的Platform(mysql、oracle),默认为all
        	String platform = this.properties.getPlatform();
            List<String> fallbackResources = new ArrayList();
            //如果配置文件中没配置,则会去类路径下找名称为schema或schema-platform的文件
            fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql");
           	fallbackResources.add("classpath*:" + fallback + ".sql");
           	return this.getResources(propertyName, fallbackResources, false);
        }
    }
    private List<Resource> getResources(String propertyName, List<String> locations, boolean validate) {
    	List<Resource> resources = new ArrayList();
    	Iterator var5 = locations.iterator();
    
        while(var5.hasNext()) {
        	String location = (String)var5.next();
            Resource[] var7 = this.doGetResources(location);
            int var8 = var7.length;
    
            for(int var9 = 0; var9 < var8; ++var9) {
            	Resource resource = var7[var9];
            	//验证文件是否存在
            	if (resource.exists()) {
                	resources.add(resource);
               	} else if (validate) {
                	throw new InvalidConfigurationPropertyValueException(propertyName, resource, "The specified resource does not exist.");
                }
            }
        }
        return resources;
    }
    Nach dem Login kopieren

    Aus dem Quellcode wissen wir ungefähr, was es bedeutet, dass SpringBoot standardmäßig Skriptdateien aus dem Klassenpfad findet, aber nur der angegebene Name kann darunter platziert werden Klassenpfad: Schema oder Schema-Plattform-Skriptdatei. Wenn wir sie in mehrere Skriptdateien aufteilen möchten, ist diese Methode nicht geeignet. Dann müssen wir die Skriptliste in application.properties oder application.yml konfigurieren. Dann kann dies geschehen Der Initialisierungsskriptvorgang kann in der Datei konfiguriert werden. Ja, es gibt ein Initialisierungsmodusattribut, das auf drei Werte eingestellt werden kann, was immer bedeutet, dass die Initialisierung immer ausgeführt wird. Die eingebettete Funktion initialisiert nur die Speicherdatenbank (Standardwert). wie h3 usw. und bedeutet niemals, dass keine Initialisierung durchgeführt wird.

    spring:
      datasource:
        username: root
        password: liuzhenyu199577
        url: jdbc:mysql://localhost:3306/jdbc
        driver-class-name: com.mysql.cj.jdbc.Driver
        initialization-mode: always
    Nach dem Login kopieren

    Lassen Sie uns diese beiden Methoden überprüfen

    1. Die Skriptdatei des Schemas oder der Schemaplattform wird standardmäßig platziert

    Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

    CREATE TABLE IF NOT EXISTS department (ID VARCHAR(40) NOT NULL, NAME VARCHAR(100), PRIMARY KEY (ID));
    Nach dem Login kopieren

    Überprüfen Sie, ob die Datenbank keine Abteilungstabelle enthält, und starten Sie dann das Programm

    Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

    Lassen Sie uns nach dem Start einen weiteren Blick darauf werfen und es ausführen

    Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

    2. In der Konfigurationsdatei sind mehrere SQL-Skripte angegeben die Tabelle, als nächstes Nachdem wir das Programm gestartet haben

    Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

    , werfen wir noch einmal einen Blick darauf. Die Tabelle enthält drei Datenelemente

    Wie SpringBoot die Ausführung von SQL-Skripten startet und initialisiertDies ist der Schritt zum Starten von SpringBoot und zum Initialisieren des SQL-Skripts

    Die Das SpringBoot-Projekt führt die angegebene SQL-Datei beim Start aus

    1. Beim Start ausführenWie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert

    Wenn beim Starten des Projekts zuerst die angegebene SQL-Anweisung ausgeführt werden muss, können Sie die auszuführende SQL-Datei unter den Ressourcen hinzufügen Die SQL-Anweisung in der Datei kann ein DDL-Skript oder ein DML-Skript sein. Fügen Sie dann einfach die entsprechende Konfiguration wie folgt hinzu:

    spring:
      datasource:
        username: root
        password: liuzhenyu199577
        url: jdbc:mysql://localhost:3306/jdbc
        driver-class-name: com.mysql.cj.jdbc.Driver
        initialization-mode: always
        schema:
          - classpath:department.sql
          - classpath:department2.sql
          - classpath:department3.sql
    Nach dem Login kopieren

    2 Führen Sie mehrere SQL-Dateien aus

    spring.datasource.schema .datasource.data unterstützen beide den Empfang einer Liste. Wenn also mehrere SQL-Dateien ausgeführt werden müssen, können Sie die folgende Konfiguration verwenden:

    INSERT INTO department (ID,NAME) VALUES (&#39;1&#39;,&#39;2&#39;)
    INSERT INTO department (ID,NAME) VALUES (&#39;2&#39;,&#39;3&#39;)
    INSERT INTO department (ID,NAME) VALUES (&#39;3&#39;,&#39;4&#39;)
    Nach dem Login kopieren

    3 Verschiedene Betriebsumgebungen führen unterschiedliche Skripte aus

    Im Allgemeinen gibt es mehrere Betriebsumgebungen, z wie Entwicklung, Test, Produktion usw. Das SQL, das normalerweise in verschiedenen Betriebsumgebungen ausgeführt werden muss, ist unterschiedlich. Um dieses Problem zu lösen, können Platzhalter verwendet werden.

    Erstellen Sie Ordner für verschiedene Umgebungen.

    Erstellen Sie Ordner für verschiedene Umgebungen im Ressourcenordner, z. B. dev/, sit/, prod/.

    Configuration

    application.yml

    spring:
      datasource:
        schema: classpath:schema.sql # schema.sql中一般存放的是DDL脚本,即通常为创建或更新库表的脚本 data: classpath:data.sql # data.sql中一般是DML脚本,即通常为数据插入脚本
    Nach dem Login kopieren

    Hinweis: Der Platzhalter ${} unterstützt den Standardwert. Beispielsweise soll ${spring.profiles.active:dev} in der obigen Konfiguration vor dem Semikolon den Wert des Attributs spring.profiles.active annehmen, und wenn der Wert des Attributs nicht vorhanden ist, wird der Wert danach verwendet Semikolon wird verwendet, das ist dev.

    bootstrap.yml

    spring:
      datasource:
        schema: classpath:schema_1.sql, classpath:schema_2.sql data: classpath:data_1.sql, classpath:data_2.sql 或 spring: datasource: schema: - classpath:schema_1.sql - classpath:schema_2.sql data: - classpath:data_1.sql - classpath:data_2.sql
    Nach dem Login kopieren

    Erinnerung: Die spring.profiles.active-Eigenschaft wird im Allgemeinen in bootstrap.yml oder bootstrap.properties konfiguriert.

    4. Unterstützen Sie verschiedene Datenbanken

    Da die Syntax verschiedener Datenbanken unterschiedlich ist, können die SQL-Anweisungen verschiedener Datenbanken unterschiedlich sein, um dieselbe Funktion zu erreichen, sodass möglicherweise mehrere verschiedene SQL-Dateien vorhanden sind. Wenn Sie verschiedene Datenbanken unterstützen müssen, können Sie die folgende Konfiguration verwenden:

    spring:
      datasource:
        schema: classpath:${spring.profiles.active:dev}/schema.sql 
        data: classpath:${spring.profiles.active:dev}/data.sql
    Nach dem Login kopieren

    Zur Erinnerung: Der Standardwert des Plattformattributs ist „all“. Verwenden Sie daher die obige Konfiguration nur beim Wechsel zwischen verschiedenen Datenbanken, da mit dem Standardwert Spring Boot erkennt automatisch die aktuell verwendete Datenbank.

    Hinweis: Zu diesem Zeitpunkt müssen, wenn man die von Entwicklern zugelassene Umgebung als Beispiel nimmt, die folgenden Dateien im Ordner resources/dev/ vorhanden sein: schema-mysql.sql und data-mysql.sql.

    5. Fallstricke vermeiden

    5.1 Fallstricke

    Wenn in der ausgeführten SQL-Datei gespeicherte Prozeduren oder Funktionen vorhanden sind, wird beim Starten des Projekts ein Fehler gemeldet.

    Zum Beispiel gibt es jetzt eine solche Anforderung: Wenn das Projekt beginnt, scannen Sie eine bestimmte Tabelle. Wenn die Anzahl der Datensätze in der Tabelle 0 ist, fügen Sie mehrere Datensätze ein. Das Skript der Datei

    schema.sql lautet wie folgt:

    spring:
      profiles:
        active: dev # dev/sit/prod等。分别对应开发、测试、生产等不同运行环境。
    Nach dem Login kopieren

    Starten Sie das Projekt und melden Sie einen Fehler. Der Grund ist wie folgt:

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create procedure p1() begin declare row_num int' at line 1

    大致的意思是:'create procedure p1() begin declare row_num int'这一句出现语法错误。刚看到这一句,我一开始是懵逼的,吓得我赶紧去比对mysql存储过程的写法,对了好久都发现没错,最后看到一篇讲解spring boot配置启动时执行sql脚本的文章,发现其中多了一项配置:spring.datasource.separator=$$。然后看源码发现,spring boot在解析sql脚本时,默认是以';'作为断句的分隔符的。看到这里,不难看出报错的原因,即:spring boot把'create procedure p1() begin declare row_num int'当成是一条普通的sql语句。而我们需要的是创建一个存储过程。

    5.2 解决方案

    修改sql脚本的断句分隔符。如:spring.datasource.separator=$$。然后把脚本改成:

    -- 当存储过程`p1`存在时,删除。
    drop procedure if exists p1;$$
     
    -- 创建存储过程`p1`
    create procedure p1() 
    begin declare row_num int; select count(*) into row_num from `t_user`; if row_num = 0 then INSERT INTO `t_user`(`username`, `password`) VALUES (&#39;zhangsan&#39;, &#39;123456&#39;); end if; end;$$ -- 调用存储过程`p1` call p1();$$ drop procedure if exists p1;$$
    Nach dem Login kopieren

    5.3 不足

    因为sql脚本的断句分隔符从';'变成'$$',所以可能需要在DDL、DML语句的';'后加'$$',不然可能会出现将整个脚本当成一条sql语句来执行的情况。比如:

    -- DDL
    CREATE TABLE `table_name` (
      -- 字段定义
      ... 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;$$
     
    -- DML
    INSERT INTO `table_name` VALUE(...);$$
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonWie SpringBoot die Ausführung von SQL-Skripten startet und initialisiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
    Will R.E.P.O. Crossplay haben?
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Was ist der Unterschied zwischen HQL und SQL im Hibernate-Framework? Was ist der Unterschied zwischen HQL und SQL im Hibernate-Framework? Apr 17, 2024 pm 02:57 PM

    HQL und SQL werden im Hibernate-Framework verglichen: HQL (1. Objektorientierte Syntax, 2. Datenbankunabhängige Abfragen, 3. Typsicherheit), während SQL die Datenbank direkt betreibt (1. Datenbankunabhängige Standards, 2. Komplexe ausführbare Datei). Abfragen und Datenmanipulation).

    Verwendung der Divisionsoperation in Oracle SQL Verwendung der Divisionsoperation in Oracle SQL Mar 10, 2024 pm 03:06 PM

    „Verwendung der Divisionsoperation in OracleSQL“ In OracleSQL ist die Divisionsoperation eine der häufigsten mathematischen Operationen. Während der Datenabfrage und -verarbeitung können uns Divisionsoperationen dabei helfen, das Verhältnis zwischen Feldern zu berechnen oder die logische Beziehung zwischen bestimmten Werten abzuleiten. In diesem Artikel wird die Verwendung der Divisionsoperation in OracleSQL vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Zwei Arten von Divisionsoperationen in OracleSQL In OracleSQL können Divisionsoperationen auf zwei verschiedene Arten durchgeführt werden.

    Vergleich und Unterschiede der SQL-Syntax zwischen Oracle und DB2 Vergleich und Unterschiede der SQL-Syntax zwischen Oracle und DB2 Mar 11, 2024 pm 12:09 PM

    Oracle und DB2 sind zwei häufig verwendete relationale Datenbankverwaltungssysteme, die jeweils über ihre eigene, einzigartige SQL-Syntax und -Eigenschaften verfügen. In diesem Artikel werden die SQL-Syntax von Oracle und DB2 verglichen und unterschieden und spezifische Codebeispiele bereitgestellt. Datenbankverbindung Verwenden Sie in Oracle die folgende Anweisung, um eine Verbindung zur Datenbank herzustellen: CONNECTusername/password@database. In DB2 lautet die Anweisung zum Herstellen einer Verbindung zur Datenbank wie folgt: CONNECTTOdataba

    Ausführliche Erläuterung der Funktion „Tag festlegen' in den dynamischen SQL-Tags von MyBatis Ausführliche Erläuterung der Funktion „Tag festlegen' in den dynamischen SQL-Tags von MyBatis Feb 26, 2024 pm 07:48 PM

    Interpretation der dynamischen SQL-Tags von MyBatis: Detaillierte Erläuterung der Verwendung von Set-Tags. MyBatis ist ein hervorragendes Persistenzschicht-Framework. Es bietet eine Fülle dynamischer SQL-Tags und kann Datenbankoperationsanweisungen flexibel erstellen. Unter anderem wird das Set-Tag zum Generieren der SET-Klausel in der UPDATE-Anweisung verwendet, die sehr häufig bei Aktualisierungsvorgängen verwendet wird. In diesem Artikel wird die Verwendung des Set-Tags in MyBatis ausführlich erläutert und seine Funktionalität anhand spezifischer Codebeispiele demonstriert. Was ist Set-Tag? Set-Tag wird in MyBati verwendet

    Was bedeutet das Identitätsattribut in SQL? Was bedeutet das Identitätsattribut in SQL? Feb 19, 2024 am 11:24 AM

    Was ist Identität in SQL? In SQL ist Identität ein spezieller Datentyp, der zum Generieren automatisch inkrementierender Zahlen verwendet wird. Er wird häufig verwendet, um jede Datenzeile in einer Tabelle eindeutig zu identifizieren. Die Spalte „Identität“ wird oft in Verbindung mit der Primärschlüsselspalte verwendet, um sicherzustellen, dass jeder Datensatz eine eindeutige Kennung hat. In diesem Artikel wird die Verwendung von Identity detailliert beschrieben und es werden einige praktische Codebeispiele aufgeführt. Die grundlegende Möglichkeit, Identity zu verwenden, besteht darin, Identit beim Erstellen einer Tabelle zu verwenden.

    Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Dec 29, 2023 am 11:02 AM

    SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

    Wie verwende ich SQL-Anweisungen zur Datenaggregation und Statistik in MySQL? Wie verwende ich SQL-Anweisungen zur Datenaggregation und Statistik in MySQL? Dec 17, 2023 am 08:41 AM

    Wie verwende ich SQL-Anweisungen zur Datenaggregation und Statistik in MySQL? Datenaggregation und Statistiken sind sehr wichtige Schritte bei der Durchführung von Datenanalysen und Statistiken. Als leistungsstarkes relationales Datenbankverwaltungssystem bietet MySQL eine Fülle von Aggregations- und Statistikfunktionen, mit denen Datenaggregation und statistische Operationen problemlos durchgeführt werden können. In diesem Artikel wird die Methode zur Verwendung von SQL-Anweisungen zur Durchführung von Datenaggregation und Statistiken in MySQL vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Verwenden Sie zum Zählen die COUNT-Funktion. Die COUNT-Funktion wird am häufigsten verwendet

    So beheben Sie den 5120-Fehler in SQL So beheben Sie den 5120-Fehler in SQL Mar 06, 2024 pm 04:33 PM

    Lösung: 1. Überprüfen Sie, ob der angemeldete Benutzer über ausreichende Berechtigungen zum Zugriff auf oder zum Betrieb der Datenbank verfügt, und stellen Sie sicher, dass der Benutzer über die richtigen Berechtigungen verfügt. 2. Überprüfen Sie, ob das Konto des SQL Server-Dienstes über die Berechtigung zum Zugriff auf die angegebene Datei verfügt Ordner und stellen Sie sicher, dass das Konto über ausreichende Berechtigungen zum Lesen und Schreiben der Datei oder des Ordners verfügt. 3. Überprüfen Sie, ob die angegebene Datenbankdatei von anderen Prozessen geöffnet oder gesperrt wurde. Versuchen Sie, die Datei zu schließen oder freizugeben, und führen Sie die Abfrage erneut aus . Versuchen Sie es als Administrator. Führen Sie Management Studio aus als usw.

    See all articles