SpringBoot多数据源配置下集成MyBatis、PageHelper以及druid监控

Demo项目采用Springboot  2.0.3RELEASE版本

使用IDEA创建Spring boot项目后,在pom.xml中添加如下依赖

        <!-- MyBaits -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
 
        <!-- PageHelper分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
 
        <!-- Druid 数据连接池依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.18</version>
        </dependency>
 
        <!-- oracle连接驱动 -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.4</version>
        </dependency>
 
        <!-- MySQL 连接驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- generator 工具配置文件的位置 -->
                    <configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <!-- mysql连接驱动 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                    </dependency>
                    <!-- oracle连接驱动 -->
                    <dependency>
                        <groupId>com.oracle</groupId>
                        <artifactId>ojdbc6</artifactId>
                        <version>11.2.0.4</version>
                    </dependency>
                    <!-- MyBatis generator -->
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

配置文件使用yml格式,在application.yml文件中添加数据库连接信息,本示例中同时使用MySQL和Oracle数据库作为数据库源

spring:
  datasource:
    mysql:
      url: jdbc:mysql://localhost:3306/customerservice?useUnicode=true&characterEncoding=utf8&useSSL=false
      username: root
      password: 123
      driverClassName: com.mysql.jdbc.Driver
      initialSize: 5 #初始化大小
      minIdle: 5     #最小
      maxActive: 20  #最大
      maxWait: 60000 #等待超时时间
      timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      minEvictableIdleTimeMillis: 30000 # 配置一个连接在池中最小生存的时间,单位是毫秒
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true #是否在连接空闲一段时间后检测其可用性
      testOnBorrow: false   #是否在获得连接后检测其可用性
      testOnReturn: false  #是否在连接放回连接池后检测其可用性
      poolPreparedStatements: true  #打开PSCache,并且指定每个连接上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall,log4j2  #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      type: com.alibaba.druid.pool.DruidDataSource
    oracle:
      url: jdbc:oracle:thin:@oracle:1521:orcl
      username: scott
      password: orcl
      driverClassName: oracle.jdbc.driver.OracleDriver
      initialSize: 5 #初始化大小
      minIdle: 5     #最小
      maxActive: 20  #最大
      maxWait: 60000 #等待超时时间
      timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      minEvictableIdleTimeMillis: 30000 # 配置一个连接在池中最小生存的时间,单位是毫秒
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true #是否在连接空闲一段时间后检测其可用性
      testOnBorrow: false #是否在获得连接后检测其可用性
      testOnReturn: false #是否在连接放回连接池后检测其可用性
      poolPreparedStatements: true  #打开PSCache,并且指定每个连接上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall,log4j2  #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      type: com.alibaba.druid.pool.DruidDataSource

分别新建MySQL和Oracle数据源的配置类,如下:

@Configuration
@MapperScan(basePackages = DataSource1Config.BASE_PACKAGE, sqlSessionFactoryRef = "datasource1SqlSessionFactory")
public class DataSource1Config {
 
    private static final Logger log = LogManager.getLogger(DataSource1Config.class);
 
    static final String BASE_PACKAGE = "com.transcend.demo.dao.datasource1";
    private static final String MAPPER_LOCATION = "classpath:mapper/datasource1/*.xml";
 
 
    @Primary
    @Bean(name = "datasource1")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource datasource1() {
//        return DataSourceBuilder.create().type(DruidDataSource.class).build();
        log.info("datasource1 开始初始化。");
        return new DruidDataSource();
    }
 
