Σε αυτό το άρθρο, θα εξετάσουμε τις επιλογές για τη φόρτωση αρχικών δεδομένων με το Spring Boot. Θα εξετάσουμε τις διάφορες διαθέσιμες επιλογές με το Spring Boot.
Φόρτωση αρχικών δεδομένων με Spring Boot
Το Spring Boot διευκολύνει τη διαχείριση οποιουδήποτε τύπου αλλαγών στη βάση δεδομένων. Θα αναζητήσει οντότητες στα πακέτα μας και θα δημιουργήσει τους αντίστοιχους πίνακες εάν δεν ορίσουμε καμία προσαρμοσμένη διαμόρφωση και χρησιμοποιήσουμε την προεπιλεγμένη διαμόρφωση. Μπορούμε να χρησιμοποιήσουμε το data.sql
και schema.sql
αρχεία την άνοιξη για να αποκτήσετε περισσότερο έλεγχο στις αλλαγές της βάσης δεδομένων. Είναι ένα ισχυρό χαρακτηριστικό που σας επιτρέπει να εργάζεστε σε διαφορετικά περιβάλλοντα. Ας δούμε πώς να φορτώσετε αυτά τα αρχικά δεδομένα κατά την εκκίνηση με ένα παράδειγμα παρακάτω.
1. Αρχικοποίηση οντοτήτων JPA εκκίνησης Spring Boot
Για τη φόρτωση αρχικών δεδομένων με το Spring Boot, μπορούμε να χρησιμοποιήσουμε το Spring Boot που είναι ενσωματωμένο για υποστήριξη για JPA. Ας υποθέσουμε ότι έχουμε μια οντότητα υπαλλήλου, η οποία απαιτεί ένα σχήμα και δείγμα δεδομένων για να αρχικοποιηθούν στη βάση δεδομένων.
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String employeeName;
private String salary;
private Date createdAt;
private Date updatedAt;
}
Όταν εκτελούμε την εφαρμογή μας, το Spring Boot θα δημιουργήσει έναν κενό πίνακα για εμάς, αλλά δεν θα τον συμπληρώσει για την παραπάνω καθορισμένη οντότητα. Τα σχήματα για τις οντότητές σας μπορούν να δημιουργηθούν αυτόματα με τη ρύθμιση spring.jpa.hibernate.ddl-auto
στο αρχείο διαμόρφωσης Spring Boot σε create
ή create-drop
. Αν ορίσετε ddl-auto
για δημιουργία ή δημιουργία-απόθεση, η Αδρανοποίηση θα δημιουργήσει ένα σχήμα για την οντότητά σας με βάση την αντιστοίχιση του. Πρέπει να προσθέσετε την ακόλουθη ιδιότητα στο δικό σας application.properties
αρχείο.
spring.jpa.hibernate.ddl-auto=create
Οταν ο ddl-auto
ή create-drop
δημιουργούνται τιμές, αναζητά το Hibernate import.sql
στη διαδρομή κλάσης προκειμένου να αρχικοποιηθούν δεδομένα. Μπορείτε να προσθέσετε το import.sql
αρχείο στο classpath:
INSERT INTO employee VALUES
('Steve', '50000', '2022-04-04 11:33:30', NULL);
('Bill', '55000', '2022-04-05 12:33:30', NULL);
('Mark', '30000', '2022-04-01 04:31:50', '2022-04-08 09:12:32');
('Josh', '60000', '2022-04-03 09:22:25', '2022-04-07 12:34:54');
Η παραπάνω προσέγγιση, συμπεριλαμβανομένης της χρήσης οντοτήτων ΚΣΙΕ, έχει τα δικά της μειονεκτήματα. Σε
import.sql
αρχείο, κάθε γραμμή πρέπει να περιέχει μια ενιαία πρόταση SQL. Για να φτιάξετε τοimport.sql
εργασία, θα πρέπει να έχει μία δήλωση για κάθε γραμμή
1.1 Το αρχείο data.sql.
Όπως υποδηλώνει το όνομα, πρέπει να προσθέσουμε το data.sql
αρχείο στο μονοπάτι της τάξης. Το Spring Boot θα σαρώσει τη διαδρομή τάξης και θα επιλέξει το αρχείο κατά τη λειτουργία ενημέρωσης της βάσης δεδομένων. Δείτε πώς μπορεί να μοιάζει το αρχείο:
INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Steve', '50000', '2022-04-04 11:33:30', NULL);
INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Bill', '55000', '2022-04-05 12:33:30', NULL);
INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Mark', '30000', '2022-04-01 04:31:50', '2022-04-08 09:12:32');
INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Josh', '60000', '2022-04-03 09:22:25', '2022-04-07 12:34:54');

