package com.hy.datasource;

    import com.alibaba.druid.pool.DruidDataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import tk.mybatis.mapper.autoconfigure.SpringBootVFS;
    import tk.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;

    import javax.sql.DataSource;

    /

    MapperScan是tk.mybatis.spring.annotation.MapperScan
    扫包扫到自定义BaseMapper会报错
    解决方法,1:不扫包,自己的Mapper上加@Mapper注解(个人推荐)
    2:把自定义BaseMapper放到扫包路径外 (一般做法)
    3:配置markerInterface,(个人选择)
    @author
    @date 2019.1.22
    */
    @Configuration
    @EnableTransactionManagement
    @MapperScan(basePackages = DataSouceConfig.PACKAGE, sqlSessionFactoryRef = “sessionFactory”) /, markerInterface=com.hy.base.dao.BaseDao.class/
    public class DataSouceConfig {
    public static final String PACKAGE = “com.hy.dao”;
    //这里不可以是”com.hy.dao.“,否则多数据源失效,始终是第1个数据源**
    public static final String MAPPER = “classpath
    :com/hy/mapper/*/.xml”;
    public static final String TYPEALIASESPACKAGE = “com.hy.model”;

    1. /**<br /> * 定义数据源<br /> * 注意@Primary注解表示:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常<br /> *<br /> * @return<br /> * @throws Exception<br /> */<br /> @Bean(name = "dataSource")<br /> @Primary<br /> @ConfigurationProperties(prefix = "jdbc.ds")<br /> //@Override<br /> public DataSource dataSource() throws Exception {<br /> DruidDataSource datasource = new DruidDataSource();<br /> //setMultiStatementAllow 允许多sql<br /> /*WallConfig wallConfig = new WallConfig();<br /> wallConfig.setMultiStatementAllow(true);<br /> WallFilter wallFilter = new WallFilter();<br /> wallFilter.setConfig(wallConfig);<br /> List<Filter> filters2 = new ArrayList();<br /> filters2.add(wallFilter);<br /> datasource.setProxyFilters(filters2);*/<br /> return datasource;<br /> }
    2. /**<br /> * 定义session工厂<br /> * 注:ualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,<br /> * 我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一!<br /> *<br /> * @param dataSource<br /> * @return<br /> * @throws Exception<br /> */<br /> @Bean(name = "sessionFactory")<br /> @Primary<br /> //@Override<br /> public SqlSessionFactory sessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {<br /> SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();<br /> sessionFactory.setDataSource(dataSource);
    3. PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();<br /> sessionFactory.setVfs(SpringBootVFS.class); // 关键,将vfs设置为SpringBootVFS<br /> sessionFactory.setTypeAliasesPackage(TYPEALIASESPACKAGE);<br /> sessionFactory.setMapperLocations(resolver.getResources(DataSouceConfig.MAPPER));<br /> org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();<br /> configuration.setMapUnderscoreToCamelCase(true);<br /> sessionFactory.setConfiguration(configuration);<br /> return sessionFactory.getObject();<br /> }
    4. /**<br /> * 定义事务管理器<br /> *<br /> * @param dataSource<br /> * @return<br /> */<br /> @Bean(name = "transactionManager")<br /> //@Override<br /> public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {<br /> return new DataSourceTransactionManager(dataSource);<br /> }

    }