目录
一、整合JDBC1. 环境准备1. 创建数据库2. 创建SpringBoot项目3. IDEA连接数据库2. 编写数据库配置信息3. 编写测试类测试4. CRUD操作数据库1. JDBCTemplate简介2. CRUD测试二、整合Druid数据源1. Druid简介2. 部分基本配置参数3. 使用Durid数据源1. 导入依赖2. 切换数据源3. 设置数据源属性4. 使添加属性生效5. 配置Druid后台监控Servlet6. 配置Druid监控过滤器filter一、整合JDBC
1. 环境准备
1. 创建数据库
-- 创建数据库CREATE DATABASE springboot;-- 使用springboot数据库use springboot;-- 创建user表CREATE TABLE IF NOT EXISTS `user`(`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '身份号',`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',PRIMARY KEY (`id`))ENGINE=INNODB DEFAULT CHARSET=utf8-- 给user表插入数据INSERT INTO `user`(`id`,`name`,`pwd`) VALUES ('1','zsr',000204),('2','gcc',000421),('3','BaretH',200024);
创建完成后得到下表
2. 创建SpringBoot项目
首先创建一个springboot项目,勾选组件时勾选
JDBC API
和MySQL Driver
项目创建完成之后,发现导入了以下两个启动器,这就是SpringBoot和JDBC整合所需要的两个依赖
<!--JDBC--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--MySQL驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
3. IDEA连接数据库
打开我们刚刚创建的数据库
然后可以看到我们前面创建的user
表
2. 编写数据库配置信息
这里建议使用
.yaml
格式的数据文件,在resources
目录下,新建一个application.yaml
填写自己的数据库相关的信息:
spring:datasource:username: rootdata-password: 200024url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driver
其中在配置driver-class-name
时,有两个选择:
com.mysql.jdbc.Driver
是mysql-connector-java 5中的
com.mysql.cj.jdbc.Driver
是mysql-connector-java 6中的特性,相比5多了一个时区设置:serverTimezone
这里是mysql 8.0.21,因此需要添加时区设置
在设定时区的时候,如果设定serverTimezone=UTC,会比中国时间早8个小时
如果在中国,可以选择Asia
/Shanghai
或者Asia
/Hongkong
spring:datasource:username: rootpassword: 200024url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Driver
如果没有添加时区设置,则会报以下错误
3. 编写测试类测试
上述配置完成后,就可以直接使用了,因为SpringBoot已经默认帮我们进行了自动配置
我们接下来去测试类测试,SpringBoot提供了默认的数据源,我们只需要注入到spring容器中即可使用
package com.zsr;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.Connection;import java.sql.SQLException;@SpringBootTestclass Springboot05DataApplicationTests {//注入数据源@AutowiredDataSource dataSource;@Testvoid contextLoads() throws SQLException {//查看默认的数据源System.out.println(dataSource.getClass());//获得数据库连接Connection connection = dataSource.getConnection();System.out.println(connection);//关闭连接connection.close();}}
运行测试,出现如下结果即代表数据库连接成功
可以看到SpringBoot默认的数据源是class com.zaxxer.hikari.HikariDataSource
,即hikari
Hikari
快速,简单,可靠,spring boot2.0 已经将 HikariCP 做为了默认的数据源链接池,在官网测试中秒杀一切其他数据源,比如 commons-dbcp,tomcat,c3po,druid等
了解更过Hikari
数据源参考:/developer/article/1554345
4. CRUD操作数据库
有了数据源,就拿到了数据库连接,然后我们就可以使用原生的 JDBC 语句来操作数据库了
那么我们怎么操作数据库呢?
SpringBoot中,不需要使用第三方第数据库操作框架,如
MyBatis
等,Spring本身对原生的JDBC做了轻量级的封装:JdbcTemplate
1. JDBCTemplate简介
JdbcTemplate
是Spring对JDBC的封装,目的是使JDBC更加易于使用。
JdbcTemplate
是Spring的一部分,处理了资源的建立和释放;帮助我们避免一些常见的错误,比如忘了总要关闭连接。
它运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
数据库操作的所有 CRUD 方法都在 JdbcTemplate 中
Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了JdbcTemplate
放在了容器中,只需注入即可使用
JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的JdbcTemplateConfiguration
类
JdbcTemplate
主要提供以下几类方法:
execute
方法:可以用于执行任何SQL语句,一般用于执行DDL语句;update
方法及batchUpdate
方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;query
方法及queryForXXX
方法:用于执行查询相关语句;call
方法:用于执行存储过程、函数相关语句;2. CRUD测试
在主程序同级目录下新建一个包
controller
,其中新建JDBCController
类,执行数据库相关操作首先导入
web场景启动器
,导入web模块正常运行所依赖的组件
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
package com.zsr.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.List;import java.util.Map;@RestControllerpublic class JDBCController {@AutowiredJdbcTemplate jdbcTemplate;//查@GetMapping("/query")public List<Map<String, Object>> userList() {String sql = "select * from user";List<Map<String, Object>> users = jdbcTemplate.queryForList(sql);return users;}//增@GetMapping("/add")public String addUser() {String sql = "insert into springboot.user(id,name,pwd) values (4,'gpl','45678')";jdbcTemplate.update(sql);//自动提交事务return "添加成功";}//删@GetMapping("/delete/{id}")public String deleteUser(@PathVariable("id") int id) {String sql = "delete from springboot.user where id=?";jdbcTemplate.update(sql, id);//自动提交事务return "删除成功";}//改@GetMapping("/change/{id}")public String updateUser(@PathVariable("id") int id) {String sql = "update springboot.user set name=?,pwd=? where id=" + id;Object[] objects = new Object[2];objects[0] = "zml";objects[1] = "1213353";jdbcTemplate.update(sql, objects);//自动提交事务return "修改成功";}}
然后我们启动主程序进行测试,
首先查询所有用户信息,访问localhost:8080/query
,成功显示所有员工
然后增加一个4号用户,访问localhost:8080/add
然后刷新user
表,成功添加4号用户
再修改4号用户,访问localhost:8080/change/4
然后刷新user
表,成功修改4号用户
最后删除4号用户,访问localhost:8080/delete/4
然后刷新user
表,成功删除4号用户
二、整合Druid数据源
本实验环境基于上述整合
JDBC
实验环境
1. Druid简介
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。
Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目。Druid支持所有JDBC兼容的数据库,包括Oracle、MySQL、Derby、PostgreSQL、SQL Server、H2等。Druid在监控、可扩展性、稳定性和性能方面具有明显的优势。通过Druid提供的监控功能,可以实时观察数据库连接池和SQL查询的工作情况。使用Druid连接池,在一定程度上可以提高数据库的访问性能。
Druid
是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。
Druid
可以很好的监控 DB 池连接和 SQL 的执行情况,天然继承监控功能
Druid
已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
Github地址:/alibaba/druid/
2. 部分基本配置参数
com.alibaba.druid.pool.DruidDataSource
基本配置参数如下:
3. 使用Durid数据源
1. 导入依赖
<!-- /artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.1</version></dependency>
2. 切换数据源
在springboot配置文件中通过
spring.datasource.type
指定数据源
spring:datasource:username: rootpassword: 200024url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
启动上述测试类进行测试
可以看到数据源切换成功
3. 设置数据源属性
我们在基础的配置属性之外,可以添加
Druid
数据源的专有配置属性
spring:datasource:username: rootpassword: 200024url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource#Spring Boot 默认是不注入这些属性值的,需要自己绑定#druid 数据源专有配置initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true#配置监控统计拦截的filters# stat:监控统计# log4j:日志记录(需要导入log4j依赖)# wall:防御sql注入filters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
其中,监控统计拦截器配置了log4j
需要导入其依赖
<!--log4j--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency>
4. 使添加属性生效
为了使上述配置的druid特有数据源属性生效,我们创建自己的DruidDataSource并绑定配置文件中的属性参数,添加到容器中,而不再使用SpringBoot自动生成的Druid数据源
在主程序同级目录下新建一个config
包,在其中新建DruidConfig
类
package com.zsr.config;import com.alibaba.druid.pool.DruidDataSource;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import javax.sql.DataSource;@Configurationpublic class DruidConfig {@ConfigurationProperties(prefix = "spring.datasource") //将全局配置文件中前缀为spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中@Bean //将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建public DataSource druidDataSource() {return new DruidDataSource();}}
5. 配置Druid后台监控Servlet
Druid
数据源具有监控的功能,并内置提供了一个StatViewServlet
用于展示Druid的监控信息,包括提供监控信息展示的html页面提供监控信息的JSON API
开启Druid的监控功能,可以在应用运行期间,通过监控提供的多维度数据来分析使用数据库的运行情况,从而可以调整程序设计,以达到优化数据库访问性能的目的
接下来定义一个后台监控器,在DruidConfig
中新建一个方法statViewServlet()
首先要创建一个servlet
的bean:springboot中内置了servlet容器,我们要使用servlet,只需要用其提供的ServletRegistrationBean
注册一个servlet注入到spring容器中即可,不再需要web.xml
的配置
ServletRegistrationBean<StatViewServlet> servlet = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
ServletRegistrationBean
的有参构造函数中:
第一个参数为传入的servlet:这里传入Druid内置的StatViewServlet
;
第二个参数可以设置映射的路径:这里我们使用/druid/*
就是以前我们在web.xml
中配置的servlet-mapping
定义的请求路径
然后我们就可以执行servlet的相关操作,可以看到很多方法
这里设置一些初始化参数:
loginUsername
:StatViewServlet提供后台管理页面的登录用户名
loginPassword
:StatViewServlet提供后台管理页面的登录密码
allow
:设置允许访问的人
这些参数可以在StatViewServlet的父类ResourceServlet
中找到
最后返回servlet
对象即可
完整代码:
//配置Druid监控管理后台的Servlet;//注册到bean中@Beanpublic ServletRegistrationBean statViewServlet() {//创建一个servlet,并定义请求路径ServletRegistrationBean<StatViewServlet> servlet = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");//初始化参数设置:后台登录的账号密码、允许访问者HashMap<String, String> initParameters = new HashMap<>();initParameters.put("loginUsername", "admin");//key名固定,这些参数可以在StatViewServlet的父类ResourceServlet中找到initParameters.put("loginPassword", "123456");//key名固定,这些参数可以在StatViewServlet的父类ResourceServlet中找到initParameters.put("allow", "localhost");//设置允许访问的人:这里表示只有本机可以访问(后面参数为空则所有人都可以访问)//设置初始化参数servlet.setInitParameters(initParameters);//返回servletreturn servlet;}
测试:配置完成后,重启主程序,访问localhost:8080/druid
,会跳转到http://localhost:8080/druid/login.html
页面,这就是Druid
内置的展示后台管理监控的页面
然后输入我们刚才设置的用户名和密码,点击Sign in
进行登录
进入到后台管理页面
我们访问一下localhost:8080/query
,查询所有用户;然后查看SQL监控
,就可以看到我们刚刚执行的操作
查看SQL防火墙
也可以看到相关信息
6. 配置Druid监控过滤器filter
同servlet一样,springboot中内置了filter容器,我们要使用filter,只需要用其提供的
FilterRegistrationBean
注册一个filter注入到spring容器中即可,不再需要web.xml
的配置
同样在DruidConfig
中新增一个方法webStatFilter()
首先要创建一个filter
的bean
FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
ServletRegistrationBean
的有参构造函数中:
传入的参数是filter:这里传入用于用于配置Web和Druid数据源之间的管理关联监控统计的WebStatFilter()
;
然后我们就可以执行filter的相关操作,同样可以看到很多方法
这里同样设置初始化参数:
exclusions
:表示需要排除一些不必要的url请求
其他参数可以在WebStatFilter
中看到
最后返回filter即可
//配置Druid监控之web监控的filter//注册到bean中@Beanpublic FilterRegistrationBean webStatFilter() {//创建一个filterFilterRegistrationBean filter = new FilterRegistrationBean(new WebStatFilter());//初始化参数设置Map<String, String> initParams = new HashMap<>();initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计//设置初始化参数filter.setInitParameters(initParams);//添加过滤规则:/*表示过滤所有请求filter.setUrlPatterns(Arrays.asList("/*"));//返回filterreturn filter;}
更多的配置源码中很详细,实际开发中根据具体的需要进行相应的配置,这里只是举个例子~