Перейти к основному содержимому

MyBatis с весной

· 4 мин. чтения

1. Введение

MyBatis — одна из наиболее часто используемых платформ с открытым исходным кодом для реализации доступа к базам данных SQL в приложениях Java.

В этом кратком руководстве мы покажем, как интегрировать MyBatis с Spring и Spring Boot.

Для тех, кто еще не знаком с этим фреймворком, обязательно ознакомьтесь с нашей статьей о работе с MyBatis .

2. Определение модели

Давайте начнем с определения простого POJO, который мы будем использовать в нашей статье:

public class Article {
private Long id;
private String title;
private String author;

// constructor, standard getters and setters
}

И эквивалентный файл SQL schema.sql :

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

Далее создадим файл data.sql , который просто вставит одну запись в нашу таблицу article :

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

Оба файла SQL должны быть включены в путь к классам .

3. Весенняя конфигурация

Чтобы начать использовать MyBatis, мы должны включить две основные зависимости — MyBatis и MyBatis-Spring :

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>

Кроме того, нам понадобятся основные зависимости Spring :

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.8</version>
</dependency>

В наших примерах мы будем использовать встроенную базу данных H2 для упрощения настройки и класс EmbeddedDatabaseBuilder из модуля spring-jdbc для настройки:

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>

3.1. Конфигурация на основе аннотаций

Spring упрощает настройку MyBatis. Единственными обязательными элементами являются javax.sql.Datasource , org.apache.ibatis.session.SqlSessionFactory и по крайней мере один преобразователь.

Во-первых, давайте создадим класс конфигурации:

@Configuration
@MapperScan("com.foreach.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();
}
}

Мы также применили аннотацию @MapperScan от MyBatis-Spring, которая сканирует определенные пакеты и автоматически выбирает интерфейсы с помощью любой из аннотаций картографа, таких как @Select или @Delete.

Использование @MapperScan также гарантирует, что каждый предоставленный преобразователь автоматически регистрируется как Bean и может быть позже использован с аннотацией @Autowired .

Теперь мы можем создать простой интерфейс ArticleMapper :

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

И, наконец, протестируйте нашу установку:

@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("ForEach");
assertThat(article.getTitle()).isEqualTo("Working with MyBatis in Spring");
}
}

В приведенном выше примере мы использовали MyBatis для извлечения единственной записи, которую мы ранее вставили в наш файл data.sql .

3.2. Конфигурация на основе XML

Как описано ранее, для использования MyBatis с Spring нам нужен Datasource , SqlSessionFactory и по крайней мере один преобразователь.

Давайте создадим необходимые определения компонентов в файле конфигурации beans.xml :

<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="schema.sql"/>
<jdbc:script location="data.sql"/>
</jdbc:embedded-database>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="articleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.foreach.mybatis.ArticleMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

В этом примере мы также использовали пользовательскую схему XML, предоставленную spring-jdbc , для настройки нашего источника данных H2.

Чтобы протестировать эту конфигурацию, мы можем повторно использовать ранее реализованный тестовый класс. Однако нам нужно настроить конфигурацию контекста, что мы можем сделать, применив аннотацию:

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

4. Весенний ботинок

Spring Boot предоставляет механизмы, которые еще больше упрощают настройку MyBatis с помощью Spring.

Во-первых, давайте добавим зависимость mybatis -spring-boot-starter в наш pom.xml : ``

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>

По умолчанию, если мы используем функцию автоматической настройки, Spring Boot обнаруживает зависимость H2 от нашего пути к классам и настраивает для нас как Datasource , так и SqlSessionFactory . Кроме того, он также выполняет при запуске как schema.sql , так и data.sql .

Если мы не используем встроенную базу данных, мы можем использовать конфигурацию через файл application.yml или application.properties или определить bean -компонент источника данных, указывающий на нашу базу данных.

Единственное, что нам осталось сделать, это определить интерфейс картографа так же, как и раньше, и аннотировать его аннотацией @Mapper из MyBatis. В результате Spring Boot сканирует наш проект в поисках этой аннотации и регистрирует наши преобразователи как bean-компоненты.

После этого мы можем протестировать нашу конфигурацию, используя ранее определенный тестовый класс, применив аннотации из spring-boot-starter-test :

@RunWith(SpringRunner.class)
@SpringBootTest

5. Вывод

В этой статье мы рассмотрели несколько способов настройки MyBatis с помощью Spring.

Мы рассмотрели примеры использования конфигурации на основе аннотаций и XML и продемонстрировали функции автоматической настройки MyBatis с Spring Boot.

Как всегда, полный код, использованный в этой статье, доступен на GitHub .