Spring Boot integracija MySQL-a i Druid-a
Uvod u MySQL
MySQL je danas u projektima najrasprostranjenija relaciona baza podataka; koriste ga kako velike internet kompanije, tako i male i srednje firme.
MySQL je malehn, brz i otvorenog koda, pa ga programeri rado prihvataju.
Instalacija MySQL-a je vrlo jednostavna - za različite operativne sisteme MySQL nudi odgovarajuće instalacione pakete.

Verzija koju MySQL trenutno najviše gura jeste 8.0; adresa priručnika je data u nastavku:
Kako instalirati MySQL
I u svom kursu o MySQL-u posebno sam obradio ovu temu, detaljnije: Instalacija MySQL-a (Windows, macOS, Linux)
Ako raspolažeš cloud serverom, preporučujem instalaciju na njega, kako bi MySQL mogao da radi duže bez brige o restartovanju servisa. Koraci su opisani u donjem dokumentu.
https://dev.mysql.com/doc/refman/8.0/en/linux-installation.html
Možeš ga instalirati i direktno preko BaoTa panela, što je još jednostavnije, brže i bezbrižnije.
Adresa instalacionog skripta BaoTa panela: https://www.bt.cn/new/download.html

Nakon instalacije, na stranici za upravljanje bazom možeš dodavati baze i njima upravljati.

Ako si Windows korisnik, korake instalacije vidi u sledećem dokumentu.
https://dev.mysql.com/doc/refman/8.0/en/windows-installation.html
Ako si macOS korisnik, korake instalacije vidi u sledećem dokumentu.
https://dev.mysql.com/doc/refman/8.0/en/macos-installation-pkg.html
Instalacija na Windowsu i macOS-u je vrlo jednostavna - uglavnom se svodi na preuzimanje MySQL instalera za odgovarajući operativni sistem.

Zatim slede upute instalacionog čarobnjaka - kroz korake „naivno" instaliraj.

Spring Boot integracija sa MySQL bazom
Integracija Spring Boot-a sa MySQL bazom je vrlo jednostavna - dovoljno je dodati MySQL zavisnost i u konfiguracioni fajl upisati parametre baze. Možemo pristupiti MySQL-u bez pisanja sirovog koda za pristup bazi i bez pozivanja JDBC-a ili connection pool-a.
- U IntelliJ IDEA-i napravi novi Spring Boot projekat, koristeći Java 8 „(Community izdanje nema tu funkciju, pa projekat treba generisati na Spring Initializr i potom uvesti; preporučujem Ultimate izdanje, koje je znatno moćnije)".

Dodaj Java drajver za povezivanje sa MySQL-om i JDBC Starter.

Odgovarajući kod u fajlu pom.xml:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>2) Preko BaoTa panela kreiraj bazu codingmore-mysql i dodaj tabelu
CREATE TABLE `user` (
`id` int NOT NULL,
`name` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
`age` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
--
-- Indeksi tabele
--
--
-- Indeksi tabele `user`
--
ALTER TABLE `user`
ADD PRIMARY KEY (`id`);
COMMIT;Zatim ubacujemo jedan red podataka:
INSERT INTO `user` (`id`, `name`, `password`, `age`) VALUES ('1', 'Chenmo Wang Er', ' 123456', '18');SQL naredbe sam smestio u direktorijum resouces izvornog koda
3) U fajl application.yml dodaj informacije o drajveru za povezivanje sa bazom
spring:
datasource:
username: codingmore-mysql
password: YyfR4TDxCwrjZ2Fs
url:jdbc: mysql://118.190.99.232:3306/codingmore-mysql?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falsePreporučujem instalaciju plugin-a Spring Initializr and assistant. On može automatski dopuniti konfiguracione podatke.

4) Napravi klasu entiteta User.java
@Data
public class User {
private Integer id;
private String name;
private String password;
private Integer age;
}Preporučujem da u pom.xml dodaš zavisnost za lombok.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>5) U testnu klasu dodaj sledeći kod
@SpringBootTest
@Slf4j
class CodingmoreMysqlApplicationTests {
@Resource
private JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
String sql ="select * from user";
List<User> users = jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt(1));
user.setAge(rs.getInt("age"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
return user;
}
});
log.info("Upit uspešan");
log.info("Korisnik{}",users);
}
}Test klase Spring Boot-a uglavnom se nalaze u direktorijumu src/test/java; nakon uspešnog kreiranja projekta Spring Boot automatski generiše test klasu prema imenu projekta.
Na primer, ovaj projekat se zove codingmore-mysql, pa će test klasa nositi ime CodingmoreMysqlApplicationTests.
Anotacija @SpringBootTest omogućava testiranje glavne klase našeg projekta - u ovom slučaju CodingmoreMysqlApplication.
Anotacija @Test potičce iz junit-a i označava da je dati metod testni metod.
JdbcTemplate je alatka za povezivanje sa bazom preko JDBC-a; nalazi se u zavisnosti spring-boot-starter-jdbc.
Anotacija @Resource ubrizgaće nam prilikom startovanja Spring Boot-a jedan objekat tipa JdbcTemplate.
Metod jdbcTemplate.query() pomoću SQL naredbe i anonimne unutrašnje klase izvršava SQL i upituje rezultujući skup.
RowMapper predstavlja objekat svakog reda podataka koji dohvatimo; preklapanjem metoda mapRow možemo rezultujući skup podataka „umotati" u User objekat.
Desni klik na meni i pokretanje metoda testMysql omogućava vam da u logu vidite rezultat SQL izvršenja.