1.2. Το αρχείο schema.sql.
Εάν δεν θέλουμε να χρησιμοποιήσουμε τον προεπιλεγμένο μηχανισμό δημιουργίας σχήματος, μπορούμε να δημιουργήσουμε ένα προσαρμοσμένο αρχείο schema.sql για τη φόρτωση των αρχικών δεδομένων με το Spring Boot. Αυτό το αρχείο θα επιλεγεί από το Spring Boot για δημιουργία σχήματος.
CREATE TABLE employee (
id INTEGER NOT NULL AUTO_INCREMENT,
employee_name varchar(45),
salary varchar(45) NOT NULL,
created_at datetime NOT NULL,
updated_at datetime DEFAULT NULL,
PRIMARY KEY (id)
);
Σημειώστε ότι οι αρχικοποιήσεις που βασίζονται σε σενάρια, δηλαδή
schema.sql
καιdata.sql
και οι αρχικοποιήσεις αδρανοποίησης μαζί προκαλούν ορισμένα ζητήματα.
Για να απενεργοποιήσετε την αυτόματη δημιουργία Hibernate, μπορούμε να προσθέσουμε την ακόλουθη ιδιότητα στο application.properties
αρχείο. Αυτή η ιδιότητα θα διασφαλίσει ότι θα χρησιμοποιηθεί η προετοιμασία βάσει σεναρίων Spring Boot schema.sql
και data.sql
κατευθείαν.
spring.jpa.hibernate.ddl-auto=none
Μπορούμε ακόμα να έχουμε τόσο την αυτόματη δημιουργία σχήματος αδρανοποίησης όσο και τη δημιουργία σχήματος βάσει σεναρίου σε σύζευξη ορίζοντας την ακόλουθη ιδιότητα στο application.proerties.
spring.jpa.defer-datasource-initialization=true
Ως αποτέλεσμα, μόλις ολοκληρωθεί η δημιουργία σχήματος, schema.sql
θα διαβαστεί για τυχόν πρόσθετες αλλαγές σχήματος και data.sql
θα εκτελεστεί για να συμπληρωθεί η βάση δεδομένων. Οποιεσδήποτε αλλαγές στο data.sql
αρχείο και schema.sql
Το αρχείο θα επηρεάσει επίσης την πραγματική βάση δεδομένων και τους πίνακες. Η προεπιλογή εκτελεί προετοιμασία βάσει σεναρίων, αλλά αυτό ισχύει μόνο για ενσωματωμένες βάσεις δεδομένων.
Εάν θέλετε πάντα να αρχικοποιείται η βάση δεδομένων χρησιμοποιώντας τα σενάρια, προσθέστε
spring.sql.init.mode=always
στοapplication.properties
αρχείο.
2. Φόρτωση δεδομένων από πολλούς προμηθευτές DB
Η εφαρμογή Spring Boot μπορεί να δημιουργήσει DDL
σχήματα σεναρίων χρησιμοποιώντας την πηγή δεδομένων JDBC. Το εργοστάσιο σύνδεσης με πηγή δεδομένων δημιουργεί και αρχικοποιεί αυτόματα τα σενάρια DML. Αυτό φορτώνει επίσης την SQL ως μέρος της τυπικής σάρωσης διαδρομής class για αρχεία sql, π.χ. schema.sql
και data.sql
.
2.1. data.sql
Μπορούμε να ενημερώσουμε τα πεδία δεδομένων χρησιμοποιώντας αυτό το αρχείο:
INSERT INTO employee (employee_name, salary, created_at, updated_at)
VALUES ('Steve', '50000', '2022-04-04 11:33:30', NULL);
Μπορούμε επίσης να φορτώσουμε το schema.sql
αρχείο όπως περιγράφεται στην Ενότητα 1 για τη φόρτωση Αρχικών Δεδομένων με Spring Boot. Μπορούμε επίσης να επεξεργαστούμε το schema-${platform}.sql
και data-${platform}.sql
(η πλατφόρμα μπορεί να είναι αρχεία oracle, MySQL, PostgreSQL). Αυτό επιτρέπει την εναλλαγή μεταξύ των σεναρίων για τη βάση δεδομένων, εάν απαιτείται. Η προετοιμασία της βάσης δεδομένων γίνεται στην ενσωματωμένη βάση δεδομένων στη μνήμη από προεπιλογή, αν και μπορούμε να ορίσουμε το spring.sql.init
λειτουργία σε always
αρχικοποίηση της βάσης δεδομένων SQL. Επίσης, ενεργοποιεί τη δυνατότητα γρήγορης αποτυχίας από προεπιλογή για τον αρχικοποιητή βάσης δεδομένων που βασίζεται σε σενάρια, δηλαδή η εφαρμογή δεν μπορεί να ξεκινήσει εάν τα σενάρια δημιουργούν εξαιρέσεις.
Αυτοί οι τύποι αρχικοποίησης πηγών δεδομένων που βασίζονται σε σενάρια πραγματοποιούνται πριν από τη δημιουργία οποιουδήποτε EntityManagerFactory
φασόλια. ο schema.sql
διαχειρίζεται το DDL και δημιουργεί το σχήμα ενώ το data.sql
διαχειρίζεται το DML και συμπληρώνει τη βάση δεδομένων. Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο μετεγκατάστασης DB υψηλού επιπέδου όπως το flyway ή το Liquibase για τη δημιουργία και την προετοιμασία του σχήματος. Αυτά μπορούν να σας βοηθήσουν στη δημιουργία σεναρίων με προσαρμοσμένα ονόματα.
3. Αδρανοποίηση για έλεγχο δημιουργίας βάσης δεδομένων
Μια ιδιότητα ειδική για JPA που παρέχεται από το Hibernate για τον έλεγχο της δημιουργίας βάσης δεδομένων και την εκτέλεση δημιουργίας DDL είναι spring.jpa.hibernate.ddl-auto
. Μπορούμε επίσης να χρησιμοποιήσουμε αυτήν την ιδιότητα για τη φόρτωση αρχικών δεδομένων με το Spring Boot. Έχει πολλαπλές αξίες ιδιοκτησίας που είναι create
, update
, create-drop
, validate
και <em>none</em>
. Καθένα από αυτά έχει διαφορετικές λειτουργίες και ελέγχει τη δημιουργία της βάσης δεδομένων με διαφορετικό τρόπο. Ας δούμε πώς το καθένα από αυτά αλλάζει τα ερωτήματα DDL παρακάτω.
- Δημιουργία: Η αδρανοποίηση θα αποβάλει όλους τους υπάρχοντες πίνακες και στη συνέχεια θα δημιουργήσει τους νέους πίνακες από την αρχή.
- ενημέρωση: δημιούργησε αντικείμενα με βάση τις αντιστοιχίσεις που περιλαμβάνουν σχολιασμούς ή
XML
. Αυτό συγκρίνεται με το υπάρχον σχήμα και στη συνέχεια χρησιμοποιείται για την ενημέρωση του σχήματος ανάλογα με τη διαφορά. Δεν θα διαγράψει τυχόν υπάρχοντες πίνακες ούτε θα αφαιρέσει στήλες, ακόμη και όταν δεν απαιτούνται πλέον. Θα ενημερώσει μόνο το υπάρχον σχήμα, δηλαδή θα αλλάξει τους τύπους δεδομένων και θα προσθέσει τυχόν στήλες όπως απαιτείται. - create-drop: Παρόμοια με την τιμή της ιδιότητας δημιουργίας. Θα απορρίψει ολόκληρη τη βάση δεδομένων μόλις ολοκληρώσουμε όλες τις λειτουργίες. Είναι χρήσιμο για τη δοκιμή της μονάδας.
- επικύρωση: Επικύρωση εάν οι πίνακες και οι στήλες ορίζονται στο
.sql
υπάρχει αρχείο στη βάση δεδομένων ή όχι. Θα ρίξει μια εξαίρεση διαφορετικά. - κανένα: Απενεργοποιήστε οποιονδήποτε τύπο παραγωγής DDL.
Εάν δεν έχει εντοπιστεί διαχειριστής σχήματος, η Spring Boot θα ορίσει εσωτερικά αυτήν την τιμή παραμέτρου σε
create-drop,
αλλιώς κανένα για κάθε άλλη περίπτωση
4. Διαμόρφωση δημιουργίας σχήματος βάσης δεδομένων
Από προεπιλογή, το Spring Boot DataSource θα αρχικοποιείται αυτόματα με ένα σχήμα. Εάν θέλουμε να αλλάξουμε ή να προσαρμόσουμε αυτήν τη συμπεριφορά για τη φόρτωση των αρχικών δεδομένων με το Spring Boot, μπορούμε να χρησιμοποιήσουμε το spring.sql.init.mode
ιδιοκτησία. Αυτή η ιδιότητα έχει τρεις τιμές:
- πάντα: Αυτό θα αρχικοποιεί πάντα τη βάση δεδομένων.
- ενσωματωμένο: Πάντα αρχικοποιείτε εάν χρησιμοποιείται μια ενσωματωμένη βάση δεδομένων. Αυτή η ιδιότητα ορίζεται από προεπιλογή εάν δεν έχει καθοριστεί κάποια άλλη τιμή ιδιότητας.
- ποτέ: Μην αρχικοποιείτε ποτέ οποιονδήποτε τύπο βάσης δεδομένων.
Χρησιμοποιώντας οποιαδήποτε μη ενσωματωμένη βάση δεδομένων όπως
MySQL
ήPostgreSQL
καθίσταται απαραίτητο να ορίσουμε αυτήν την ιδιότητα σε πάντα εάν θέλουμε να αρχικοποιήσουμε το σχήμα της
5. Χρησιμοποιώντας το @Sql Annotation
ο @Sql
Ο σχολιασμός παρέχει έναν δηλωτικό τρόπο αρχικοποίησης και συμπλήρωσης του δοκιμαστικού μας σχήματος. Για τη δοκιμή ενσωμάτωσης, ας δημιουργήσουμε έναν νέο πίνακα και ας τον φορτώσουμε με αρχικά δεδομένα χρησιμοποιώντας το @Sql annotation
.
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootInitialLoadIntegrationTest {
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testLoadDataForTestClass() {
assertEquals(4, employeeRepository.findAll().size());
}
}
Ας δούμε το διαφορετικό συστατικό του @SQL annotation
:
- config – Περιγράφει την τοπική διαμόρφωση για τα σενάρια SQL.
- executionPhase – μπορούμε να καθορίσουμε πότε θα εκτελεστούν τα σενάρια
BEFORE_TEST_METHOD
ήAFTER_TEST_METHOD
. - δηλώσεις – Επιτρέπει τη δήλωση εκτέλεσης των ενσωματωμένων εντολών SQL.
- scripts – Μπορούμε να δηλώσουμε τις διαδρομές προς τα αρχεία σεναρίων SQL για εκτέλεση.
@Test
@Sql({"/import_senior_employees.sql"})
public void testLoadDataForTestCase() {
assertEquals(5, employeeRepository.findAll().size());
}
6. Χρησιμοποιώντας το @SqlConfig
Χρησιμοποιώντας την @SqlConfig
σχολιασμός για τη φόρτωση των αρχικών δεδομένων με Spring Boot, μπορούμε να διαμορφώσουμε τον τρόπο ανάλυσης και εκτέλεσης των σεναρίων SQL. Μπορούμε να δηλώσουμε διαμορφώσεις επιπέδου κλάσης ως @SqlConfig
, όπου χρησιμεύει ως παγκόσμιο σκηνικό για την τάξη. Ή, μπορούμε να το χρησιμοποιήσουμε για να ορίσουμε συγκεκριμένα @Sql
σχολιασμοί. Ακολουθεί ένα παράδειγμα όπου καθορίζουμε την κωδικοποίηση των σεναρίων SQL μας, μαζί με τη λειτουργία συναλλαγής στην οποία τα εκτελούμε:
@Test
@Sql(scripts = {
"/import_senior_employees.sql"
},
config = @SqlConfig(encoding = "utf-8", transactionMode = TransactionMode.ISOLATED))
public void testLoadDataV1ForTestCase() {
assertEquals(5, employeeRepository.findAll().size());
}
- blockCommentStartDelimiter–Αυτό αντιπροσωπεύει τον οριοθέτη που χρησιμοποιείται για τον προσδιορισμό της έναρξης των σχολίων μπλοκ σε αρχεία δέσμης ενεργειών SQL
- blockCommentEndDelimiter–Στα αρχεία δέσμης ενεργειών SQL, αυτό χρησιμοποιείται για την εμφάνιση του τέλους των σχολίων μπλοκ
- σχόλιοΠρόθεμα–Το πρόθεμα που χρησιμοποιείται για την αναγνώριση σχολίων μιας γραμμής σε σενάρια SQL
- πηγή δεδομένων– Θα εκτελεί σενάρια XML και δηλώσεις SQL έναντι του
javax.sql.DataSource
φασόλι. - κωδικοποίηση–Αυτό αντιπροσωπεύει την κωδικοποίηση που θα χρησιμοποιήσουν τα αρχεία δέσμης ενεργειών SQL. Από προεπιλογή, είναι το ίδιο με την κωδικοποίηση της πλατφόρμας.
- errorMode–Αυτή η λειτουργία αντιπροσωπεύει το
errorMode
που πρόκειται να χρησιμοποιηθεί κάθε φορά που παρουσιάζεται σφάλμα κατά την εκτέλεση των σεναρίων - διαχωριστής– Αυτό ορίζει τη συμβολοσειρά που χρησιμοποιείται για το διαχωρισμό διαφορετικών μεμονωμένων εντολών. Το „-“ χρησιμοποιείται από προεπιλογή.
- διαχειριστής συναλλαγών–Αυτό καθορίζει το όνομα bean του PlatformTransactionManager που χρησιμοποιείται από τις συναλλαγές
- λειτουργία συναλλαγής– Χρησιμοποιείται κατά την εκτέλεση οποιωνδήποτε σεναρίων στη συναλλαγή.
7. Χρησιμοποιώντας το @Sqlgroup Annotation
Στην Java 8 και νεότερη έκδοση, υποστηρίζονται πολλαπλοί σχολιασμοί. Μπορούμε να χρησιμοποιήσουμε αυτή τη δυνατότητα για @Sql
σχολιασμοί για τη φόρτωση των αρχικών δεδομένων με το Spring Boot. Για Java 7 και παρακάτω, υπάρχει ένας σχολιασμός κοντέινερ που ονομάζεται @SqlGroup
. Μπορούμε να δηλώσουμε πολλαπλές @Sql
σχολιασμοί χρησιμοποιώντας το @SqlGroup
σχόλιο.
@SqlGroup({
@Sql(scripts = "/employees_schema.sql",
config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)),
@Sql("/import_employees.sql")
})
public class SpringBootSqlGroupAnnotationIntegrationTest {
@Autowired
private EmployeeRepository employeeRepository;
@Test
public void testLoadDataForTestCase() {
assertEquals(4, employeeRepository.findAll().size());
}
}
Περίληψη
Σε αυτό το άρθρο, είδαμε πώς να χρησιμοποιούμε διαφορετικές μεθόδους για τη φόρτωση αρχικών δεδομένων με το Spring Boot. Μάθαμε πώς να ρυθμίζουμε ένα σχήμα και να το συμπληρώνουμε με δεδομένα χρησιμοποιώντας schema.sql
και data.sql
αρχεία. Επιπλέον, εξετάσαμε τον τρόπο φόρτωσης δεδομένων δοκιμής για δοκιμές χρησιμοποιώντας @Sql
, @SqlConfig
και @SqlGroup
σχολιασμοί. Είναι σημαντικό να σημειωθεί ότι αυτή η προσέγγιση είναι πιο κατάλληλη για βασικά και απλά σενάρια. Οποιοσδήποτε προηγμένος χειρισμός βάσεων δεδομένων θα απαιτούσε πιο προηγμένα και εκλεπτυσμένα εργαλεία όπως το Liquibase και το Flyway. Όπως πάντα, ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα.