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 .