1、数据源的自动配置-HikariDataSource


1、第一步:导入JDBC场景启动器


引入这个场景,springboot默认帮我们引入HikarDataSource数据源


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>



2、第二步:自己导入相应的数据库驱动


<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version><!-- 不使用SpringBoot仲裁的版本号-->
</dependency>


  • 为什么导入JDBC场景,官方不导入驱动?
  • 官方不知道我们接下要操作什么数据库。
  • 数据库版本和驱动版本对应(SpringBoot版本有仲裁好了的mysql的版本,但不一定和本机的mysql版本相互对应---进行修改)


想要想要修改版本:
1、直接依赖引入具体版本(maven的就近依赖原则)
2、重新声明版本(maven的属性的就近优先原则)
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.49</mysql.version>
</properties>


3、第三步 在配置文件中写入连接数据库的信息


  • (当导入依赖,帮我们自动的配置了数据源和JdbcTemplate的自动配置

(容器中有中的注入的JDBCTemplate组件,直接使用@Autowired直接注入)

  • (导入了数据库的场景,没有设置数据库的连接信息,会导致项目启动报错)
  • 在配置文件中(application.yaml   application.properties),

添加数据库连接信息 和 JdbcTemplate的设置

spring.datasource.url=jdbc:mysql://localhost:3306/zhangyang?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=015718
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.type=com.zaxxer.hikari.HikariDataSource(数据源的类型)
#注意 是username和password不是 data-username data-password
#注意 连接的版本号(驱动和本地的mysql版本要相互对应)

#修改JdbcTemplate的属性设置
#超过三秒的都认为是查询超时
spring.jdbc.template.query-timeout=3


4、测试


  • 数据源已经配置好,并注入到容器中,可在项目启动的时候,看到相应的日志

@Controller
public class SqlController {
@Autowired //自动注入
private JdbcTemplate jdbcTemplate;
@GetMapping("/sql")
public String text1(HttpServletRequest request) {
Long aNum = jdbcTemplate.queryForObject("select count(*) from user", Long.class); //直接使用JDBCTemplate的方法操作数据库
request.setAttribute("data",aNum);
return "success";
}
}


2、分析自动配置(了解)


1、自动配置的类


  • DataSourceAutoConfiguration : 数据源的自动配置

  • 修改数据源相关的配置:spring.datasource
  • 数据库连接池的配置,是自己容器中没有DataSource才自动配置的
  • 底层配置好的连接池是:HikariDataSource
  • DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置
  • JdbcTemplateAutoConfiguration:JdbcTemplate的自动配置,可以来对数据库进行crud

  • JndiDataSourceAutoConfiguration: jndi的自动配置
  • XADataSourceAutoConfiguration: 分布式事务相关的


2、使用Druid数据源


1、druid官方github地址



2、整合第三方技术的两种方式


  • 整合第三方技术的两种方式
  • 方式一:

自定义数据源信息

  • 导入依赖
  • 定义一个配置类,写好连接数据库信息,创建好数据源放到容器中
  • (当然连接信息也可以写在配置文件中,进行绑定到自定义的数据源,并注入到容器中)
  • 方法二:

找starter(场景启动器)+该配置文件

  • 导入场景启动器(当场景导入进去、SpringBoot帮我们做好了很多的自动配置)
  • 我们只需写好配置文件,数据源就自动创建好放到容器中
  • (如果我们注入相对应的配置类---官方为我们提供的配置类就会失效)


3、自定义方式整合Druid


3.1 第一步:导入依赖


  • 在官网或者中央仓库上找到依赖,导入
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>


3.2 第二步:配置数据源的基本信息


就是在容器中注入一个 Driuid的数据源、并且设置该数据源的一些属性

//配置类
@Configuration
public class MyDataSourceConfig {
//SpringBoot默认的是使用HikariDataSource的数据源
//检查到容器中,已经有我们配置的数据源,官方默认的HikariDataSource的数据源就不会注入到容器中
//以我们配置的数据源为主
@ConfigurationProperties("spring.datasource")//把配置文件的配置信息,绑定到返回的组件上
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
//数据源的设置(这种方式写死了,最好使用配置文件的自动注入进来)
// druidDataSource.setUrl("jdbc:mysql://localhost:3306/zhangyang?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false");
// druidDataSource.setUsername("root");
// druidDataSource.setPassword("015718");
// druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
return druidDataSource;
}
}


3.3 第三步:配置Druid的其他功能(扩展)

//配置类
@Configuration
public class MyDataSourceConfig {

@ConfigurationProperties("spring.datasource")//把配置文件的链接信息,绑定到返回的组件上
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setFilters("stat,wall"); //开始状态监控功能(stat)、防火墙(wall)
druidDataSource.setMaxActive(10);//活跃的线程数
return druidDataSource;
}

@Bean
//配置druid的监控页功能
public ServletRegistrationBean servletRegistrationBean(){
StatViewServlet statViewServlet = new StatViewServlet();//返回监控页,(原生的servlet类型的)
//监控页面的具体设置

//配置好拦截的路径(访问http://localhost:8080/druid/index.html,就会来到我们的监控页面)
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(statViewServlet,"/druid/*");
//监控页面的登入+黑白名单(指定哪些ip可以进入)
servletRegistrationBean.addInitParameter("loginUsername","admin");
servletRegistrationBean.addInitParameter("loginPassword","123456");
return servletRegistrationBean;
}

//web监控数据的开启
@Bean
public FilterRegistrationBean filterRegistrationBean() {
WebStatFilter webStatFilter = new WebStatFilter();

FilterRegistrationBean<WebStatFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
//不监控的数据
filterFilterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterFilterRegistrationBean;
}
}


4、使用官方starter方式


4.1 第一步  引入druid-starter场景启动器


  • 当引入场景启动器的时候,就帮我们配置好了很多的组件放到了容器中
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>


4.2 第二步 编写配置文件


  • 因为底层已近把很对的组件注入到容器中了,我们只需要编写配置文件
  • (当然也可以通过配置类的编写,覆盖掉自动配置的组件)
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_account
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver

druid:
aop-patterns: com.atguigu.admin.* #监控SpringBean
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)

stat-view-servlet: # 配置监控页功能
enabled: true
login-username: admin #监控页的账户密码
login-password: admin
resetEnable: false

web-stat-filter: # 监控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'


filter:
stat: # 对上面filters里面的stat的详细配置
slow-sql-millis: 1000
logSlowSql: true
enabled: true
wall: # 对上面filters里面的wall的详细配置
enabled: true
config:
drop-table-allow: false