Spring Boot 数据库操作Druid和HikariDataSource(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Boot 数据库操作Druid和HikariDataSource

Spring Boot  数据库操作

JDBC+HikariDataSource

应用实例-需求

● 需求:演示Spring Boot 如何通过jdbc+HikariDataSource 完成对Mysql 操作

说明: HikariDataSource : 目前市面上非常优秀的数据源, 是springboot2 默认数据源

创建测试数据库和表

1. -- 创建furns_ssm
2. DROP DATABASE IF EXISTS spring_boot;
3. CREATE DATABASE spring_boot;
4. USE spring_boot;
5. -- 创建家居表
6. CREATE TABLE furn(
7. `id` INT(11) PRIMARY KEY AUTO_INCREMENT, ## id
8. `name` VARCHAR(64) NOT NULL, ## 家居名
9. `maker` VARCHAR(64) NOT NULL, ## 厂商
10. `price` DECIMAL(11,2) NOT NULL, ## 价格
11. `sales` INT(11) NOT NULL, ## 销量
12. `stock` INT(11) NOT NULL, ## 库存
13. `img_path` VARCHAR(256) NOT NULL ## 照片路径
14. );
15. -- 初始化家居数据
16. INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
17. VALUES(NULL , ' 北欧风格小桌子' , ' 熊猫家居' , 180 , 666 , 7 ,
18. 'assets/images/product-image/1.jpg');
19. INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
20. VALUES(NULL , ' 简约风格小椅子' , ' 熊猫家居' , 180 , 666 , 7 ,
21. 'assets/images/product-image/2.jpg');
22. INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
23. VALUES(NULL , ' 典雅风格小台灯' , ' 蚂蚁家居' , 180 , 666 , 7 ,
24. 'assets/images/product-image/3.jpg');
25. INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
26. VALUES(NULL , ' 温馨风格盆景架' , ' 蚂蚁家居' , 180 , 666 , 7 ,
27. 'assets/images/product-image/4.jpg');
28. 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 .

1. <!--进行数据库开发,引入data-jdbc starter-->
2. <dependency>
3. <groupId>org.springframework.boot</groupId>
4. <artifactId>spring-boot-starter-data-jdbc</artifactId>
5. </dependency>

 

需要在pom.xml 指定导入数据库驱动

因为Spring Boot 不知道项目要操作Mysql 还是Oracle , 需要在pom.xml 指定导入数据库驱动, 并指定对应版本.

1. <!--引入mysql的驱动
2.         1. 说明这里没有使用版本仲裁  <mysql.version>8.0.26</mysql.version>
3.         2. 指定的版本是5.1.49
4.         -->
5. <dependency>
6. <groupId>mysql</groupId>
7. <artifactId>mysql-connector-java</artifactId>
8. <version>5.1.49</version>
9. </dependency>

在application.yml 配置操作数据源的信息

1. spring:
2. servlet:
3. multipart:
4.       max-file-size: 10MB
5.       max-request-size: 50MB
6. datasource: #配置数据源
7. # 说明: 如果你没有指定useSSL=true ,启动项目会报红警告, 环境的问题,要灵活处理
8. url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
9. username: root
10. password: 自己的密码
11.     driver-class-name: com.mysql.jdbc.Driver

创建bean\Furn.java

1. public class Furn {
2. private Integer id;
3. 
4. private String name;
5. 
6. private String maker;
7. 
8. private BigDecimal price;
9. 
10. private Integer sales;
11. 
12. private Integer stock;
13. 
14. private String imgPath = "assets/images/product-image/1.jpg";
15. 
16. public Furn(Integer id, String name, String maker, BigDecimal price, Integer sales, Integer stock, String imgPath) {
17. this.id = id;
18. this.name = name;
19. this.maker = maker;
20. this.price = price;
21. this.sales = sales;
22. this.stock = stock;
23. this.imgPath = imgPath;
24.     }
25. 
26. public Furn() {
27.     }
28. 
29. public Integer getId() {
30. return id;
31.     }
32. 
33. public void setId(Integer id) {
34. this.id = id;
35.     }
36. 
37. public String getName() {
38. return name;
39.     }
40. 
41. public void setName(String name) {
42. this.name = name;
43.     }
44. 
45. public String getMaker() {
46. return maker;
47.     }
48. 
49. public void setMaker(String maker) {
50. this.maker = maker;
51.     }
52. 
53. public BigDecimal getPrice() {
54. return price;
55.     }
56. 
57. public void setPrice(BigDecimal price) {
58. this.price = price;
59.     }
60. 
61. public Integer getSales() {
62. return sales;
63.     }
64. 
65. public void setSales(Integer sales) {
66. this.sales = sales;
67.     }
68. 
69. public Integer getStock() {
70. return stock;
71.     }
72. 
73. public void setStock(Integer stock) {
74. this.stock = stock;
75.     }
76. 
77. public String getImgPath() {
78. return imgPath;
79.     }
80. 
81. public void setImgPath(String imgPath) {
82. this.imgPath = imgPath;
83.     }
84. 
85. @Override
86. public String toString() {
87. return "Furn{" +
88. "id=" + id +
89. ", name='" + name + '\'' +
90. ", maker='" + maker + '\'' +
91. ", price=" + price +
92. ", sales=" + sales +
93. ", stock=" + stock +
94. ", imgPath='" + imgPath + '\'' +
95. '}';
96.     }
97. }

测试结果

test 目录下的usersys/ApplicationTests.java , 完成测试

如果不知道JdbcTemplate请看一下spring的博客文章

使用BeanPropertyRowMapper时,是给query()方法传递一个BeanPropertyRowMapper对象让JdbcTemplate帮我们把执行sql语句的结果集自动帮我们封装到对应的属性

1. @SpringBootTest
2. public class ApplicationTests {
3. 
4. //如果不知道JdbcTemplate请看一下spring的博客文章
5. @Resource
6. private JdbcTemplate jdbcTemplate;
7. 
8. @Test
9. public void contextLoads() {
10. 
11.         BeanPropertyRowMapper<Furn> rowMapper =
12. new BeanPropertyRowMapper<>(Furn.class);
13. 
14.         List<Furn> furns = jdbcTemplate.query("SELECT * FROM `furn`", rowMapper);
15. for (Furn furn : furns) {
16.             System.out.println(furn);
17.         }
18. 
19.         System.out.println(jdbcTemplate.getDataSource().getClass());
20.     }
21. }

整合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 依赖

1. <!--引入druid starter-->
2. <dependency>
3. <groupId>com.alibaba</groupId>
4. <artifactId>druid-spring-boot-starter</artifactId>
5. <version>1.1.17</version>
6. </dependency>

创建DruidDataSourceConfig.java 配置类

1. @Configuration
2. public class DruidDataSourceConfig {
3. 
4. //编写方法,注入DruidDataSource
5. //还有说明一下为什么我们注入自己的DataSource , 默认的HiKariDatasource失效?
6. //1. 默认的数据源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
7. //  解读通过@ConditionalOnMissingBean({ DataSource.class}) 判断如果容器有DataSource Bean 就不注入默认的HiKariDatasource
8. @ConfigurationProperties("spring.datasource")
9. @Bean
10. public DataSource dataSource() throws SQLException {
11. //1. 配置了 @ConfigurationProperties("spring.datasource")
12. //   就可以读取到application.yml的配置
13. //2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
14. 
15. DruidDataSource druidDataSource = new DruidDataSource();
16. return druidDataSource;
17.     }
18. }

完成测试,运行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 

1. //配置druid的监控页功能
2. @Bean
3. public ServletRegistrationBean statViewServlet() {
4. //创建StatViewServlet
5. StatViewServlet statViewServlet = new StatViewServlet();
6.         ServletRegistrationBean<StatViewServlet> registrationBean =
7. new ServletRegistrationBean<>(statViewServlet, "/druid/*");
8. //设置init-parameter, 设置用户名和密码
9.         registrationBean.addInitParameter("loginUsername", "wyx");
10.         registrationBean.addInitParameter("loginPassword", "666666");
11. 
12. return registrationBean;
13.     }

完成测试

访问http://localhost:10000/druid/index.html 不会被拦截, 如果没有问题,会看到这个页面

修改DruidDataSourceConfig.java , 加入监控功能

参考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

创建DruidSqlController.java

1. @Controller
2. public class DruidSqlController {
3. 
4. @Resource
5. private JdbcTemplate jdbcTemplate;
6. 
7. @ResponseBody
8. @GetMapping("/sql")
9. public List<Furn> crudDB() {
10. 
11.         BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);
12.         List<Furn> furns = jdbcTemplate.query("select * from `furn`", rowMapper);
13. for (Furn furn : furns) {
14.             System.out.println(furn);
15.         }
16. return furns;
17.     }
18. }

SQL 监控数据-测试页面

● 完成测试, 观察SQL 监控数据, 浏览器http://localhost:10000/druid/sql.html


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
85 3
SpringBoot入门 - 添加内存数据库H2
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
57 4
SpringBoot入门(4) - 添加内存数据库H2
|
2月前
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
151 1
|
3月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
39 2
SpringBoot入门(4) - 添加内存数据库H2
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
73 13
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
59 4
|
2月前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
28 0
|
13天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
13天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
13天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2