package example;

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class SpringConfig {
    @Bean public DataSource dataSource() { return Factories.dataSource(); }
    @Bean public TracePlugin tracePlugin() { return new TracePlugin(); }
    @Bean public SqlSessionFactory sqlSessionFactory(DataSource source, TracePlugin trace) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(source);
        factory.setMapperLocations(new ClassPathResource("example/OrderMapper.xml"));
        factory.setPlugins(trace);
        return factory.getObject();
    }
    @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory factory) {
        return new SqlSessionTemplate(factory);
    }
    @Bean public OrderMapper orderMapper(SqlSessionTemplate template) {
        return template.getMapper(OrderMapper.class);
    }
    @Bean public JdbcTransactionManager transactionManager(DataSource source) {
        return new JdbcTransactionManager(source);
    }
    @Bean public OrderService orderService(OrderMapper mapper) { return new OrderService(mapper); }
}
