Spring Boot 横扫 Java 程序员在使用 Spring 研发路上的诸多障碍,让研发人员更加专注于业务逻辑的开发,使得企业级项目开发更加快速和高效。
为什么这么说呢?
这要归功于 Spring Boot 提供了满足研发场景的各种 starter,所谓 starter 就是把项目研发中所需的组件或服务进行封装成包,开箱即用,屏蔽了繁琐的配置,使得依赖的组件或服务变的可插拔。
starter 主要分为两种:一种是官方的,一种是三方的。官方与三方的命名方式上不太一样,官方的命名以 spring-boot 开头,而三方的命名以自定义的 xxx 名称开头。
例如,官方的命名:spring-boot-xxx-xxx.jar,而三方的命名:xxx-spring-boot-starter.jar。
本文主要讲解 Spring Boot 与常见开发组件进行整合,感受一下 starter 开箱即用的魔力,深入体验 Spring Boot 的大道至简。
1.?Spring Boot 集成 MySQL
借助?Spring Boot 框架,可以不用编写原始的访问数据库的代码,也不用调用 JDBC 或者连接池等诸如此类的被称为底层的代码,就可以在更高级的层次上访问数据库。
Spring Boot 集成 MySQL 非常之简单,只需如下简单的几步。
1.1.?引入依赖
在 pom.xml 中引入访问?MySQL 所需的依赖。
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 通过 JDBC 连接数据库依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
1.2. 添加数据库配置
在 application.properties 文件中,添加 MySQL 数据库的连接信息:
# MySQL 链接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
1.3.创建表、插入数据
-- ----------------------------
-- Table structure for sc_product
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `sc_product`;
CREATE TABLE `sc_product` (
`id` bigint(20) NOT NULL COMMENT '商品id',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
`number` int(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
`start_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '秒杀开始时间',
`end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '秒杀结束时间',
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`product_img` varchar(255) DEFAULT NULL COMMENT '商品图片',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of sc_product
-- 插入3条商品记录
-- ----------------------------
INSERT INTO `sc_product` VALUES ('1', '小米11 Pro', '100', '2022-01-21 08:08:08', '2022-02-21 08:08:08', '2022-01-21 00:00:00', '/xiaomi10.jpg');
INSERT INTO `sc_product` VALUES ('2', '小米12 pro', '100', '2022-01-21 08:08:08', '2022-02-21 08:08:08', '2022-01-21 00:00:00', '/xiaomi12.jpg');
INSERT INTO `sc_product` VALUES ('3', '红米10 pro', '100', '2022-01-21 08:08:08', '2022-02-21 08:08:08', '2022-01-21 00:00:00', '/hongmi.jpg');
1.4.创建实体类
import java.io.Serializable;
import java.util.Date;
/**
* 产品类
?*?@author?daishu
*/
public class ScProduct implements Serializable {
private Integer id;
private String name;
private String productImg;
private Integer number;
private Date startTime;
private Date endTime;
private Date createTime;
// 省略 setter/getter 方法
// 省略 toString 方法
}
1.5.测试验证
单元测试类跑起来,效果如下。
至此,Spring Boot 项目集成 MySQL 数据库已大功告成。
回头捋捋:
三两行代码就完成了 Spring Boot 项目集成数据库,从使用上感觉一切皆是浑然天成,可谓是快哉!
Spring Boot 项目集成数据库就分享到这里,但是如何提高数据库的操作性能呢?
回顾日常实际项目研发,大概率会发现项目很难脱离数据库而单独存在,而提高数据库性能,往往会借助数据库连接池来支持,接下来说说 Spring Boot 如何集成常见的 DataSource 数据源。
2.?Spring Boot 集成连接池组件
常见的连接池有 DBCP、C3P0、Tomcat jdbc-pool、Druid、HikariCP。
坊间做过性能验证,得出结论如下:
1:性能方面 HikariCP > Druid > tomcat-jdbc > DBCP > C3P0 ;
2:Driud 功能最为全面,具有良好的扩展性;
3:综合性能,扩展性等方面,可考虑使用 Druid 或 HikariCP 连接池。
接下来重点说说 Spring Boot 集成 Druid 和 ?HikariCP 连接池。
2.1.?Spring Boot 集成 Druid 数据库连接池
Druid 是阿里推出的一款数据库连接池组件,是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,可高效处理大规模的数据并实现快速查询和分析。
2.1.1.?引入依赖
<!-- 引入 Druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
2.1.2. 添加 Druid 配置
# MySQL 链接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源类别
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 初始化连接数、最小空闲、最大活跃连接数
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间,单位是毫秒
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在连接池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开 PSCache,并且制定每个连接上 PSCache 的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的 filters
spring.datasource.filters=stat,wall,log4j
# 打开 mergeSql 功能;记录慢 SQL
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个 DruidDataSource 的监控数据
spring.datasource.useGlobalDataSourceStat=true
2.1.3.?开启 Druid 监控功能
package com.example.demo.config;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// IP白名单(没有配置或者为空,则允许所有访问)
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// IP黑名单(共同存在时,deny优先于allow)
servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
//控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
//是否能够重置数据 禁用HTML页面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
2.1.4. 测试集成
运行 DemoApplication 进行服务启动,访问 http://127.0.0.1:8888/druid/login.html(本机服务端口为 8080)
输入 admin/admin 后登陆,效果如下。
此时,可以在 Druid 提供的监控页面上对数据源、SQL、Web应用等等进行监控。当然项目中也就可以采用 Druid 数据库连接池来进行数据库操作了。
至此,Spring Boot 项目集成 Druid 连接池就已完成。
2.2.?Spring Boot 集成 HikariCP?连接池
HikariCP 号称史上最快的,在 Spring Boot2.0 版本中,由于 HikariCP 提供了卓越的性能,默认数据库池技术已从 Tomcat jdbc-pool切换到 HikariCP。
2.2.1.?引入依赖
由于 Spring Boot2.0 版本中,已经默认采用 HikariCP 数据库连接池技术,所以不需要单独引入 HikariCP 的依赖,默认情况下 spring-boot-starter-jdbc 或者 spring-boot-starter-data-jpa 会依赖进来。
2.2.2.?添加?HikariCP?配置
# 数据源类别
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 连接池名字
spring.datasource.hikari.pool-name=GrowUpHikariCP
# 最小空闲连接数量
spring.datasource.hikari.minimum-idle=10
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=600000
# 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=10
# 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
# 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
由于 HikariCP 是默认依赖,所以以上配置依据实际需要而定,皆非必须配置。
2.2.3.?集成验证
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.SQLException;
@SpringBootTest
class DataSourceTests {
@Autowired
private DataSource dataSource;
@Test
public void hikariDataSourceTest() throws SQLException {
System.out.println(dataSource.getConnection());
}
}
程序跑起来,输出如下。
至此,Spring Boot 集成 HikariCP 连接池已完毕,由于 Spring Boot 2.0 版本及以后版本默认都采用 ?HikariCP 连接池,几乎没有添加什么代码与配置,就轻松使用上了 HikariCP,可谓快哉。
3.?例行回顾
本文是 Spring Boot 项目集成篇的讲解,主要分享了如下部分:
Spring Boot 开箱即用的 starter 作用及分类?
Spring Boot 项目如何访问数据库?
Spring Boot 项目如何集成 Druid 连接池?
Spring Boot 项目如何集成 HikariCP 连接池?
玩转 Spring Boot 集成 MySQL、集成常用连接池组件就写到这里,希望大家能够喜欢。一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享,欢迎关注,敬请期待!
参考资料:
https://spring.io/
https://start.spring.io/
https://spring.io/projects/spring-boot
https://github.com/spring-projects/spring-boot
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
https://stackoverflow.com/questions/tagged/spring-boot
《Spring Boot实战》《深入浅出Spring Boot 2.x》
《一步一步学Spring Boot:微服务项目实战(第二版)》
《Spring Boot揭秘:快速构建微服务体系》