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