Spring Boot integracija MyBatis-Plus AutoGenerator-a za generisanje skeleton koda projekta Bianchengmao
Kao Java backend programer, u svakodnevnom radu ne možete izbeći generisanje perzistentnih objekata PO koji odgovaraju tabelama baze podataka, interfejsa DAO za rad sa bazom, kao i CRUD XML fajlova, odnosno mapper-a.
Mybatis Generator je alat za generisanje koda koji zvanično pruža MyBatis i sasvim može da izađe na kraj sa ovim poslom. Međutim, tokom razvoja open-source sajta „Bianchengmao 🐱" nedavno sam isprobao AutoGenerator koji zvanično pruža MyBatis-Plus i otkrio da je konfiguracija jednostavnija, a efikasnost razvoja veća! Zato vam dolazim da ga preporučim.
Hajmo preko jednog gif-a da osetimo moć AutoGenerator-a.

Uvoz SQL fajla
SQL fajl projekta Bianchengmao već sam sinhronizovao sa izvornim kodom ovog tutorijala.
Putanja: https://github.com/itwanger/codingmore-learning/tree/main/codingmore-autogenerator
Možete preko GitHub Desktop-a sa GitHub-a preuzeti na lokalni računar projekat namenjen ovom tutorijalu, codingmore-autogenerator; lokacija SQL fajla prikazana je na donjoj slici.

Bianchengmao koristi MySQL verziju 8.0; nakon što se povežete na MySQL, komandom select version(); možete proveriti verziju.

Otvorite Navicat i uvezite SQL fajl u lokalnu bazu podataka.

Zatvorite konekciju, ponovo je otvorite i videćete uvezenu bazu codingmore — ukupno 27 tabela.

Prvo isprobajte Mybatis Generator
Prvi korak, u fajl pom.xml dodajte zavisnosti za MySQL + MyBatis (preduslov za Mybatis Generator).
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>Nakon dodavanja, obavezno izvršite jedan Maven reload (vidite donju sliku) kako biste bili sigurni da su zavisnosti MyBatis-a učitane pre nego što pređete na drugi korak.

U suprotnom bi sledeći korak mogao da ne prođe, a da ne dobijete nikakvu poruku o grešci. Ne pitajte me kako znam — bolna spoznaja nakon što sam već upao u taj problem.

Nakon dodavanja, skeleton kod možete generisati preko Maven plagina ili preko Java koda. Ovde ćemo demonstrirati preko Maven plagina. Oblik preko Java koda možete pogledati u Mybatis Generator-u:
Drugi korak, u fajlu pom.xml dodajte MyBatis Generator plagin, obratite pažnju — dodaje se pod čvor build→plugins.
<!-- MyBatis Generator plagin -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!-- Konfiguracioni fajl MyBatis Generator generatora -->
<configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
<!-- Dozvoljava prepisivanje generisanih fajlova; kada utvrdite skeleton kod, možete postaviti na false kako ne biste prepisali postojeći kod -->
<overwrite>true</overwrite>
<!-- Dodaje zavisnosti trenutnog pom-a u classpath generatora -->
<includeCompileDependencies>true</includeCompileDependencies>
</configuration>
</plugin>Najnovija verzija MyBatis Generator plagina je trenutno 1.4.0, ali mi koristimo prethodnu stabilnu verziju 1.3.7 — nove verzije lako imaju zamke.
Pogledajmo strukturni prikaz fajla pom.xml nakon dodavanja MyBatis Generator plagina.

Samo dodavanje plagina nije dovoljno — moramo ga i konfigurisati. Elementom configurationFile navodimo konfiguracioni fajl mybatis-generator-config.xml:
<configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>Pošto se tabele baze mogu menjati, potrebno je dodati i konfiguraciju <overwrite>true</overwrite>, koja dozvoljava prepisivanje starih fajlova. Da bismo sprečili prepisivanje SQL upita koje smo sami napisali, MyBatis Generator će prepisati samo stare po i dao, dok se *mapper.xml ne prepisuje, već dopunjuje.
Mybatis Generator mora da se poveže sa bazom, pa je u čvor plugin potrebno dodati i zavisnost za drajver baze podataka, ovako:
<configuration>
</configuration>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>Međutim, u fajlu pom.xml smo već dodali MySQL konekcioni drajver, pa bi ovde ponovno dodavanje bilo suvišno. Srećom, Maven nam nudi svojstvo includeCompileDependencies koje nam omogućava da se u plaginu pozovemo na prethodno dodate zavisnosti.
<includeCompileDependencies>true</includeCompileDependencies>Pogledajmo lokaciju fajla mybatis-generator-config.xml.