Kako se povezati sa MySQL-om pomoću Navicat-a
Navicat je alatka za rad sa MySQL bazom koju koristim od svog prvog radnog mesta do danas; njome se lako povezuješ sa bazom i izvršavaš operacije dodavanja, brisanja, izmene i čitanja.

Povezivanje sa bazom je takođe vrlo jednostavno - dovoljno je uneti IP adresu hosta, port, korisničko ime i lozinku.

Kada se povezati sa MySQL-om pomoću IntelliJ IDEA-e
Pored Navicat-a, za direktu konekciju sa MySQL-om može se koristiti i IntelliJ IDEA.
Klikni na panel „database", u gornjem levom uglu izaberi znak +, pa DataSource, a zatim MySQL.

U iskačućem panelu unesi podatke o konekciji.

Ako se prvi put povezuješ sa MySQL-om, ne zaboravi da klikneš na „download" da preuzmeš MySQL drajver, a zatim na „test connection" da isprobaš da li je konekcija uspela; ako se pojavi sledeći prikaz, sve je OK.

Izaberi tabelu baze s desne strane i dvoklikni - možeš videti podatke.

U SQL panelu „console" možeš pisati SQL naredbe za izvršavanje operacija dodavanja, brisanja, izmene i čitanja.

Spring Boot integracija sa Druid-om
Druid je alatka za upravljanje connection pool-om koju je Alibaba otvorila; objedinjuje prednosti C3P0, DBCP i drugih pool-ova, a uz to dodaje i nadzor putem logova.
Na GitHubu, Druid je prikupio 25,4k zvezdica - može se reći da je veoma poznat; iz opisa se vidi da je Druid rođen za nadzor.

Druid sadrži tri važne komponente:
- DruidDriver, koji pruža sistem plugin-ova zasnovan na Filter-Chain obrascu;
- DruidDataSource, efikasan i upravljiv connection pool;
- SQLParser, koji podržava sve JDBC-kompatibilne baze, uključujući Oracle, MySQL i sl.
Spring Boot od verzije 2.0 nadalje podrazumevano koristi Hikari connection pool, što se može videti iz prethodnih log poruka.

Ako bismo želeli da koristimo Druid, kako da ga integrišemo?
Ovoga puta ćemo izmene raditi direktno na backend projektu Codingmore - codingmore-admin.
Prvi korak: u fajl pom.xml dodajemo zavisnost Druid-a; zvanično je već obezbeđen starter, pa ćemo njega iskoristiti.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>Drugi korak: u fajl application.yml dodajemo konfiguraciju za Druid.
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
#inicijalna veličina connection pool-a
initial-size: 5
#minimalni broj konekcija
min-idle: 5
#maksimalni broj konekcija
max-active: 200
#vreme čekanja na konekciju pre isteka
max-wait: 60000
#interval provere neiskorišćenih konekcija koje treba zatvoriti, u milisekundama
time-between-eviction-runs-millis: 60000
#minimalno vreme koje konekcija provede u pool-u, u milisekundama
min-evictable-idle-time-millis: 300000
#testna konekcija
validation-query: SELECT 1 FROM DUAL
#provera pri traženju konekcije; preporučljivo true, ne utiče na performanse i povećava sigurnost
test-while-idle: true
#provera pri dohvatanju konekcije; preporučljivo isključiti, utiče na performanse
test-on-borrow: false
#provera pri vraćanju konekcije; preporučljivo isključiti, utiče na performanse
test-on-return: false
#da li uključiti PSCache; PSCache znatno poboljšava performanse na bazama koje podržavaju kursore - za oracle preporučljivo uključiti, za mysql isključiti
pool-prepared-statements: false
#deluje tek nakon uključivanja poolPreparedStatements
max-pool-prepared-statement-per-connection-size: 20
#konfiguracija dodatnih plugin-ova, najčešće korišćeni: stat:nadzor statistike log4j:logovi wall:odbrana od SQL injekcije
filters: stat,wall,slf4j
#uključi mergeSql; beleži spore SQL upite
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
#konfiguriši DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
#konfiguriši DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
#korisničko ime
login-username: root
#lozinka
login-password: rootTreći korak: restartuj projekat. U logu će se videti inicijalizacija Druid-a.

Četvrti korak: preko adrese http://localhost:9002/druid/ u pregledaču možeš pristupiti Druid-ovoj stranici za nadzor; korisničko ime i lozinka koje smo naveli u konfiguracionom fajlu su root i root, a nakon prijave izgleda ovako.

Više detalja o konfiguraciji nadzora može se naći u Druid-ovom GitHub repozitorijumu.
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

Adresa izvornog koda
- Codingmore GitHub: https://github.com/itwanger/coding-more
- codingmore-mysql: https://github.com/itwanger/codingmore-learning/tree/main/codingmore-mysql
