使用SpringBoot2.0搭建企业级应用开发框架(三)分页插件、数据库连接池和多数据源

分页插件

数据库连接池

1、在pom文件中添加依赖

2、修改application.yml中的数据源配置

 3、启动应用

多数据源

1、数据库准备

2、生成实体

3、配置多数据源

 4、启动应用


  • 分页插件

列表查询功能大多都需要实现分页查询,还记得以前被手写分页查询所支配的恐惧吗,对于每一个实体,都需要添加pageNum、pageSize属性,每一个列表查询都要单独写一段分页查询SQL,耗时耗力耗神,所以分页查询插件必不可少,直接用Mybatis最常用的开源PageHelper插件,pom.xml添加依赖

<properties>
    <pagehelper.spring.boot.version>1.2.5</pagehelper.spring.boot.version>
</properties>
<dependencies>
    <!--分页-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>${pagehelper.spring.boot.version}</version>
    </dependency>
</dependencies>

使用分页插件时,如果没有特殊的需要,其实完全不需要加入其他配置项的,因为SpringBoot理念是习惯大于配置,所以默认的配置足以满足基本的需求 

使用方法不再赘述,如果有不懂的小伙伴可以查看官方介绍的第3部分——如何在代码中使用,https://pagehelper.github.io/docs/howtouse/,一般最常用的就是startPage(pageNum,pageSize)这种方式

  • 数据库连接池

企业级应用会有大量的数据库读写任务,而每一次读写都会建立和关闭数据库连接,频繁的建立、关闭连接,会极大的减低系统的性能,主流的几种数据库连接池的横向对比就不介绍了,感兴趣可以百度一下,我们用Druid即可

1、在pom文件中添加依赖

<properties>
    <druid.spring.boot.version>1.1.10</druid.spring.boot.version>
</properties>
<dependencies>
    <!--数据库连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>${druid.spring.boot.version}</version>
    </dependency>
<dependencies>

2、修改application.yml中的数据源配置

spring:
  datasource:
    ############  JDBC 配置  ###################
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password:
    
    ############# Druid 连接池配置  #################
    # 初始连接数 #
    initial-size: 5
    # 最大的活跃连接数 #
    max-active: 20
    # 指定必须保持连接的最小值 #
    min-idle: 3
    # 测试SQL #
    validation-query: SELECT 'x' FROM DUAL
    # 超时等待时间 #
    max-wait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 #
    time-between-eviction-runs-millis: 60000
    # 指定一个空闲连接最少空闲多久后可被清除,单位是毫秒 #
    min-evictable-idle-time-millis: 300000
    # 当连接空闲时,是否执行连接测试 #
    test-while-idle: true
    # 当从连接池借用连接时,是否测试该连接 #
    test-on-borrow: false
    # 在连接归还到连接池时是否测试该连接 #
    test-on-return: false
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,wall用于防火墙 #
    # 监控统计用的filter:stat   日志用的filter:log4j   防御sql注入的filter:wall #
    filters: stat,wall,log4j
    # 以下是监控的配置 ##########
    web-stat-filter:
      enabled: true
      url-pattern: /*
      # 排除统计干扰 #
      exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
      session-stat-enable: true
      session-stat-max-count: 10
    stat-view-servlet:
      # 白名单 #
      allow: 127.0.0.1
      # 黑名单,与白名单同时存在时优先黑名单 #
      deny:
      enabled: true
      url-pattern: /druid/*
      # 是否能够重置数据 #
      reset-enable: true
      login-username: druid
      login-password: druid

 3、启动应用

访问localhost:9090/druid/index.html会被拦截到下图页面,登录后即可查看当前数据源监控信息,登录名和密码即为配置文件中的login-username和login-password

  • 多数据源

很多时候单个应用需要连接多个数据库来完成功能,所以多数据源的配置也是企业级开发必备。我们使用分包的方式来配置多数据源

1、数据库准备

我们已经有一个名为demo的数据库,还需要新建一个数据库demo_2,然后初始化一个demo_info表进去,并给这个表初始化一条数据

CREATE TABLE `demo_info` (
  `id` varchar(32) NOT NULL COMMENT 'id',
  `name` varchar(32) DEFAULT NULL COMMENT '名字',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `demo_2`.`demo_info` (`id`, `name`) VALUES ('2', '小白');

2、生成实体

根据我的上一篇使用SpringBoot搭建企业级应用开发框架(二)数据库及Mybatis集成中的描述,我们可以新建一个mybatis-generator-confing.xml来管理新的数据源的代码自动生成(两个config.xml的切换需要在pom.xml中手动修改),过程不再赘述,由于我们使用分包的方式,所以两个数据库的Mapper要放在不同的目录下,例如我这样设计此demo的文件目录结构(只画出main目录下与多数据源有关的)

main

    +-  java

     |  +-  com/example/demo

     |      +-  entity

     |       |    +-  mapping

     |       |        +-  masterDb

     |       |        +-  secondDb

     |       +-  mapper

     |                +-  masterDb

     |                +-  secondDb

    +- resources

        +-  generator

         |      +-  mybatis-generator-config-master.xml

         |      +-  mybatis-generator-config-second.xml

         +-  application.yml

3、配置多数据源

修改application.yml中数据源部分内容为

spring:
  datasource:
    ############  JDBC 配置  ###################
    master:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password:
    second:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/demo_2?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password:

    ############# Druid 连接池配置  #################
    druid:
      # 初始连接数 #
      initial-size: 5
      # 最大的活跃连接数 #
      max-active: 20
      # 指定必须保持连接的最小值 #
      min-idle: 3
      # 测试SQL #
      validation-query: SELECT 'x' FROM DUAL
      # 超时等待时间 #
      max-wait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 #
      time-between-eviction-runs-millis: 60000
      # 指定一个空闲连接最少空闲多久后可被清除,单位是毫秒 #
      min-evictable-idle-time-millis: 300000
      # 当连接空闲时,是否执行连接测试 #
      test-while-idle: true
      # 当从连接池借用连接时,是否测试该连接 #
      test-on-borrow: false
      # 在连接归还到连接池时是否测试该连接 #
      test-on-return: false
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,wall用于防火墙 #
      # 监控统计用的filter:stat   日志用的filter:log4j   防御sql注入的filter:wall #
      filters: stat,wall,log4j
      # 以下是监控的配置 ##########
      web-stat-filter:
        enabled: true
        url-pattern: /*
        # 排除统计干扰 #
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
        session-stat-enable: true
        session-stat-max-count: 10
      stat-view-servlet:
        # 白名单 #
        allow: 127.0.0.1
        # 黑名单,与白名单同时存在时优先黑名单 #
        deny:
        enabled: true
        url-pattern: /druid/*
        # 是否能够重置数据 #
        reset-enable: true
        login-username: druid
        login-password: druid

在com.example.demo下新建config包,创建多数据源配置类,每个数据源都要创建一个,其中最多有一个作为主数据源,主数据源和其他数据源的配置区别在于有无@Primary注解,这里只展示主数据源配置,其他数据源配置自行仿照主数据源配置,然后把@Primary删掉即可

@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.masterDb", sqlSessionTemplateRef  = "db1SqlSessionTemplate")
public class DataSource1Config {

    @Bean(name = "db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    @Primary
    public DataSource testDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "db1SqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("com.example.demo.mapper.masterDb.mapper.*.xml"));//xml如果要放在src/main/resources下,则此处改为classpath:mybatis/mapper/*.xml
        return bean.getObject();
    }

    @Bean(name = "db1TransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

 此时Mapper路径的扫描以及映射xml的配置已添加到各个具体的数据源中,所以SpringBoot启动类中的@MapperScan注解以及application.yml中的mybatis.mapper-location就可以删掉了

配置好后,编写测试类,在刚才我们使用的测试用controller中添加以下测试方法

@RequestMapping("/doubleDb")
    public String doubleDb(){
        UserInfo user = userInfoMapper.selectByPrimaryKey("1");
        DemoInfo demo = demoInfoMapper.selectByPrimaryKey("2");
        return new StringBuffer().append("用户名:").append(user.getUsername()).append(",名字:").append(demo.getName()).toString();
    }

 4、启动应用

访问localhost:8080/test/doubleDb,看到以下结果:

SpringBoot2默认使用Hikari作为数据库连接池,如果你没有使用Druid作为数据库连接池,就代表使用了Hikari,配置多数据源的话,要将application.yml中的spring.datasource.*.url改为spring.datasource.*.jdbc-url,否则访问时会发生异常,这个坑简直了!

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值