CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-mybatis-spring-boot--mybatis-spring-boot-starter

Spring Boot Starter for MyBatis integration providing auto-configuration and dependency management

Pending
Overview
Eval results
Files

customization.mddocs/

Customization

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.

Capabilities

ConfigurationCustomizer

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);
        };
    }
}

SqlSessionFactoryBeanCustomizer

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]));
            }
        };
    }
}

Custom Spring Boot VFS

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());
    }
}

Advanced Customization Patterns

Combining Multiple Customizers

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());
        };
    }
}

Conditional Customization

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);
        };
    }
}

Integration with External Libraries

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

docs

auto-configuration.md

configuration-properties.md

customization.md

index.md

testing-support.md

tile.json