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、测试
- 数据源已经配置好,并注入到容器中,可在项目启动的时候,看到相应的日志
public class SqlController {
//自动注入
private JdbcTemplate jdbcTemplate;
("/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
- 可以修改这个配置项@ConfigurationProperties(prefix ="spring.jdbc") 来修改JdbcTemplate
- @Bean@Primary JdbcTemplate;容器中有这个组件
- JndiDataSourceAutoConfiguration: jndi的自动配置
- XADataSourceAutoConfiguration: 分布式事务相关的
2、使用Druid数据源
1、druid官方github地址
- 详细使用可以参考官方文档:https://github.com/alibaba/druid
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的数据源、并且设置该数据源的一些属性
//配置类
public class MyDataSourceConfig {
//SpringBoot默认的是使用HikariDataSource的数据源
//检查到容器中,已经有我们配置的数据源,官方默认的HikariDataSource的数据源就不会注入到容器中
//以我们配置的数据源为主
("spring.datasource")//把配置文件的配置信息,绑定到返回的组件上
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的其他功能(扩展)
- 参考官方文档进行配置
- Druid常见问题的配置:https://github.com/alibaba/druid/wiki/常见问题
- 监控页功能、web数据监控、状态监控功能(stat)、防火墙(wall)、sql监控、session监控等等
//配置类
public class MyDataSourceConfig {
("spring.datasource")//把配置文件的链接信息,绑定到返回的组件上
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setFilters("stat,wall"); //开始状态监控功能(stat)、防火墙(wall)
druidDataSource.setMaxActive(10);//活跃的线程数
return druidDataSource;
}
//配置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监控数据的开启
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
password123456
driver-class-name com.mysql.jdbc.Driver
druid
aop-patterns com.atguigu.admin.* #监控SpringBean
filters stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
stat-view-servlet# 配置监控页功能
enabledtrue
login-username admin #监控页的账户密码
login-password admin
resetEnablefalse
web-stat-filter# 监控web
enabledtrue
urlPattern /*
exclusions'*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter
stat# 对上面filters里面的stat的详细配置
slow-sql-millis1000
logSlowSqltrue
enabledtrue
wall# 对上面filters里面的wall的详细配置
enabledtrue
config
drop-table-allowfalse