    @Primary
    @Bean(name = "datasource1TransactionManager")
    public DataSourceTransactionManager datasource1Transaction(@Qualifier("datasource1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Primary
    @Bean(name = "datasource1SqlSessionFactory")
    public SqlSessionFactory datasource1SqlSessionFactory(@Qualifier("datasource1") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(DataSource1Config.MAPPER_LOCATION));
 
        //添加PageHelper插件
        Interceptor interceptor = new PageInterceptor();
        Properties properties = new Properties();
        //数据库
        properties.setProperty("helperDialect", "mysql");
        //是否将参数offset作为PageNum使用
        properties.setProperty("offsetAsPageNum", "true");
        //是否进行count查询
        properties.setProperty("rowBoundsWithCount", "true");
        //是否分页合理化
        properties.setProperty("reasonable", "false");
 
        interceptor.setProperties(properties);
        factoryBean.setPlugins(new Interceptor[] {interceptor});
 
        return factoryBean.getObject();
    }
 
    @Primary
    @Bean(name = "datasource1SqlSessionTemplate")
    public SqlSessionTemplate datasource1SqlSessionTemplate(@Qualifier("datasource1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

@Configuration
@MapperScan(basePackages = DataSource2Config.BASE_PACKAGE,sqlSessionFactoryRef = "datasource2SqlSessionFactory")
public class DataSource2Config {
 
    private static final Logger log = LogManager.getLogger(DataSource2Config.class);
 
    static final String BASE_PACKAGE = "com.transcend.demo.dao.datasource2";
    private static final String MAPPER_LOCATION = "classpath:mapper/datasource2/*.xml";
 
 
    @Bean(name = "datasource2")
    @ConfigurationProperties(prefix = "spring.datasource.oracle")
    public DataSource datasource2() {
//        return DataSourceBuilder.create().type(DruidDataSource.class).build();
        log.info("datasource2 开始初始化。");
        return new DruidDataSource();
    }
 
    @Bean(name = "datasource2TransactionManager")
    public DataSourceTransactionManager datasource2Transaction(@Qualifier("datasource2") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean(name = "datasource2SqlSessionFactory")
    public SqlSessionFactory datasource2SqlSessionFactory(@Qualifier("datasource2") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(DataSource2Config.MAPPER_LOCATION));
 
        //添加PageHelper插件
        Interceptor interceptor = new PageInterceptor();
        Properties properties = new Properties();
        //数据库
        properties.setProperty("helperDialect", "oracle");
        //是否将参数offset作为PageNum使用
        properties.setProperty("offsetAsPageNum", "true");
        //是否进行count查询
        properties.setProperty("rowBoundsWithCount", "true");
        //是否分页合理化
        properties.setProperty("reasonable", "false");
 
        interceptor.setProperties(properties);
        factoryBean.setPlugins(new Interceptor[] {interceptor});
 
        return factoryBean.getObject();
    }
 
    @Bean(name = "datasource2SqlSessionTemplate")
    public SqlSessionTemplate datasource2SqlSessionTemplate(@Qualifier("datasource2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

配置PageHelper分页插件后,由于多数据源,会出现 在系统中发现了多个分页插件,请检查系统配置!

此时需要在 Springboot启动类上添加

@SpringBootApplication(exclude = PageHelperAutoConfiguration.class)

接下来就是配置 Druid监控,创建DruidConfig.java文件,如下: 

@Configuration
@EnableTransactionManagement
public class DruidConfig {
 
    private static final Logger log = LogManager.getLogger(DruidConfig.class);
 
    @Bean
    public ServletRegistrationBean<StatViewServlet> druidServlet() {
        log.info("开始Druid Servlet初始化配置...");
        ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<>();
        servletRegistrationBean.setServlet(new StatViewServlet());
        servletRegistrationBean.addUrlMappings("/druid/*");
        Map<String, String> initParameters = new HashMap<>();
        //用户名
        initParameters.put("loginUsername", "admin");
        //密码
        initParameters.put("loginPassword", "123");
        // 禁用HTML页面上的“Reset All”功能
        initParameters.put("resetEnable", "false");
        // IP白名单 (没有配置或者为空,则允许所有访问)
        initParameters.put("allow", "127.0.0.1");
        // IP黑名单 (存在共同时,deny优先于allow)
        initParameters.put("deny", "");
        servletRegistrationBean.setInitParameters(initParameters);
        return servletRegistrationBean;
    }
 
    @Bean
    public FilterRegistrationBean<WebStatFilter> filterRegistrationBean() {
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

至此,MyBatis以及druid和多数据源 的配置已完成,不过没有mapper.xml并不能成功运行项目,需要首先通过MyBatis-generator来生成。在resource文件夹下创建generator文件夹,并创建generatorConfig.xml文件,如下为generatorConfig.xml文件(参考https://blog.csdn.net/jjlovefj/article/details/71439091): 
 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--数据库驱动-->
    <classPathEntry  location="F:\workspace\niuwa-p2ps\WebContent\WEB-INF\lib\mysql-connector-java-5.1.25.jar"/>
 
    <context id="myBatis3"  targetRuntime="MyBatis3">
        <property name="mergeable" value="true" />
        <property name="javaFileEncoding" value="UTF-8" />
 
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
 
        <!--数据库链接地址账号密码-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost/test" userId="root" password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
 
        <!--生成Model类存放位置-->
        <javaModelGenerator targetPackage="com.jiangjian.model" targetProject="src">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
 
        <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="com.jiangjian.mapping" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
 
        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.jiangjian.dao" 
            targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
 
        <!--生成对应表及类名-->
        <table tableName="students" domainObjectName="Student" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

修改generatorConfig.xml中的数据库连接信息、数据库表信息以及生成文件位置后,使用 mvn mybatis-generator:generate命令进行生成。

以上,已完成Springboot+MyBatis+PageHelper+druid以及多数据源的配置。

原文:https://blog.csdn.net/zhengyidi1357/article/details/80851856

猜你喜欢

转载自blog.csdn.net/persistencegoing/article/details/88849759