MyBatis met lente

Persistentie top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Inleiding

MyBatis is een van de meest gebruikte open-source frameworks voor het implementeren van SQL-databasetoegang in Java-applicaties.

In deze korte tutorial laten we zien hoe je MyBatis integreert met Spring en Spring Boot.

Voor degenen die nog niet bekend zijn met dit framework, lees dan zeker ons artikel over werken met MyBatis.

2. Het model definiëren

Laten we beginnen met het definiëren van eenvoudige POJO die we in ons artikel zullen gebruiken:

openbare klasse Artikel {privé Lange id; private String-titel; private String-auteur; // constructor, standaard getters en setters}

En een gelijkwaardige SQL schema.sql het dossier:

TABEL MAKEN INDIEN NIET BESTAAT `ARTIKELEN` (` id` INTEGER PRIMAIRE SLEUTEL, `titel` VARCHAR (100) NOT NULL,` auteur` VARCHAR (100) NOT NULL);

Laten we vervolgens een data.sql -bestand, dat eenvoudig één record in ons Lidwoord tafel:

INVOEGEN IN ARTIKELEN WAARDEN (1, 'Werken met MyBatis in het voorjaar', 'Baeldung');

Beide SQL-bestanden moeten in het klassenpad worden opgenomen.

3. Veerconfiguratie

Om MyBatis te gaan gebruiken, moeten we twee belangrijke afhankelijkheden toevoegen - MyBatis en MyBatis-Spring:

 org.mybatis mybatis 3.5.2 org.mybatis mybatis-spring 2.0.2 

Afgezien daarvan hebben we basis afhankelijkheden van de lente nodig:

 org.springframework spring-context 5.1.8.RELEASE org.springframework spring-beans 5.1.8.RELEASE 

In onze voorbeelden gebruiken we de ingesloten H2-database om de installatie en EmbeddedDatabaseBuilder klasse uit de spring-jdbc module voor configuratie:

 com.h2database h2 1.4.199 org.springframework spring-jdbc 5.1.8.RELEASE 

3.1. Op annotatie gebaseerde configuratie

Spring vereenvoudigt de configuratie voor MyBatis. De enige vereiste elementen zijn javax.sql.Datasource, org.apache.ibatis.session.SqlSessionFactory, en ten minste één mapper.

Laten we eerst een configuratieklasse maken:

@Configuration @MapperScan ("com.baeldung.mybatis") openbare klasse PersistenceConfig {@Bean openbare DataSource dataSource () {retourneer nieuwe EmbeddedDatabaseBuilder () .setType (EmbeddedDatabaseType.H2) .addScript ("schema.sql") .addScript (" data.sql ") .build (); } @Bean openbare SqlSessionFactory sqlSessionFactory () gooit uitzondering {SqlSessionFactoryBean factoryBean = nieuwe SqlSessionFactoryBean (); factoryBean.setDataSource (dataSource ()); terugkeer factoryBean.getObject (); }}

We hebben ook een @MapperScan annotatie van MyBatis-Spring die gedefinieerde pakketten scant en automatisch interfaces oppikt met behulp van een van de mapper-annotaties, zoals @Selecteer of @Verwijderen.

Gebruik makend van @MapperScan zorgt er ook voor dat elke verstrekte mapper automatisch wordt geregistreerd als Bean en later kan worden gebruikt met de @Autowired annotatie.

We kunnen nu een eenvoudig maken ArticleMapper koppel:

openbare interface ArticleMapper {@Select ("SELECTEER * UIT ARTIKELEN WAAR id = # {id}") Artikel getArticle (@Param ("id") Lange id); }

En tot slot, test onze setup:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = PersistenceConfig.class) openbare klasse ArticleMapperIntegrationTest {@Autowired ArticleMapper articleMapper; @Test openbare leegte whenRecordsInDatabase_shouldReturnArticleWithGivenId () {Article article = articleMapper.getArticle (1L); assertThat (artikel) .isNotNull (); assertThat (article.getId ()). isEqualTo (1L); assertThat (article.getAuthor ()). isEqualTo ("Baeldung"); assertThat (article.getTitle ()). isEqualTo ("Werken met MyBatis in het voorjaar"); }}

In het bovenstaande voorbeeld hebben we MyBatis gebruikt om het enige record op te halen dat we eerder in ons data.sql het dossier.

3.2. XML-gebaseerde configuratie

Zoals eerder beschreven, hebben we nodig om MyBatis met Spring te gebruiken Databron, SqlSessionFactory, en ten minste één mapper.

Laten we de vereiste bean-definities maken in het bonen.xml configuratiebestand:

In dit voorbeeld hebben we ook het aangepaste XML-schema van spring-jdbc om onze H2-gegevensbron te configureren.

Om deze configuratie te testen, kunnen we de eerder geïmplementeerde testklasse hergebruiken. We moeten echter de contextconfiguratie aanpassen, wat we kunnen doen door de annotatie toe te passen:

@ContextConfiguration (locations = "classpath: /beans.xml")

4. Veerboot

Spring Boot biedt mechanismen die de configuratie van MyBatis met Spring nog meer vereenvoudigen.

Laten we eerst het mybatis-spring-boot-starter afhankelijkheid van onze pom.xml:

 org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 

Als we een automatische configuratiefunctie gebruiken, Spring Boot detecteert de H2-afhankelijkheid van ons klassenpad en configureert beide Databron en SqlSessionFactory voor ons. Bovendien voert het ook beide uit schema.sql en data.sql bij het opstarten.

Als we geen ingesloten database gebruiken, kunnen we configuratie gebruiken via een application.yml of application.properties bestand of definieer een Databron bean wijst naar onze database.

Het enige dat we nog moeten doen, is een mapper-interface definiëren, op dezelfde manier als hiervoor, en deze annoteren met de @Mapper annotatie van MyBatis. Als gevolg hiervan scant Spring Boot ons project, op zoek naar die annotatie, en registreert onze mappers als bonen.

Daarna kunnen we onze configuratie testen met behulp van de eerder gedefinieerde testklasse door annotaties toe te passen van spring-boot-starter-test:

@RunWith (SpringRunner.class) @SpringBootTest

5. Conclusie

In dit artikel hebben we verschillende manieren onderzocht om MyBatis met Spring te configureren.

We keken naar voorbeelden van het gebruik van op annotaties gebaseerde en XML-configuratie en toonden de autoconfiguratiefuncties van MyBatis met Spring Boot.

Zoals altijd is de volledige code die in dit artikel wordt gebruikt, beschikbaar op GitHub.

Persistentie onderaan

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS