MyBatis con la primavera

Persistenza in alto

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Introduzione

MyBatis è uno dei framework open source più comunemente usati per implementare l'accesso ai database SQL nelle applicazioni Java.

In questo rapido tutorial, presenteremo come integrare MyBatis con Spring e Spring Boot.

Per coloro che non hanno ancora familiarità con questo framework, assicurati di controllare il nostro articolo su come lavorare con MyBatis.

2. Definizione del modello

Cominciamo definendo un semplice POJO che useremo in tutto il nostro articolo:

public class Article { private Long id; private String title; private String author; // constructor, standard getters and setters }

E un file SQL schema.sql equivalente :

CREATE TABLE IF NOT EXISTS `ARTICLES`( `id` INTEGER PRIMARY KEY, `title` VARCHAR(100) NOT NULL, `author` VARCHAR(100) NOT NULL );

Successivamente, creiamo un file data.sql , che inserisce semplicemente un record nella nostra tabella degli articoli :

INSERT INTO ARTICLES VALUES (1, 'Working with MyBatis in Spring', 'Baeldung');

Entrambi i file SQL devono essere inclusi nel classpath.

3. Spring Config

Per iniziare a utilizzare MyBatis, dobbiamo includere due dipendenze principali: MyBatis e MyBatis-Spring:

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

A parte questo, avremo bisogno delle dipendenze Spring di base:

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

Nei nostri esempi, useremo il database incorporato H2 per semplificare l'installazione e la classe EmbeddedDatabaseBuilder dal modulo spring-jdbc per la configurazione:

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

3.1. Configurazione basata sull'annotazione

Spring semplifica la configurazione di MyBatis. Gli unici elementi richiesti sono javax.sql.Datasource , org.apache.ibatis.session.SqlSessionFactory e almeno un mapper.

Per prima cosa, creiamo una classe di configurazione:

@Configuration @MapperScan("com.baeldung.mybatis") public class PersistenceConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("schema.sql") .addScript("data.sql") .build(); } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource()); return factoryBean.getObject(); } }

Abbiamo anche applicato un'annotazione @MapperScan da MyBatis-Spring che scansiona i pacchetti definiti e preleva automaticamente le interfacce utilizzando una qualsiasi delle annotazioni del mapper, come @Select o @Delete.

L'uso di @MapperScan garantisce inoltre che ogni mappatore fornito venga automaticamente registrato come Bean e possa essere successivamente utilizzato con l' annotazione @Autowired .

Ora possiamo creare una semplice interfaccia ArticleMapper :

public interface ArticleMapper { @Select("SELECT * FROM ARTICLES WHERE id = #{id}") Article getArticle(@Param("id") Long id); }

E infine, prova la nostra configurazione:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = PersistenceConfig.class) public class ArticleMapperIntegrationTest { @Autowired ArticleMapper articleMapper; @Test public void whenRecordsInDatabase_shouldReturnArticleWithGivenId() { Article article = articleMapper.getArticle(1L); assertThat(article).isNotNull(); assertThat(article.getId()).isEqualTo(1L); assertThat(article.getAuthor()).isEqualTo("Baeldung"); assertThat(article.getTitle()).isEqualTo("Working with MyBatis in Spring"); } }

Nell'esempio sopra, abbiamo utilizzato MyBatis per recuperare l'unico record che abbiamo inserito in precedenza nel nostro file data.sql .

3.2. Configurazione basata su XML

Come descritto in precedenza, per utilizzare MyBatis con Spring, abbiamo bisogno di Datasource , SqlSessionFactory e almeno un mapper.

Creiamo le definizioni bean richieste nel file di configurazione bean.xml :

In questo esempio, abbiamo utilizzato anche lo schema XML personalizzato fornito da spring-jdbc per configurare la nostra origine dati H2.

Per testare questa configurazione, possiamo riutilizzare la classe di test precedentemente implementata. Tuttavia, dobbiamo regolare la configurazione del contesto, cosa che possiamo fare applicando l'annotazione:

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

4. Spring Boot

Spring Boot fornisce meccanismi che semplificano ulteriormente la configurazione di MyBatis con Spring.

Per prima cosa, aggiungiamo la dipendenza mybatis-spring-boot-starter al nostro pom.xml :

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

Per impostazione predefinita, se utilizziamo una funzionalità di configurazione automatica, Spring Boot rileva la dipendenza H2 dal nostro percorso di classe e configura sia Datasource che SqlSessionFactory per noi. Inoltre, esegue anche schema.sql e data.sql all'avvio.

Se non utilizziamo un database incorporato, possiamo utilizzare la configurazione tramite un file application.yml o application.properties o definire un bean di origine dati che punta al nostro database.

L'unica cosa che ci resta da fare è definire un'interfaccia mapper, nello stesso modo di prima, e annotarlo con il @Mapper annotazione dal MyBatis. Di conseguenza, Spring Boot analizza il nostro progetto, cercando quell'annotazione e registra i nostri mappatori come bean.

Successivamente, possiamo testare la nostra configurazione utilizzando la classe di test definita in precedenza applicando le annotazioni da spring-boot-starter-test :

@RunWith(SpringRunner.class) @SpringBootTest

5. conclusione

In questo articolo, abbiamo esplorato diversi modi per configurare MyBatis con Spring.

Abbiamo esaminato esempi di utilizzo della configurazione basata su annotazioni e XML e mostrato le funzionalità di configurazione automatica di MyBatis con Spring Boot.

Come sempre, il codice completo utilizzato in questo articolo è disponibile su GitHub.

Fondo di persistenza

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO