Automatsko kreiranje MySQL baze podataka pomoću Spring Boot-a
Nakon što je MySQL instalacija završena i veza uspostavljena, možemo kreirati bazu podataka i započeti operacije nad njom.
Izvršavanjem komande show databases; možemo prikazati sve baze podataka na trenutnom serveru.

Imajte na umu da prilikom izvršavanja SQL naredbi u MySQL klijentu treba dodati tačku-zarez ; i pritisnuti taster Enter, jer će u suprotnom MySQL smatrati da unos još uvek nije završen i preći će u novi red čekajući vaš unos.

Dakle, tačka-zarez ; je terminator MySQL naredbi.
U redu, baze podataka kao što su information_schema, mysql, performance_schema i sys na gorenjem snimku ekrana sve su ugrađene MySQL baze, dok su preostale cmower, codingmore, jeesite, jepf, pai_coding itd. baze koje sam kreirao lokalno. Nazivi ovih baza lako asociraju na neke poznate projekte otvorenog koda, na primer Jishupai.
Ergova MySQL putanja ka naprednom znanju objašnjava osnovne operacije MySQL kroz praksu.
pai_coding na gorenjem snimku ekrana je baza podataka projekta Jishupai.
Kreiranje baze podataka
Sintaksa za kreiranje baze podataka je:
create database ime_baze;Na primer, ako želim da kreiram bazu podataka pod imenom test, mogu izvršiti:
create database test;Ako se prikaže Query OK, 1 row affected (0.02 sec), to znači da je baza podataka uspešno kreirana.
Ponovnim pokretanjem komande show databases; možemo videti bazu test.
Mala preporuka: MySQL pamti prethodno unete komande, a pomoću strelica gore i dole na tastaturi možete se kretati kroz istoriju komandi.

Obično pri kreiranju baze podataka dodajemo if not exists, jer u suprotnom, kada baza podataka već postoji, prijaviće grešku database exists.
create database test;
ERROR 1007 (HY000): Can't create database 'test'; database existsMožemo napisati ovako:
create database if not exists test;
Query OK, 1 row affected, 1 warning (0.00 sec)Kao što se vidi, SQL naredba je uspešno izvršena, ali će postojati jedno upozorenje (warning), jer baza podataka već postoji, pa nas MySQL o tome obaveštava.
Promena baze podataka
Sintaksa za promenu aktivne baze podataka je:
use ime_baze;Na primer, ako želimo da pređemo na bazu pai_coding projekta Jishupai, možemo izvršiti:
use pai_coding;Ako se prikaže Database changed, to znači da je promena uspela.

Tek kada pređemo na bazu projekta Jishupai, možemo vršiti operacije nad tabelama unutar te baze.

Brisanje baze podataka
Sintaksa za brisanje baze podataka je:
drop database ime_baze;Na primer, ako želimo da obrišemo bazu test, možemo izvršiti:
drop database test;Nije li to jednostavno?
Ali pre nego što obrišete bazu i pobegnete, najbolje je da vas neko uštipne po nozi, da vidite da li ste pri svesti, jer ćete inače zažaliti prekasno.
Prilikom brisanja baze podataka možete dodati i if exists, tako da kada baza ne postoji, neće prijaviti grešku.
drop database if exists test;Kako Jishupai kreira bazu podataka?
Kreiranje baze podataka u Jishupai obavlja se automatski — kada se projekat pokrene, baza se automatski kreira.
Konkretna metoda realizacije nalazi se u tutorijalu projekta Jishupai.

Ovde ću dati kratko objašnjenje — izvorni kod se nalazi u klasi ForumDataSourceInitializer.

Obratite pažnju na metodu autoInitDatabase — tu se nalazi logika automatskog kreiranja baze podataka.
private boolean autoInitDatabase() {
// Upit ne uspe, možda baza ne postoji; pokušajte kreirati bazu i testirajte ponovo
// Veza sa bazom
URI url = URI.create(SpringUtil.getConfigOrElse("spring.datasource.url", "spring.dynamic.datasource.master.url").substring(5));
// Korisničko ime
String uname = SpringUtil.getConfigOrElse("spring.datasource.username", "spring.dynamic.datasource.master.username");
// Lozinka
String pwd = SpringUtil.getConfigOrElse("spring.datasource.password", "spring.dynamic.datasource.master.password");
// Kreiranje veze
try (Connection connection = DriverManager.getConnection("jdbc:mysql://" + url.getHost() + ":" + url.getPort() +
"?useUnicode=true&characterEncoding=UTF-8&useSSL=false", uname, pwd);
Statement statement = connection.createStatement()) {
// Upit da li baza postoji
ResultSet set = statement.executeQuery("select schema_name from information_schema.schemata where schema_name = '" + database + "'");
if (!set.next()) {
// Ako ne postoji, kreiraj bazu
String createDb = "CREATE DATABASE IF NOT EXISTS " + database;
connection.setAutoCommit(false);
statement.execute(createDb);
connection.commit();
log.info("Kreiranje baze ({}), uspešno", database);
if (set.isClosed()) {
set.close();
}
return true;
}
set.close();
log.info("Baza već postoji, nema potrebe za inicijalizacijom");
return false;
} catch (SQLException e2) {
throw new RuntimeException(e2);
}
}Logika je veoma jednostavna: na osnovu URL-a, korisničkog imena i lozinke kreira se veza sa bazom — veza od klijenta ka serveru — a zatim se iz tabele information_schema.schemata proverava da li baza postoji; ako ne postoji, kreira se.
Koristi se najosnovniji JDBC pristup, uz nešto znanja o Spring-u, što ovde nećemo dalje razrađivati. Trebalo bi da možete razumeti čitajući komentare u kodu.
information_schema sadrži metapodatke MySQL, a informacije o bazama podataka čuvaju se u tabeli schemata. Možemo pregledati strukturu tabele schemata preko terminala.

Ovde ću vam dati zadatak: ako ste ranije učili Java ili Spring Boot, možete pokušati da implementirate funkciju automatskog kreiranja baze podataka po uzoru na Jishupai.
Java izvorni pristup
Za izvorni Java kod prvo je potrebno preuzeti MySQL JDBC drajver. Drajver omogućava Java programu da komunicira sa MySQL bazom podataka.

Preuzetu .jar arhivu postavite u classpath projekta. Šta je classpath? To je obično direktorijum src/main/resources projekta ili direktorijum lib projekta.
Zatim, napišite Java klasu koja se povezuje na MySQL server i kreira bazu podataka ako ona ne postoji:
class DatabaseCreator {
private static final String URL = "jdbc:mysql://localhost:3306/?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "Codingmore123";
private static final String DATABASE_NAME = "pai_coding";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement()) {
if (!databaseExists(conn, DATABASE_NAME)) {
stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + DATABASE_NAME);
System.out.println("Baza podataka je uspešno kreirana");
} else {
System.out.println("Baza podataka već postoji");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private static boolean databaseExists(Connection conn, String dbName) throws SQLException {
ResultSet resultSet = conn.getMetaData().getCatalogs();
while (resultSet.next()) {
if (dbName.equals(resultSet.getString(1))) {
return true;
}
}
return false;
}
}Evo kratkog objašnjenja delova koda koji su vam možda nepoznati:
Prvo, main metoda:
①,DriverManager.getConnection(URL, USER, PASSWORD): uspostavlja vezu sa MySQL serverom putem JDBC-ja.
②,conn.createStatement(): kreira Statement objekat za izvršavanje SQL komandi.
③,stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + DATABASE_NAME): izvršava SQL komandu i kreira bazu podataka. Ovo povezujemo sa temom ovog članka.
Zatim, databaseExists metoda:
①,Metodom getMetaData() nad Connection objektom mogu se dobiti metapodaci baze podataka. Ovi metapodaci sadrže informacije o svim bazama na serveru.
②,Metoda getCatalogs() vraća listu svih baza na serveru, a vraćeni ResultSet sadrži naziv svake baze na serveru.
③,Metoda resultSet.getString(1) vraća vrednost prve kolone u tekućem redu, odnosno naziv baze podataka.
Spring Boot
Za Spring Boot projekat stvari su mnogo jednostavnije — ne morate preuzimati drajver, već je dovoljno dodati zavisnost MySQL drajvera u fajl pom.xml.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>Zatim u konfiguracionom fajlu application.yml postavite osnovne informacije o vezi sa bazom.
spring:
datasource:
url: jdbc:mysql://localhost:3306/?useSSL=false&serverTimezone=UTC
username: root
password: 123456Nakon toga, u testnoj klasi Spring Boot-a izvršite operaciju kreiranja baze.
@Slf4j
@SpringBootTest(classes = QuickForumApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class DatabaseCreationTest {
@Autowired
private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void createDatabaseTest() throws SQLException {
String dbName = "pai_coding";
if (!databaseExists(dbName)) {
jdbcTemplate.execute("CREATE DATABASE IF NOT EXISTS " + dbName);
System.out.println("Kreiranje uspešno");
} else {
System.out.println("Već postoji");
}
}
private boolean databaseExists(String dbName) throws SQLException {
try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
ResultSet set = statement.executeQuery("select schema_name from information_schema.schemata where schema_name = '" + dbName + "'");
return set.next();
}
}
}I ovde ćemo kratko objasniti delove koda koji su vam možda nepoznati:
①,@Slf4j: anotacija koju pruža Lombok biblioteka, koristi se za automatsko kreiranje objekta za logovanje (na primer Logger).
②,@SpringBootTest(classes = QuickForumApplication.class): označava da je ovo integraciona test klasa Spring Boot-a, koja učitava kontekst Spring Boot aplikacije određen klasom QuickForumApplication.
③,@RunWith(SpringJUnit4ClassRunner.class): koristi JUnit4 za podršku testiranja u Spring kontekstu.
④,@Autowired: automatsko ubrizgavanje DataSource i JdbcTemplate objekata.
Možete probati da vidite da li će uspeti.
Za više znanja o Spring Boot-u, pogledajte: Spring Boot putanja ka naprednom znanju
Izvorni kod: DatabaseCreationTest
Rezime
U ovom članku smo uglavnom objasnili osnovne operacije nad MySQL bazom podataka, uključujući kreiranje baze, promenu baze i brisanje baze.
Takođe smo, u vezi sa projektom Jishupai, objasnili kako Jishupai automatski kreira bazu podataka, kao i kako kreirati bazu pomoću izvornog Java koda i Spring Boot projekta.
Nadamo se da ćete vežbati i povezati teoriju sa praksom.
