diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml
new file mode 100644
index 0000000000..ecdcd1d923
--- /dev/null
+++ b/persistence-modules/spring-mybatis/pom.xml
@@ -0,0 +1,113 @@
+
+ 4.0.0
+ com.baeldung
+ spring-mybatis
+ 0.1-SNAPSHOT
+ spring-mybatis
+
+
+ com.baeldung
+ parent-boot-2
+ 1.0.0-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+
+
+
+ org.springframework
+ spring-context
+ ${org.springframework.version}
+
+
+
+ org.springframework
+ spring-beans
+ ${org.springframework.version}
+
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+
+
+
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+ org.springframework
+ spring-jdbc
+ ${org.springframework.version}
+
+
+
+ org.mybatis
+ mybatis
+ ${mybatis.version}
+
+
+
+ org.mybatis
+ mybatis-spring
+ ${spring-mybatis.version}
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+ org.springframework
+ spring-test
+ ${org.springframework.version}
+ test
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+
+ spring-mybatis
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 5.1.8.RELEASE
+
+
+ 2.0.2
+ 3.5.2
+ 2.1.0
+ 1.4.197
+
+
+ 3.8.0
+
+
+
+
diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java
new file mode 100644
index 0000000000..90e4ce6170
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/Article.java
@@ -0,0 +1,19 @@
+package com.baeldung.mybatis.spring;
+
+public class Article {
+ private Long id;
+ private String title;
+ private String author;
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+}
diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java
new file mode 100644
index 0000000000..db5b3675f4
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/ArticleMapper.java
@@ -0,0 +1,11 @@
+package com.baeldung.mybatis.spring;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface ArticleMapper {
+ @Select("SELECT * FROM ARTICLES WHERE id = #{id}")
+ Article getArticle(@Param("id") Long id);
+}
diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java
new file mode 100644
index 0000000000..72f754c01d
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceAutoConfig.java
@@ -0,0 +1,14 @@
+package com.baeldung.mybatis.spring;
+
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.FilterType;
+
+@SpringBootConfiguration
+@EnableAutoConfiguration
+@ComponentScan(basePackages = { "com.baeldung.mybatis" }, excludeFilters = {
+ @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = { PersistenceConfig.class })
+})
+public class PersistenceAutoConfig {
+}
diff --git a/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java
new file mode 100644
index 0000000000..f02e04e5a1
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/java/com/baeldung/mybatis/spring/PersistenceConfig.java
@@ -0,0 +1,37 @@
+package com.baeldung.mybatis.spring;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan("com.baeldung.mybatis")
+@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class })
+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();
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-mybatis/src/main/resources/beans.xml b/persistence-modules/spring-mybatis/src/main/resources/beans.xml
new file mode 100644
index 0000000000..6ed82b7934
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/resources/beans.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-mybatis/src/main/resources/data.sql b/persistence-modules/spring-mybatis/src/main/resources/data.sql
new file mode 100644
index 0000000000..86203bf561
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/resources/data.sql
@@ -0,0 +1,3 @@
+TRUNCATE TABLE ARTICLES;
+INSERT INTO ARTICLES
+VALUES (1, 'Working with MyBatis in Spring', 'Baeldung');
\ No newline at end of file
diff --git a/persistence-modules/spring-mybatis/src/main/resources/schema.sql b/persistence-modules/spring-mybatis/src/main/resources/schema.sql
new file mode 100644
index 0000000000..807e1ec624
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/main/resources/schema.sql
@@ -0,0 +1,6 @@
+CREATE TABLE IF NOT EXISTS `ARTICLES`
+(
+ `id` INTEGER PRIMARY KEY,
+ `title` VARCHAR(100) NOT NULL,
+ `author` VARCHAR(100) NOT NULL
+);
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java
new file mode 100644
index 0000000000..531356ffa2
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java
@@ -0,0 +1,13 @@
+package com.baeldung.mybatis.spring;
+
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ContextConfiguration(classes = PersistenceAutoConfig.class)
+public class ArticleMapperBootIntegrationTest extends ArticleMapperCommonTest {
+
+}
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java
new file mode 100644
index 0000000000..33071dc0c1
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.mybatis.spring;
+
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ArticleMapperCommonTest {
+
+ @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");
+ }
+}
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java
new file mode 100644
index 0000000000..9298714cb2
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java
@@ -0,0 +1,11 @@
+package com.baeldung.mybatis.spring;
+
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = PersistenceConfig.class)
+public class ArticleMapperIntegrationTest extends ArticleMapperCommonTest {
+
+}
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java
new file mode 100644
index 0000000000..de8974d4ad
--- /dev/null
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java
@@ -0,0 +1,11 @@
+package com.baeldung.mybatis.spring;
+
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = "classpath:/beans.xml")
+public class ArticleMapperXMLIntegrationTest extends ArticleMapperCommonTest {
+
+}
diff --git a/pom.xml b/pom.xml
index aabede4f3a..d095e8a7bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -879,6 +879,7 @@
spring-freemarker
persistence-modules/spring-hibernate-3
persistence-modules/spring-hibernate4
+ persistence-modules/spring-mybatis
spring-integration
spring-jenkins-pipeline
spring-jersey