druid是阿里巴巴开源的数据库连接池,提供了优秀的对数据库操作的监控功能,本文要讲解一下springboot项目怎么集成druid。
本文在基于jpa的项目下开发,首先在pom文件中额外加入druid依赖,pom文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<?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>
<groupid>com.dalaoyang</groupid>
<artifactid>springboot_druid</artifactid>
<version> 0.0 . 1 -snapshot</version>
<packaging>jar</packaging>
<name>springboot_druid</name>
<description>springboot_druid</description>
<parent>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-parent</artifactid>
<version> 1.5 . 12 .release</version>
<relativepath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceencoding>utf- 8 </project.build.sourceencoding>
<project.reporting.outputencoding>utf- 8 </project.reporting.outputencoding>
<java.version> 1.8 </java.version>
</properties>
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-devtools</artifactid>
<scope>runtime</scope>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<scope>runtime</scope>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid</artifactid>
<version> 1.0 . 28 </version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
</plugin>
</plugins>
</build>
</project>
|
application.properties上半段和整合jpa一点没变,下面加入了一些druid的配置,如果对druid的配置有什么不理解的,可以去网上查一下。(这篇文章我觉得写的很好,传送门)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#端口号
server.port= 8888
##validate 加载hibernate时,验证创建数据库表结构
##create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
##create-drop 加载hibernate时创建,退出是删除表结构
##update 加载hibernate自动更新数据库结构
##validate 启动时验证表的结构,不会创建表
##none 启动时不做任何操作
spring.jpa.hibernate.ddl-auto=create
##控制台打印sql
spring.jpa.show-sql= true
##数据库配置
##数据库地址
spring.datasource.url=jdbc:mysql: //localhost:3306/test?characterencoding=utf8&usessl=false
##数据库用户名
spring.datasource.username=root
##数据库密码
spring.datasource.password=root
##数据库驱动
spring.datasource.driver- class -name=com.mysql.jdbc.driver
#这里是不同的
#使用druid的话 需要多配置一个属性spring.datasource.type
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 1 from dual
spring.datasource.testwhileidle= true
spring.datasource.testonborrow= false
spring.datasource.testonreturn= false
# 打开pscache,并且指定每个连接上pscache的大小
spring.datasource.poolpreparedstatements= true
spring.datasource.maxpoolpreparedstatementperconnectionsize= 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计, 'wall' 用于防火墙
spring.datasource.filters=stat,wall,log4j
# 通过connectproperties属性来打开mergesql功能;慢sql记录
|
然后在项目中加入druidconfig,简单讲解一下,这个配置文件主要是加载application.properties的配置,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
package com.dalaoyang.config;
import java.sql.sqlexception;
import javax.sql.datasource;
import org.apache.log4j.logger;
import org.springframework.beans.factory.annotation.value;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation.primary;
import com.alibaba.druid.pool.druiddatasource;
/**
* @author dalaoyang
* @description
* @project springboot_learn
* @package com.dalaoyang.config
* @email yangyang@dalaoyang.cn
* @date 2018/4/12
*/
@configuration
public class druidconfig {
private logger logger = logger.getlogger( this .getclass());
@value ( "${spring.datasource.url}" )
private string dburl;
@value ( "${spring.datasource.username}" )
private string username;
@value ( "${spring.datasource.password}" )
private string password;
@value ( "${spring.datasource.driver-class-name}" )
private string driverclassname;
@value ( "${spring.datasource.initialsize}" )
private int initialsize;
@value ( "${spring.datasource.minidle}" )
private int minidle;
@value ( "${spring.datasource.maxactive}" )
private int maxactive;
@value ( "${spring.datasource.maxwait}" )
private int maxwait;
@value ( "${spring.datasource.timebetweenevictionrunsmillis}" )
private int timebetweenevictionrunsmillis;
@value ( "${spring.datasource.minevictableidletimemillis}" )
private int minevictableidletimemillis;
@value ( "${spring.datasource.validationquery}" )
private string validationquery;
@value ( "${spring.datasource.testwhileidle}" )
private boolean testwhileidle;
@value ( "${spring.datasource.testonborrow}" )
private boolean testonborrow;
@value ( "${spring.datasource.testonreturn}" )
private boolean testonreturn;
@value ( "${spring.datasource.poolpreparedstatements}" )
private boolean poolpreparedstatements;
@value ( "${spring.datasource.maxpoolpreparedstatementperconnectionsize}" )
private int maxpoolpreparedstatementperconnectionsize;
@value ( "${spring.datasource.filters}" )
private string filters;
@value ( "{spring.datasource.connectionproperties}" )
private string connectionproperties;
@bean
@primary //主数据源
public datasource datasource(){
druiddatasource datasource = new druiddatasource();
datasource.seturl( this .dburl);
datasource.setusername(username);
datasource.setpassword(password);
datasource.setdriverclassname(driverclassname);
//configuration
datasource.setinitialsize(initialsize);
datasource.setminidle(minidle);
datasource.setmaxactive(maxactive);
datasource.setmaxwait(maxwait);
datasource.settimebetweenevictionrunsmillis(timebetweenevictionrunsmillis);
datasource.setminevictableidletimemillis(minevictableidletimemillis);
datasource.setvalidationquery(validationquery);
datasource.settestwhileidle(testwhileidle);
datasource.settestonborrow(testonborrow);
datasource.settestonreturn(testonreturn);
datasource.setpoolpreparedstatements(poolpreparedstatements);
datasource.setmaxpoolpreparedstatementperconnectionsize(maxpoolpreparedstatementperconnectionsize);
try {
datasource.setfilters(filters);
} catch (sqlexception e) {
logger.error( "druid configuration exception" , e);
}
datasource.setconnectionproperties(connectionproperties);
return datasource;
}
}
|
然后创建druidfilter,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.dalaoyang.filter;
import javax.servlet.annotation.webfilter;
import javax.servlet.annotation.webinitparam;
import com.alibaba.druid.support.http.webstatfilter;
/**
* @author dalaoyang
* @description
* @project springboot_learn
* @package com.dalaoyang.filter
* @email yangyang@dalaoyang.cn
* @date 2018/4/12
*/
@webfilter (filtername= "druidwebstatfilter" ,urlpatterns= "/*" ,
initparams={
@webinitparam (name= "exclusions" ,value= "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*" ) //忽略资源
}
)
public class druidfilter extends webstatfilter {
}
|
新建druidservlet,在类上面加注解@webservlet,其中配置了登录druid监控页面的账号密码,白名单黑名单之类的配置,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.dalaoyang.servlet;
import javax.servlet.annotation.webinitparam;
import javax.servlet.annotation.webservlet;
import com.alibaba.druid.support.http.statviewservlet;
/**
* @author dalaoyang
* @description
* @project springboot_learn
* @package com.dalaoyang.servlet
* @email yangyang@dalaoyang.cn
* @date 2018/4/12
*/
@webservlet (urlpatterns= "/druid/*" ,
initparams={
@webinitparam (name= "allow" ,value= "" ), // ip白名单(没有配置或者为空,则允许所有访问)
@webinitparam (name= "deny" ,value= "" ), // ip黑名单 (deny优先于allow)
@webinitparam (name= "loginusername" ,value= "admin" ), // 登录druid管理页面用户名
@webinitparam (name= "loginpassword" ,value= "admin" ) // 登录druid管理页面密码
})
public class druidservlet extends statviewservlet {
}
|
然后在启动类加入注解@servletcomponentscan,让项目扫描到servlet,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.dalaoyang;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.boot.web.servlet.servletcomponentscan;
@springbootapplication
// 启动类必须加入@servletcomponentscan注解,否则无法扫描到servlet
@servletcomponentscan
public class springbootdruidapplication {
public static void main(string[] args) {
springapplication.run(springbootdruidapplication. class , args);
}
}
|
剩余的就是和整合jpa一样的entity(实体类),repository(数据操作层),controller(测试使用的controller),直接展示代码。
city
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package com.dalaoyang.entity;
import javax.persistence.*;
/**
* @author dalaoyang
* @description
* @project springboot_learn
* @package com.dalaoyang.entity
* @email 397600342@qq.com
* @date 2018/4/7
*/
@entity
@table (name= "city" )
public class city {
@id
@generatedvalue (strategy=generationtype.auto)
private int cityid;
private string cityname;
private string cityintroduce;
public city( int cityid, string cityname, string cityintroduce) {
this .cityid = cityid;
this .cityname = cityname;
this .cityintroduce = cityintroduce;
}
public city(string cityname, string cityintroduce) {
this .cityname = cityname;
this .cityintroduce = cityintroduce;
}
public city() {
}
public int getcityid() {
return cityid;
}
public void setcityid( int cityid) {
this .cityid = cityid;
}
public string getcityname() {
return cityname;
}
public void setcityname(string cityname) {
this .cityname = cityname;
}
public string getcityintroduce() {
return cityintroduce;
}
public void setcityintroduce(string cityintroduce) {
this .cityintroduce = cityintroduce;
}
}
|
cityrepository
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.dalaoyang.repository;
import com.dalaoyang.entity.city;
import org.springframework.data.jpa.repository.jparepository;
/**
* @author dalaoyang
* @description
* @project springboot_learn
* @package com.dalaoyang.repository
* @email 397600342@qq.com
* @date 2018/4/7
*/
public interface cityrepository extends jparepository<city,integer> {
}
|
citycontroller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package com.dalaoyang.controller;
import com.dalaoyang.entity.city;
import com.dalaoyang.repository.cityrepository;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;
/**
* @author dalaoyang
* @description
* @project springboot_learn
* @package com.dalaoyang.controller
* @email 397600342@qq.com
* @date 2018/4/7
*/
@restcontroller
public class citycontroller {
@autowired
private cityrepository cityrepository;
//http://localhost:8888/savecity?cityname=北京&cityintroduce=中国首都
@getmapping (value = "savecity" )
public string savecity(string cityname,string cityintroduce){
city city = new city(cityname,cityintroduce);
cityrepository.save(city);
return "success" ;
}
//http://localhost:8888/deletecity?cityid=2
@getmapping (value = "deletecity" )
public string deletecity( int cityid){
cityrepository.delete(cityid);
return "success" ;
}
//http://localhost:8888/updatecity?cityid=3&cityname=沈阳&cityintroduce=辽宁省省会
@getmapping (value = "updatecity" )
public string updatecity( int cityid,string cityname,string cityintroduce){
city city = new city(cityid,cityname,cityintroduce);
cityrepository.save(city);
return "success" ;
}
//http://localhost:8888/getcitybyid?cityid=3
@getmapping (value = "getcitybyid" )
public city getcitybyid( int cityid){
city city = cityrepository.findone(cityid);
return city;
}
}
|
然后启动项目,可以看到控制台已经创建了city表。
然后访问http://localhost:8888/druid,可以看到如下图:
输入账号密码admin,admin,如下图
然后这时我们可以访问http://localhost:8888/savecity?cityname=北京&cityintroduce=中国首都
然后点击导航上面的sql监控,如下图,
从上图可以看到启动项目创建表的sql已经刚刚执行的sql。到这里整合已经完成了。
源码下载 :https://gitee.com/dalaoyang/springboot_learn
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://juejin.im/post/5aceec94f265da2395315d68