package com.github.yingzhuo.spring.auto.mybatis; import org.apache.ibatis.session.ExecutorType; import org.mybatis.spring.MyBatisExceptionTranslator; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; @Order(Ordered.HIGHEST_PRECEDENCE) @EnableConfigurationProperties(ConfigBean.class) @ConditionalOnBean(DataSource.class) @ConditionalOnClass({SqlSessionTemplate.class, SqlSessionFactoryBean.class}) @ConditionalOnProperty(name = "spring.auto.mybatis.enabled", havingValue = "true", matchIfMissing = false) public class MyBatisConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger(MyBatisConfiguration.class); @Autowired private DataSource dataSource; @Autowired private ConfigBean configBean; /* -------------------------------------------------------------------------------------- */ public MyBatisConfiguration() { LOGGER.debug("spring-auto: '{}' enabled.", MyBatisConfiguration.class.getSimpleName()); } @Bean public SqlSessionFactoryBean sqlSessionFactory() throws Throwable { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setConfigLocation(configBean.getConfigLocation()); bean.setFailFast(configBean.isFailFast()); return bean; } @Bean public SqlSessionTemplate sqlSessionTemplate() throws Throwable { SqlSessionTemplate bean; if (configBean.isUseExceptionTranslator()) { bean = new SqlSessionTemplate( sqlSessionFactory().getObject(), ExecutorType.valueOf(configBean.getExecutorType()), new MyBatisExceptionTranslator(dataSource, true) ); } else { bean = new SqlSessionTemplate( sqlSessionFactory().getObject(), ExecutorType.valueOf(configBean.getExecutorType()) ); } return bean; } @Bean(name = "transactionManager") @ConditionalOnMissingBean(PlatformTransactionManager.class) @ConditionalOnProperty(name = "spring.auto.mybatis.config-transaction-manager", havingValue = "transactionManager", matchIfMissing = false) public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource); } }