Sample Code

NOTE See JPetstore 6 demo to know about how to use Spring with a full web application server. .

You can check out sample code from the MyBatis-Spring repo:

Any of the samples can be run with JUnit 4.

The sample code shows a typical design where a transactional service gets domain objects from a data access layer. acts as the service:

public class FooService {

  private UserMapper userMapper;

  public void setUserMapper(UserMapper userMapper) {
    this.userMapper = userMapper;

  public User doSomeBusinessStuff(String userId) {
    return this.userMapper.getUser(userId);


It is a transactional bean, so a transaction is started when any of its methods is called and committed when the method ends without throwing an unchecked exception. Notice that transactional behaviour is configured with the @Transactional attribute. This is not required; any other way provided by Spring can be used to demarcate your transactions.

This service calls a data access layer built with MyBatis. This layer consists on a just an interface that will be used with a dynamic proxy built by MyBatis at runtime and injected into the service by Spring.

public interface UserMapper {

  User getUser(String userId);


Note that, for the sake of simplicity we used the interface for the DAO scenario where a DAO is built with an interface and a implementation though in this case it would have been more adequate to use an interface called instead.

We will see different ways to find the mapper interface, register it to Spring and inject it into the service bean:

Sample test Description Shows you the base configuration based on a MapperFactoryBean that will dynamically build an implementation for UserMapper Shows how to use the MapperScannerConfigurer so all the mappers in a project are autodiscovered. Shows how to hand code a DAO using a Spring managed SqlSession and providing your own implementation Shows how to use Spring's @Configuration to create MyBatis beans manually.
SampleEnableTest Shows how to use Spring's @Configuration with the @MapperScann annotation so mappers are autodiscovered.
SampleNamespaceTest Shows how to use the custom MyBatis XML namespace.

Please take a look at the different applicationContext.xml files to see MyBatis-Spring in action.