Skip to content

Quick Start

Kazuki Shimizu edited this page Dec 7, 2022 · 7 revisions

Let's try mybatis-thymeleaf quickly using the Spring Boot! Basically, Please see the mybatis-spring-boot-starter's Quick Start on GitHub wiki page. In this page, we introduce usage in three JVM based language.

Common

Add dependency and repository on Maven project file

Add mybatis-thymeleaf into dependency on pom.xml.

<dependencies>
  <dependency>
    <groupId>org.mybatis.scripting</groupId>
    <artifactId>mybatis-thymeleaf</artifactId>
    <version>1.0.4</version>
  </dependency>
</dependencies>

Configure Spring Boot configuration

Configure to use mybatis-thymeleaf feature in configuration properties file(src/main/resources/application.properties).

# Enable mybatis-thymeleaf feature
mybatis.configuration.default-scripting-language=org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriver

# Workaround for https://github.com/spring-projects/spring-boot/issues/16079
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration

Java

Create a mapper interface

src/main/java/com/example/mybatissample/CityMapper.java

package com.example.mybatissample;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface CityMapper {

  @Insert({
    "INSERT INTO city (name, state, country) VALUES(",
      "/*[# mb:p='name']*/ 'Name' /*[/]*/,",
      "/*[# mb:p='state']*/ 'State' /*[/]*/,",
      "/*[# mb:p='country']*/ 'country' /*[/]*/,",
    ")"
  })
  @Options(useGeneratedKeys = true, keyProperty = "id")
  void insert(City city);

  @Select({
    "SELECT id, name, state, country FROM city",
    "WHERE id = /*[# mb:p='id']*/ 1 /*[/]*/"
  })
  City findById(long id);

}

Kotlin

Create a project

$ curl -s https://start.spring.io/starter.tgz\
       -d name=mybatis-sample\
       -d artifactId=mybatis-sample\
       -d dependencies=mybatis,h2\
       -d baseDir=mybatis-sample\
       -d language=kotlin\
       | tar -xzvf -

Create a domain class

src/main/kotlin/com/example/mybatissample/City.kt

package com.example.mybatissample

class City {
  var id: Long = 0
  var name: String? = null
  var state: String? = null
  var country: String? = null

  override fun toString(): String = """${id},${name},${state},${country}"""
}

Create a mapper interface

src/main/kotlin/com/example/mybatissample/CityMapper.kt

package com.example.mybatissample

import org.apache.ibatis.annotations.Insert
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Options
import org.apache.ibatis.annotations.Select

@Mapper
interface CityMapper {

  @Insert("""
    INSERT INTO city (name, state, country) VALUES(
      /*[# mb:p="name"]*/ 'Name' /*[/]*/,
      /*[# mb:p="state"]*/ 'State' /*[/]*/,
      /*[# mb:p="country"]*/ 'Country' /*[/]*/
    )
  """)
  @Options(useGeneratedKeys = true, keyProperty = "id")
  fun insert(city: City)

  @Select("""
    SELECT id, name, state, country FROM city
    WHERE id = /*[# mb:p="id"]*/ 1 /*[/]*/
  """)
  fun findById(id: Long): City

}

Modify a spring boot application class

src/main/kotlin/com/example/mybatissample/MybatisSampleApplication.kt

package com.example.mybatissample

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean

@SpringBootApplication
class MybatisSampleApplication {

  @Autowired
  lateinit var cityMapper: CityMapper

  @Bean
  fun sampleCommandLineRunner(): CommandLineRunner = CommandLineRunner {
    val city = City()
    city.name = "San Francisco"
    city.state = "CA"
    city.country = "US"
    cityMapper.insert(city)
    System.out.println(this.cityMapper.findById(city.id))
  }

}

fun main(args: Array<String>) {
  runApplication<MybatisSampleApplication>(*args)
}

Modify a spring boot application test class

src/test/kotlin/com/example/mybatissample/MybatisSampleApplicationTests.kt

package com.example.mybatissample

import org.hamcrest.Matchers.containsString
import org.junit.ClassRule
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.rule.OutputCapture
import org.springframework.test.context.junit4.SpringRunner

@RunWith(SpringRunner::class)
@SpringBootTest
class MybatisSampleApplicationTests {

  companion object {
    @ClassRule
    @JvmField
    val out = OutputCapture()
  }

  @Test
  fun contextLoads() {
    out.expect(containsString("1,San Francisco,CA,US"))
  }

}

Groovy

Create a project

$ curl -s https://start.spring.io/starter.tgz\
       -d name=mybatis-sample\
       -d artifactId=mybatis-sample\
       -d dependencies=mybatis,h2\
       -d baseDir=mybatis-sample\
       -d language=groovy\
       | tar -xzvf -

Create a domain class

src/main/groovy/com/example/mybatissample/City.groovy

package com.example.mybatissample

class City {
  Long id
  String name
  String state
  String country
  
  @Override
  String toString() {
    """${id},${name},${state},${country}"""
  }
}

Create a mapper interface

src/main/groovy/com/example/mybatissample/CityMapper.groovy

package com.example.mybatissample

import org.apache.ibatis.annotations.Insert
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Options
import org.apache.ibatis.annotations.Select

@Mapper
interface CityMapper {

  @Insert('''
    INSERT INTO city (name, state, country) VALUES(
      /*[# mb:p="name"]*/ 'Name' /*[/]*/,
      /*[# mb:p="state"]*/ 'State' /*[/]*/,
      /*[# mb:p="country"]*/ 'Country' /*[/]*/
    )
  ''')
  @Options(useGeneratedKeys = true, keyProperty = "id")
  void insert(City city)
  
  @Select('''
    SELECT id, name, state, country FROM city
    WHERE id = /*[# mb:p="id"]*/ 1 /*[/]*/
  ''')
  City findById(long id)
  
}

Modify a spring boot application class

src/main/groovy/com/example/mybatissample/MybatisSampleApplication.groovy

package com.example.mybatissample

import org.springframework.boot.CommandLineRunner
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.Bean

@SpringBootApplication
class MybatisSampleApplication {
  
  static void main(String[] args) {
    SpringApplication.run(MybatisSampleApplication, args)
  }
  
  @Bean
  CommandLineRunner sampleCommandLineRunner(CityMapper cityMapper) {
    new SampleCommandLineRunner(cityMapper)
  }
  
  static class SampleCommandLineRunner implements CommandLineRunner {
    private final CityMapper cityMapper;
    
    SampleCommandLineRunner(CityMapper cityMapper) {
      this.cityMapper = cityMapper;
    }
    
    @Override
    void run(String... args) {
      def city = new City(name: "San Francisco", state: "CA", country: "US")
      cityMapper.insert(city)
      println this.cityMapper.findById(city.getId())
    }

  }
  
}

Modify a spring boot application test class

src/test/groovy/com/example/mybatissample/MybatisSampleApplicationTests.groovy

package com.example.mybatissample

import org.junit.ClassRule
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.rule.OutputCapture
import org.springframework.test.context.junit4.SpringRunner

import static org.hamcrest.Matchers.containsString

@RunWith(SpringRunner)
@SpringBootTest
class MybatisSampleApplicationTests {
  
  @ClassRule
  public static OutputCapture out = new OutputCapture()
  
  @Test
  void contextLoads() {
    out.expect(containsString("1,San Francisco,CA,US"))
  }
  
}