Pogledajmo sadržaj fajla mybatis-generator-config.xml.
<generatorConfiguration>
<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- Komentari -->
<commentGenerator>
<!-- Da li se komentari uopšte ne generišu -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- JDBC konekcija -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/codingmore?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false"
userId="root"
password="Huicheng123">
<!--Više verzije mysql-connector-java moraju postaviti nullCatalogMeansCurrent=true -->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- Konverzija tipova -->
<javaTypeResolver>
<!--Da li se koristi bigDecimal, podrazumevano false.
false: JDBC DECIMAL i NUMERIC tipove razrešava kao Integer
true: JDBC DECIMAL i NUMERIC tipove razrešava kao java.math.BigDecimal -->
<property name="forceBigDecimals" value="true"/>
</javaTypeResolver>
<!-- Adresa za generisanje klasa entiteta -->
<javaModelGenerator targetPackage="top.codingmore.mbg.po" targetProject="src/main/java">
<!-- Da li se za polja tipa string u set metodi vrši trim, podrazumevano false -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- Generisanje Mapper.xml fajla -->
<sqlMapGenerator targetPackage="top.codingmore.mbg.mapper" targetProject="src/main/resources">
</sqlMapGenerator>
<!-- Generisanje XxxMapper.java interfejsa -->
<javaClientGenerator targetPackage="top.codingmore.mbg.dao" targetProject="src/main/java" type="XMLMAPPER">
</javaClientGenerator>
<!-- schema je ime baze, potrebno za oracle, nije potrebno za mysql.
tableName je ime odgovarajuće tabele baze
domainObjectName je ime klase entiteta koja se generiše (ne mora da se navodi; podrazumevano se ime tabele po PascalCase notaciji konvertuje u ime klase)
enableXXXByExample je podrazumevano true; kada je true, generiše se odgovarajuća Example pomoćna klasa koja pomaže u uslovnim upitima — ako ne želite, možete postaviti na false
-->
<table schema="" tableName="posts" domainObjectName="Posts"
enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
enableUpdateByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>- Konfiguracioni fajl mora sadržati barem jedan context
- commentGenerator služi za konfiguraciju generisanih komentara
- jdbcConnection služi za povezivanje sa bazom
- javaTypeResolver konfiguriše pravila konverzije tipova između JDBC-a i Jave
- javaModelGenerator konfiguriše putanju paketa i projekta za generisanje po klasa
- sqlMapGenerator konfiguriše direktorijum u kojem se generiše mapper.xml fajl
- javaClientGenerator konfiguriše direktorijum u kojem se generiše mapper.java fajl
- Jedan table odgovara jednoj tabeli; ako želite istovremeno da generišete više tabela, potrebno je konfigurisati više table elemenata
Više informacija o konfiguraciji možete pogledati u sledećem članku:
Ovime je konfiguracija mybatis-generator-maven-plugina završena — kompletan sadržaj je prikazan na donjoj slici.

Nakon završene konfiguracije, dvoklikom pokrenite Maven plagin Mybatis Generator i, ako nema problema, videćete generisane fajlove.

Zatim isprobajte AutoGenerator iz MyBatis-Plus
MyBatis-Plus (skraćeno MP) je alat za unapređenje MyBatis-a. Zvanično se tvrdi da je odnos između MP-a i MyBatis-a poput 1P i 2P u Contra-i — pravi drugovi koji zajedno osvajaju svet.

AutoGenerator je generator koda koji je objavio MyBatis-Plus i koji može brzo da generiše kod za module Entity, Mapper, Mapper XML, Service, Controller itd. — moćniji je od Mybatis Generator-a i sa većom efikasnošću razvoja.
Kroz prethodno iskustvo, sigurno ste osetili da je Mybatis Generator nespretan. Sada hajde da isprobamo AutoGenerator — nakon upoređivanja, odgovor će vam sam postati jasan.
Prvi korak, u fajl pom.xml dodajte zavisnost za AutoGenerator.
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>Drugi korak, dodajte zavisnost za template engine. MyBatis-Plus podržava Velocity (podrazumevano), Freemarker i Beetl — ovde koristimo Velocity engine.
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>Treći korak, napravite fajl CodeGenerator.java i u metodi main dodajte objekat AutoGenerator iz MyBatis-Plus-a.
package top.codingmore.generator;
import com.baomidou.mybatisplus.generator.AutoGenerator;
/**
* @author Chenmo Wang Er
* @date 5/17/22
*/
public class CodeGenerator {
public static void main(String[] args) {
// Generator koda
AutoGenerator mpg = new AutoGenerator();
}
}U metodi main dodajte globalnu konfiguraciju.
// Globalna konfiguracija
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("Chenmo Wang Er");
gc.setOpen(false);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
gc.setIdType(IdType.AUTO);
gc.setBaseColumnList(true);
gc.setBaseResultMap(true);
gc.setFileOverride(true);
mpg.setGlobalConfig(gc);Konfigurišite izvor podataka.
// Konfiguracija izvora podataka
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/codingmore?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);Peti korak, konfigurišite pakete.
// Konfiguracija paketa
PackageConfig pc = new PackageConfig();
pc.setParent("top.codingmore.mpg");Više konfiguracionih stavki možete pogledati u zvaničnoj dokumentaciji:
Kompletan kod možete naći u repozitorijumima izvornog koda navedenim u nastavku.
Adrese izvornog koda:
- Bianchengmao: https://github.com/itwanger/coding-more
- codingmore-autogenerator: https://github.com/itwanger/codingmore-learning
