Spring Boot中数据库操作Druid和HikariDataSource的详细过程
作者:尘觉
Spring Boot 数据库操作
JDBC+HikariDataSource
应用实例-需求
● 需求:演示Spring Boot 如何通过jdbc+HikariDataSource 完成对Mysql 操作
说明: HikariDataSource : 目前市面上非常优秀的数据源, 是springboot2 默认数据源
创建测试数据库和表
-- 创建furns_ssm DROP DATABASE IF EXISTS spring_boot; CREATE DATABASE spring_boot; USE spring_boot; -- 创建家居表 CREATE TABLE furn( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, ## id `name` VARCHAR(64) NOT NULL, ## 家居名 `maker` VARCHAR(64) NOT NULL, ## 厂商 `price` DECIMAL(11,2) NOT NULL, ## 价格 `sales` INT(11) NOT NULL, ## 销量 `stock` INT(11) NOT NULL, ## 库存 `img_path` VARCHAR(256) NOT NULL ## 照片路径 ); -- 初始化家居数据 INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 北欧风格小桌子' , ' 熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/1.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 简约风格小椅子' , ' 熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/2.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 典雅风格小台灯' , ' 蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/3.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 温馨风格盆景架' , ' 蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg'); SELECT * FROM furn;
进行数据库开发, 在pom.xml 引入data-jdbc starter 参考官方文档
https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-syst
ems.starters .
<!--进行数据库开发,引入data-jdbc starter--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
需要在pom.xml 指定导入数据库驱动
因为Spring Boot 不知道项目要操作Mysql 还是Oracle , 需要在pom.xml 指定导入数据库驱动, 并指定对应版本.
<!--引入mysql的驱动 1. 说明这里没有使用版本仲裁 <mysql.version>8.0.26</mysql.version> 2. 指定的版本是5.1.49 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>
在application.yml 配置操作数据源的信息
spring: servlet: multipart: max-file-size: 10MB max-request-size: 50MB datasource: #配置数据源 # 说明: 如果你没有指定useSSL=true ,启动项目会报红警告, 环境的问题,要灵活处理 url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 自己的密码 driver-class-name: com.mysql.jdbc.Driver
创建bean\Furn.java
public class Furn { private Integer id; private String name; private String maker; private BigDecimal price; private Integer sales; private Integer stock; private String imgPath = "assets/images/product-image/1.jpg"; public Furn(Integer id, String name, String maker, BigDecimal price, Integer sales, Integer stock, String imgPath) { this.id = id; this.name = name; this.maker = maker; this.price = price; this.sales = sales; this.stock = stock; this.imgPath = imgPath; } public Furn() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMaker() { return maker; } public void setMaker(String maker) { this.maker = maker; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public Integer getSales() { return sales; } public void setSales(Integer sales) { this.sales = sales; } public Integer getStock() { return stock; } public void setStock(Integer stock) { this.stock = stock; } public String getImgPath() { return imgPath; } public void setImgPath(String imgPath) { this.imgPath = imgPath; } @Override public String toString() { return "Furn{" + "id=" + id + ", name='" + name + '\'' + ", maker='" + maker + '\'' + ", price=" + price + ", sales=" + sales + ", stock=" + stock + ", imgPath='" + imgPath + '\'' + '}'; } }
测试结果
test 目录下的usersys/ApplicationTests.java , 完成测试
如果不知道JdbcTemplate请看一下spring的博客文章
使用BeanPropertyRowMapper时,是给query()方法传递一个BeanPropertyRowMapper对象让JdbcTemplate帮我们把执行sql语句的结果集自动帮我们封装到对应的属性
@SpringBootTest public class ApplicationTests { //如果不知道JdbcTemplate请看一下spring的博客文章 @Resource private JdbcTemplate jdbcTemplate; @Test public void contextLoads() { BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class); List<Furn> furns = jdbcTemplate.query("SELECT * FROM `furn`", rowMapper); for (Furn furn : furns) { System.out.println(furn); } System.out.println(jdbcTemplate.getDataSource().getClass()); } }
整合Druid 到Spring-Boot
官方文档
使用手册: https://github.com/alibaba/druid
中文手册: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
基本介绍
1. HiKariCP: 目前市面上非常优秀的数据源, 是springboot2 默认数据源
2. Druid: 性能优秀,Druid 提供性能卓越的连接池功能外 这个在专题javaEE的数据库和jdbc的这篇博客中有说明 链接
,还集成了SQL 监控,黑名单拦截等功能,强大的监控特性,通过Druid 提供的监控功能,可以清楚知道连接池和SQL 的工作情况,所以根据项目需要,我们也要掌握Druid 和SpringBoot 整合
3. 整合Druid 到Spring-Boot 方式
● 自定义方式
● 引入starter 方式
Durid 基本使用
需求: 将Spring-Boot 的数据源切换成Druid
修改pom.xml , 引入druid 依赖
<!--引入druid starter--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
创建DruidDataSourceConfig.java 配置类
@Configuration public class DruidDataSourceConfig { //编写方法,注入DruidDataSource //还有说明一下为什么我们注入自己的DataSource , 默认的HiKariDatasource失效? //1. 默认的数据源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) // 解读通过@ConditionalOnMissingBean({ DataSource.class}) 判断如果容器有DataSource Bean 就不注入默认的HiKariDatasource @ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { //1. 配置了 @ConfigurationProperties("spring.datasource") // 就可以读取到application.yml的配置 //2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联 DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; } }
完成测试,运行ApplicationTests.java , 观察数据源的运行类型
Durid 监控功能-SQL 监控
需求: 配置Druid 的监控功能,包括SQL 监控、SQL 防火墙、Web 应用、Session 监控等
修改DruidDataSourceConfig.java , 增加druid 监控功能
地址:
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
//配置druid的监控页功能 @Bean public ServletRegistrationBean statViewServlet() { //创建StatViewServlet StatViewServlet statViewServlet = new StatViewServlet(); ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*"); //设置init-parameter, 设置用户名和密码 registrationBean.addInitParameter("loginUsername", "wyx"); registrationBean.addInitParameter("loginPassword", "666666"); return registrationBean; }
完成测试
访问http://localhost:10000/druid/index.html 不会被拦截, 如果没有问题,会看到这个页面
修改DruidDataSourceConfig.java , 加入监控功能
参考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
创建DruidSqlController.java
@Controller public class DruidSqlController { @Resource private JdbcTemplate jdbcTemplate; @ResponseBody @GetMapping("/sql") public List<Furn> crudDB() { BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class); List<Furn> furns = jdbcTemplate.query("select * from `furn`", rowMapper); for (Furn furn : furns) { System.out.println(furn); } return furns; } }
SQL 监控数据-测试页面
● 完成测试, 观察SQL 监控数据, 浏览器http://localhost:10000/druid/sql.html
Durid 监控功能-Web 关联监控
需求: 配置Web 关联监控配置:Web 应用、URI 监控
官方文档
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Web 关联监控配置-Web 应用、URI 监控
DruidDataSourceConfig.java , 注入/ 增加WebStatFilter 用于采集web-jdbc 关联监控的数据
//配置WebStatFilter, 用于采集web-jdbc关联的监控数据 @Bean public FilterRegistrationBean webStatFilter() { //创建 WebStatFilter WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter); //默认对所有的url请求进行监控 filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); //排除指定的url filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; }
为了测试方便,修改/WebConfig.java, 放行/sql 请求
重启项目,看看Web 应用和URI 监控页面
完成测试,重启项目,看看Web 应用和URI 监控是否生效
Durid 监控功能-SQL 防火墙
需求: 配置SQL 防火墙
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
修改DruidDataSourceConfig.java ,加入防火墙监控
@ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { //1. 配置了 @ConfigurationProperties("spring.datasource") // 就可以读取到application.yml的配置 //2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联 DruidDataSource druidDataSource = new DruidDataSource(); //加入监控功能, 加入了sql防火墙监控 druidDataSource.setFilters("stat,wall"); return druidDataSource; }
完成测试,重启项目,看看SQL 防火墙监控是否生效
Durid 监控功能-Session 监控
需求: 配置Session 监控
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Session 监控
重启项目, 先登录管理系统
完成测试, 查看监控页需要输入用户名和密码, 点击Session 监控,可以看到相关信息
(注意要登录用户系统,才能看到Session 监控信息)
Druid Spring Boot Starter 基本介绍
1. 前面我们使用的是自己引入druid+配置类方式整合Druid 和监控
2. Druid Spring Boot Starter 可以让程序员在Spring Boot 项目中更加轻松集成Druid 和监控
修改pom.xml 注销druid 的依赖
注销DruidDataSourceConfig.java
这时测试,druid 失效
查看druid 文档https://github.com/alibaba/druid,引入druid starter
确认druid starter 引入哪些依赖
修改resources/application.yml 增加配置参数
spring: servlet: multipart: max-file-size: 10MB max-request-size: 50MB datasource: #配置数据源 # 说明: 如果你没有指定useSSL=true ,启动项目会报红警告, 环境的问题,灵活处理 url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 自己的密码 driver-class-name: com.mysql.jdbc.Driver #配置druid和监控功能 druid: stat-view-servlet: enabled: true login-username: jack login-password: 666 reset-enable: false web-stat-filter: #配置web监控 enabled: true url-pattern: /* exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' filter: stat: #sql监控 slow-sql-millis: 1000 log-slow-sql: true enabled: true wall: #配置sql防火墙 enabled: true config: drop-table-allow: false select-all-column-allow: false
重启项目,完成测试
测试完成后,记得改回成原来的代码.(个人习惯) ...
到此这篇关于Spring Boot中数据库操作Druid和HikariDataSource的文章就介绍到这了,更多相关Spring Boot Druid和HikariDataSource内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!