MyBatis con Spring

Top de persistencia

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO

1. Introducción

MyBatis es uno de los frameworks de código abierto más utilizados para implementar el acceso a bases de datos SQL en aplicaciones Java.

En este tutorial rápido, presentaremos cómo integrar MyBatis con Spring y Spring Boot.

Para aquellos que aún no están familiarizados con este marco, asegúrese de consultar nuestro artículo sobre cómo trabajar con MyBatis.

2. Definición del modelo

Comencemos por definir un POJO simple que usaremos a lo largo de nuestro artículo:

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

Y un archivo equivalente SQL schema.sql :

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

A continuación, creemos un archivo data.sql , que simplemente inserta un registro en nuestra tabla de artículos :

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

Ambos archivos SQL deben incluirse en la ruta de clases.

3. Configuración de primavera

Para comenzar a usar MyBatis, tenemos que incluir dos dependencias principales: MyBatis y MyBatis-Spring:

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

Aparte de eso, necesitaremos dependencias básicas de Spring:

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

En nuestros ejemplos, usaremos la base de datos incorporada H2 para simplificar la configuración y la clase EmbeddedDatabaseBuilder del módulo spring-jdbc para la configuración:

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

3.1. Configuración basada en anotaciones

Spring simplifica la configuración de MyBatis. Los únicos elementos requeridos son javax.sql.Datasource , org.apache.ibatis.session.SqlSessionFactory y al menos un asignador.

Primero, creemos una clase de configuración:

@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(); } }

También aplicamos una anotación @MapperScan de MyBatis-Spring que escanea paquetes definidos y automáticamente capta interfaces usando cualquiera de las anotaciones del mapeador, como @Select o @Delete.

El uso de @MapperScan también garantiza que cada asignador proporcionado se registre automáticamente como un Bean y se pueda usar más tarde con la anotación @Autowired .

Ahora podemos crear una interfaz de ArticleMapper simple :

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

Y finalmente, prueba nuestra configuración:

@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"); } }

En el ejemplo anterior, usamos MyBatis para recuperar el único registro que insertamos previamente en nuestro archivo data.sql .

3.2. Configuración basada en XML

Como se describió anteriormente, para usar MyBatis con Spring, necesitamos origen de datos , SqlSessionFactory , y al menos un asignador.

Creemos las definiciones de bean requeridas en el archivo de configuración beans.xml :

En este ejemplo, también usamos el esquema XML personalizado proporcionado por spring-jdbc para configurar nuestra fuente de datos H2.

Para probar esta configuración, podemos reutilizar la clase de prueba implementada previamente. Sin embargo, tenemos que ajustar la configuración del contexto, lo que podemos hacer aplicando la anotación:

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

4. Spring Boot

Spring Boot proporciona mecanismos que simplifican aún más la configuración de MyBatis con Spring.

Primero, agreguemos la dependencia mybatis-spring-boot-starter a nuestro pom.xml :

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

Por defecto, si utilizamos una característica de configuración automática, la primavera de arranque detecta la dependencia de H2 a partir de nuestra ruta de clase y configura tanto del origen de datos y SqlSessionFactory para nosotros. Además, también ejecuta tanto schema.sql como data.sql al inicio.

Si no usamos una base de datos incrustada, podemos usar la configuración a través de un archivo application.yml o application.properties o definir un bean de origen de datos que apunte a nuestra base de datos.

Lo único que nos queda por hacer es definir una interfaz de mapeador, de la misma manera que antes, y anotarla con la anotación @Mapper de MyBatis. Como resultado, Spring Boot escanea nuestro proyecto, busca esa anotación y registra nuestros mapeadores como beans.

Después de eso, podemos probar nuestra configuración usando la clase de prueba previamente definida aplicando anotaciones de spring-boot-starter-test :

@RunWith(SpringRunner.class) @SpringBootTest

5. Conclusión

En este artículo, exploramos varias formas de configurar MyBatis con Spring.

Observamos ejemplos de uso de configuración XML y basada en anotaciones y mostramos las funciones de configuración automática de MyBatis con Spring Boot.

Como siempre, el código completo utilizado en este artículo está disponible en GitHub.

Fondo de persistencia

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO