1、Druid简介:
Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!
同时Druid不仅仅是一个数据库连接池,它包括四个部分:
Druid是一个JDBC组件,它包括三个部分:
-
基于Filter-Chain模式的插件体系。
-
DruidDataSource 高效可管理的数据库连接池。
-
SQLParser
2、Druid的功能
1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。
所以Druid可以:
-
1、充当数据库连接池
2、可以监控数据库访问性能3、获得SQL执行日志
3、SpringBoot使用Druid
- 首先创建一个SpringBoot应用,在创建项目时选择JDBC以及MySQL驱动,让SpringBoot自动装配所需组件
创建完成后默认的pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.guih</groupId>
<artifactId>spring-boot-data-jdbc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-data-jdbc</name>
<description>JDBC Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- SpringBoot集成的JDBC以及数据库连接包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
<!-- 配置log4j依赖,否则无法正常使用filters过滤器,无法统计SQL语句 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 创建 application.yml 文件,配置连接数据库的参数
spring:
datasource:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=false
#这里选择自定义的Druid数据源
type: com.alibaba.druid.pool.DruidDataSource
#初始化时建立物理连接的个数
initialSize: 5
#最小连接池数量
minIdle: 5
#最大连接池数量
maxActive: 20
#最大的等待时间,单位为毫秒。配置之后,默认启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
#用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
validationQuery: SELECT 1 FROM DUAL
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow: false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnReturn: false
#是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
poolPreparedStatements: true
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙!!!
#这里如果直接配置的话启动项目会报错,需要在pom文件中添加log4j日志框架的依赖!!!
filters: stat,wall,log4j
#每个连接PSCache大小
maxPoolPreparedStatementPerConnectionSize: 20
#默认多个DruidDataSource的监控数据是各自独立的,在Druid-0.2.17版本之后,支持配置公用监控数据,配置参数为useGlobalDataSourceStat
useGlobalDataSourceStat: true
#合并SQL以及通过日志记录执行速度大于500ms的SQL
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
- 创建对应的数据库以及编写JavaBean
/*
数据库建表语句
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`departmentName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
// JavaBean
package com.guih.data.mybatis.bean;
public class Department {
private Integer id;
private String departmentName;
public void setId(Integer id) {
this.id = id;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public Integer getId() {
return id;
}
public String getDepartmentName() {
return departmentName;
}
}
- 配置Druid监控
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druid() {
return new DruidDataSource();
}
// 管理后台的Servlet
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet(){
ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
Map<String,String> map = new HashMap<>();
map.put("loginUserName","admin");
map.put("loginPassword","123456");
map.put("allow","");// 允许全部访问
servletRegistrationBean.setInitParameters(map);
return servletRegistrationBean;
}
// web监控的Filter
@Bean
public FilterRegistrationBean<WebStatFilter> statFilter(){
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
filterRegistrationBean.setInitParameters(initParams);
filterRegistrationBean.setUrlPatterns(Collections.singletonList("/*"));
return filterRegistrationBean;
}
}
- 编写测试代码
@Controller
public class JDBCTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@RequestMapping("/query")
@ResponseBody
public Map<String, Object> query() {
List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT * FROM test1");
return list.get(0);
}
}
这里使用的数据库是本地数据库,数据库中只有一张表,表中数据如下
-
测试
启动SpringBoot程序后在浏览器输入 ”localhost:8080/druid“ 会自动跳转到以下页面,说明Druid的Servlet配置成功
在浏览器输入 ”localhost:8080/query“ 进行测试
查询结果正常,SQL监控也显示出来了到此,SpringBoot整合Druid数据源就完成了
4、整合Mybatis
- 在application.yml文件中设置mybatis配置文件
spring:
datasource:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# SpringBoot主程序启动时运行对应的Sql文件,第一次运行就可以了,也可以手动运行
# schema:
# - classpath:sql/department.sql
initialization-mode: always
# 在上面的配置文件基础上加上mybatis的配置
mybatis:
# 指定全局配置文件位置
config-location: classpath:mybatis/mybatis-config.xml
# 指定sql映射文件位置
mapper-locations: classpath:mybatis/mapper/*.xml
debug: true
- 编写Mapper文件(使用注解开发和使用配置文件的方式开发)
package com.guih.data.mybatis.mapper;
import com.guih.data.mybatis.bean.Department;
import org.apache.ibatis.annotations.*;
//@Mapper
// 在SpringBoot启动的主程序上配置有Mapper扫描,所以这里不用再次使用
public interface DepartmentMapper {
// 使用注解开发
@Options(useGeneratedKeys = true,keyProperty = "id")
@Insert("insert into department(departmentName) values(#{departmentName})")
void insertDepartment(Department department);
@Select("select * from department where id = #{id}")
Department queryByID(Integer id);
// 使用配置文件
Department queryDept(Integer id);
}
编写完Mapper以后使用注解开发的话是已经可以使用了,但是我们这里注解和配置一起使用,所以还需要编写Mapper.xml文件
- 编写对应的Mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.guih.data.mybatis.mapper.DepartmentMapper">
<!-- 这里对应着上面Mapper.java文件中的最后一个方法 -->
<select id="queryDept" parameterType="java.lang.Integer" resultType="com.guih.data.mybatis.bean.Department">
select * from department where id=#{id}
</select>
</mapper>
- 编写Controller层进行测试
package com.guih.data.mybatis.controller;
import com.guih.data.mybatis.bean.Department;
import com.guih.data.mybatis.mapper.DepartmentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CRUDController {
@Autowired
private DepartmentMapper departmentMapper;
// 这个方法是使用注解开发
@GetMapping("/dept")
public Department insertDept(Department department) {
departmentMapper.insertDepartment(department);
return department;
}
// 这个方法使用的是配置文件的方式
@GetMapping("/dept/{id}")
public Department queryDept(@PathVariable("id") Integer id) {
return departmentMapper.queryDept(id);
}
}
- 进行测试
通过测试可以看到,无论是注解开发的还是使用配置文件来配置的都是可以进行对应的操作。
到此SpringBoot整合Druid数据源使用Mybatis就成功了。在最后放上项目的目录截图。