在 Spring 中使用 MyBatis
1. 介绍
MyBatis 是 Java 应用中实现 SQL 数据库访问最常用的开源框架之一。
本文中,我们将介绍如何将 MyBatis 与 Spring 和 Spring Boot 集成。
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 文件,插入一条记录到 articles
表格中:
INSERT INTO ARTICLES
VALUES (1, 'Working with MyBatis in Spring', 'Baeldung');
两个 SQL 文件都必需包含在 classpath 中。
3. Spring 配置
要使用 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 嵌入式数据库以简化设置以及 spring-jdbc 模块 EmbeddedDatabaseBuilder
类的配置:
<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
和至少一个 mapper。
首先,我们来创建一个配置类:
@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();
}
}
我们还应用了 MyBatis-Spring 的 @MapperScan
注释,该注释扫描已定义的包,并使用任何映射器注释(如 @Select
或 @Delete`
)自动拾取接口。
使用 @MapperScan
还可以确保提供的每个映射器(mapper)都自动注册为 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("Baeldung");
assertThat(article.getTitle()).isEqualTo("Working with MyBatis in Spring");
}
}
上例中,我们使用 MyBatis 来检索此前在 data.sql 中插入的唯一一条数据。
3.2. 基于 XML 的配置
如前所述,要在 Spring 中使用 MyBatis,我们需要 Datasource
、SqlSessionFactory
以及至少一个 mapper。
让我们在 beans.xml
配置文件中创建必需的 bean 定义:
<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.baeldung.mybatis.ArticleMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
本例中,我们还使用 spring jdbc 提供的自定义 XML schema 来配置我们的 H2 数据源。
为了测试此配置,我们可以重用之前实现的测试类。但是,我们必须调整上下文配置,这可以通过应用注释来实现:
@ContextConfiguration(locations = "classpath:/beans.xml")
4. Spring Boot
Spring Boot 提供的机制进一步简化了在 Spring 中使用 MyBatis 的配置。
首先,让我们将 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 会从类路径(classpath)中检测 H2 依赖关系,并为我们配置 Datasource
和 SqlSessionFactory
。此外,它还在启动时执行 schema.sql 和 data.sql。
如果我们不使用嵌入式数据库,我们可以通过 application.yml
或 application.properties
文件或者定义一个指向我们数据库的数据源 bean,来使用配置。
我们唯一要做的就是,像之前一样,定义一个映射器接口,并用 MyBatis 的 @mapper
注释对其进行注释。因此,Spring Boot 会扫描我们的项目,寻找该注释,并将我们的映射器注册为 bean。
之后,我们可以通过应用 spring boot starter 测试中的注释,使用之前定义的测试类来测试我们的配置:
@RunWith(SpringRunner.class)
@SpringBootTest
5. 结论
在本文中,我们探讨了使用 Spring 配置 MyBatis 的多种方法。
我们查看了使用基于注释和 XML 配置的示例,并展示了 MyBatis 与 Spring Boot 的自动配置功能。