Spring Boot Starter for MyBatis integration providing auto-configuration and dependency management
—
The MyBatis Spring Boot Starter provides several extension points for advanced customization of MyBatis configuration beyond what's available through properties. These customization interfaces allow programmatic control over the auto-configuration process.
Functional interface for customizing the MyBatis Configuration object during auto-configuration.
/**
* Callback interface for customizing MyBatis Configuration objects
* generated during auto-configuration
*/
@FunctionalInterface
public interface ConfigurationCustomizer {
/**
* Customize the given MyBatis Configuration object
* @param configuration the Configuration object to customize
*/
void customize(Configuration configuration);
}Usage Examples:
@Configuration
public class MyBatisCustomization {
@Bean
public ConfigurationCustomizer mybatisConfigurationCustomizer() {
return configuration -> {
// Add custom type handlers
configuration.getTypeHandlerRegistry().register(LocalDateTime.class, LocalDateTimeTypeHandler.class);
// Configure custom object factory
configuration.setObjectFactory(new CustomObjectFactory());
// Add interceptors/plugins
configuration.addInterceptor(new CustomInterceptor());
// Configure custom result handler
configuration.getResultMaps().forEach(resultMap -> {
// Custom result map modifications
});
// Enable specific MyBatis features
configuration.setCallSettersOnNulls(true);
configuration.setMapUnderscoreToCamelCase(true);
};
}
// You can define multiple customizers - they will all be applied
@Bean
public ConfigurationCustomizer loggingCustomizer() {
return configuration -> {
configuration.setLogImpl(StdOutImpl.class);
};
}
}Functional interface for customizing the SqlSessionFactoryBean before the SqlSessionFactory is created.
/**
* Callback interface for customizing SqlSessionFactoryBean objects
* generated during auto-configuration
*/
@FunctionalInterface
public interface SqlSessionFactoryBeanCustomizer {
/**
* Customize the given SqlSessionFactoryBean object
* @param factoryBean the SqlSessionFactoryBean to customize
*/
void customize(SqlSessionFactoryBean factoryBean);
}Usage Examples:
@Configuration
public class SqlSessionFactoryCustomization {
@Bean
public SqlSessionFactoryBeanCustomizer sqlSessionFactoryBeanCustomizer() {
return factoryBean -> {
// Set custom VFS implementation
factoryBean.setVfs(MyCustomVFS.class);
// Add custom plugins/interceptors
factoryBean.setPlugins(new Interceptor[]{
new PaginationInterceptor(),
new AuditInterceptor()
});
// Set custom database ID provider
factoryBean.setDatabaseIdProvider(new CustomDatabaseIdProvider());
// Configure custom cache
factoryBean.setCache(new CustomCache());
// Set custom object wrapper factory
factoryBean.setObjectWrapperFactory(new CustomObjectWrapperFactory());
};
}
@Bean
public SqlSessionFactoryBeanCustomizer typeHandlerCustomizer(
@Autowired List<TypeHandler<?>> typeHandlers) {
return factoryBean -> {
if (!typeHandlers.isEmpty()) {
factoryBean.setTypeHandlers(typeHandlers.toArray(new TypeHandler[0]));
}
};
}
}The starter provides a custom VFS implementation optimized for Spring Boot environments.
/**
* Spring Boot compatible VFS implementation for MyBatis
*/
public class SpringBootVFS extends VFS {
/** Default constructor */
public SpringBootVFS();
/** Always returns true - this VFS is always valid in Spring Boot */
@Override
public boolean isValid();
/**
* Set the charset for decoding URL strings
* @param charset the charset for URL decoding
*/
public static void setUrlDecodingCharset(Charset charset);
/**
* Set the supplier for providing ClassLoader to be used
* @param supplier the ClassLoader supplier
*/
public static void setClassLoaderSupplier(Supplier<ClassLoader> supplier);
/** Lists resources at the given URL and path */
@Override
protected List<String> list(URL url, String path) throws IOException;
}Usage Examples:
@Configuration
public class VFSCustomization {
@PostConstruct
public void configureVFS() {
// Customize URL decoding charset
SpringBootVFS.setUrlDecodingCharset(StandardCharsets.UTF_8);
// Customize ClassLoader supplier
SpringBootVFS.setClassLoaderSupplier(() -> Thread.currentThread().getContextClassLoader());
}
}You can define multiple customizers that will all be applied in the order they are discovered:
@Configuration
public class ComprehensiveMyBatisCustomization {
@Bean
@Order(1)
public ConfigurationCustomizer coreConfigurationCustomizer() {
return configuration -> {
// Core settings
configuration.setMapUnderscoreToCamelCase(true);
configuration.setCallSettersOnNulls(true);
};
}
@Bean
@Order(2)
public ConfigurationCustomizer typeHandlerCustomizer() {
return configuration -> {
// Type handlers
configuration.getTypeHandlerRegistry().register(LocalDateTime.class, LocalDateTimeTypeHandler.class);
configuration.getTypeHandlerRegistry().register(Instant.class, InstantTypeHandler.class);
};
}
@Bean
@Order(3)
public ConfigurationCustomizer interceptorCustomizer() {
return configuration -> {
// Interceptors
configuration.addInterceptor(new PerformanceInterceptor());
configuration.addInterceptor(new LoggingInterceptor());
};
}
}Apply customizations based on environment or configuration:
@Configuration
public class ConditionalMyBatisCustomization {
@Bean
@ConditionalOnProperty(name = "mybatis.performance.monitoring.enabled", havingValue = "true")
public ConfigurationCustomizer performanceMonitoringCustomizer() {
return configuration -> {
configuration.addInterceptor(new PerformanceMonitoringInterceptor());
};
}
@Bean
@ConditionalOnProperty(name = "mybatis.sql.logging.enabled", havingValue = "true")
public ConfigurationCustomizer sqlLoggingCustomizer() {
return configuration -> {
configuration.setLogImpl(StdOutImpl.class);
};
}
@Bean
@Profile("dev")
public ConfigurationCustomizer developmentCustomizer() {
return configuration -> {
configuration.addInterceptor(new SqlPrintInterceptor());
configuration.setCacheEnabled(false);
};
}
}Customize MyBatis to work with other libraries:
@Configuration
public class IntegrationCustomization {
@Bean
public ConfigurationCustomizer jacksonCustomizer(ObjectMapper objectMapper) {
return configuration -> {
// Configure JSON type handler using Jackson
configuration.getTypeHandlerRegistry().register(JsonTypeHandler.class);
};
}
@Bean
public SqlSessionFactoryBeanCustomizer springSecurityCustomizer() {
return factoryBean -> {
// Add security-aware interceptor
factoryBean.setPlugins(new Interceptor[]{
new SecurityContextInterceptor()
});
};
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-mybatis-spring-boot--mybatis-spring-boot-starter