Druid简介一、boot结构二、集成示例
1.1、引入依赖1.2、配置文件application.properties1.3、编写druid配置类1.4、启动类扫描mapper包1.5、实体类1.6、Mybatis的xml方式
1.6.1、controller1.6.2、service1.6.3、mapper接口和xml文件 1.7、Mybatis的注解方式 三、效果:
1.1、druid监控1.2、控制台效果
Druid简介
Druid是阿里出品的。
Druid是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能。
官方文档(英文):https://github.com/alibaba/druid/
官方归纳driud的常见问题
本文 springboot 2.3.7.RELEASE + (mybatis2.1.3 +pagehelper)
来整合 Druid(1.1.22) 连接池
一、boot结构
表数据
1.2、配置文件application.propertiescom.alibaba druid-spring-boot-starter 1.1.22 mysql mysql-connector-java 8.0.19 org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.3 com.github.pagehelper pagehelper-spring-boot-starter 1.2.12 org.apache.commons commons-lang3 ${commons-lang3.version}
MySQL+druid+mybatis+pagehelper 详细配置
# 应用名称 spring.application.name=springtaskdemo # 应用服务 WEB 访问端口 server.port=8080 #======================↓↓↓↓↓↓↓↓↓↓↓↓↓↓======================================= # 配置数据源 mysql8 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&rewriteBatchedStatements=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver # ===== ↓使用druid数据源↓ ======== # 注明:druid连接池springboot暂无法默认支持,需要自己配置bean # 连接池类型 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=60000 # 连接是否有效的查询语句(心跳语句) spring.datasource.validationQuery=SELECt 1 FROM DUAL #........开始................. # testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle # 保证每次获取连接时候都要到数据库验证连接有效性, 这在高并发的时候会造成性能下降,可以将testOnBorrow设置成false,testWhileIdle设置成true这样能获得比较好的性能 # testWhileIdle默认true,则验证这条连接是否可用。 spring.datasource.testWhileIdle=true # testOnBorrow默认为false,当应用向连接池申请连接时,连接池会判断这条连接是否是可用的 spring.datasource.testonBorrow=false spring.datasource.testonReturn=false #.........结束................ # *********开始*********** #开发时候打开,上线关闭。poolPreparedStatements有可能会导致oom。内存泄露 #打开PSCache,并且指定每个连接上PSCache(游标)的大小 【poolPreparedStatements默认为 false】 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 生产环境中不要开启Druid的removeAbandoned配置,【默认fasle,开发调试用true】 spring.datasource.removeAbandoned=true # *********结束*********** # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,【 'stat':监控统计 'wall':用于防火墙,防御sql注入 'slf4j':日志 】 spring.datasource.filters=stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 #useGlobalDataSourceStat: true # 合并多个DruidDataSource的监控数据(多数据源) # SQL监控后台登录用户名-自定义 spring.datasource.loginUsername:admin # SQL监控后台登录用户密码-自定义 spring.datasource.loginPassword:admin #====================↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑=================================================== #======================↓↓↓↓mybatis配置-开始↓↓↓↓====================== # 映射文件xml的位置 mybatis.mapper-locations=classpath:mapper/*Mapper.xml # 使全局的映射器启用或禁用缓存 mybatis.configuration.cache-enabled=true # 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 mybatis.configuration.lazy-loading-enabled=true # 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 mybatis.configuration.aggressive-lazy-loading=false # 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) 默认:true mybatis.configuration.multiple-result-sets-enabled=true # 是否可以使用列的别名 (取决于驱动的兼容性) 默认:true mybatis.configuration.use-column-label=true # 指定MyBatis如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 mybatis.configuration.auto-mapping-behavior=partial # 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) mybatis.configuration.default-executor-type=simple # sql执行时间超时时间 mybatis.configuration.default-statement-timeout=25 # 允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。 mybatis.configuration.safe-row-bounds-enabled=false # 是否使用驼峰命名法转换字段 mybatis.configuration.map-underscore-to-camel-case=false # 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) 默认:session mybatis.configuration.local-cache-scope=session # 设置当JDBC类型为空时,某些驱动程序 要指定值,默认:OTHER。当写入null值的字段时,部分数据库需要指定null的数据类型.mysql不用设置。【oracle需要设置】对应org.apache.ibatis.type.JdbcType的枚举值 mybatis.configuration.jdbc-type-for-null=other # 指定对象哪个的方法触发一次延迟加载 mybatis.configuration.lazy-load-trigger-methods=equals,clone,hashCode,toString # [默认false,推荐使用true] 如果数据为空的字段,则该字段省略不显示,查询数据映射数据类型使用的是Map。当字段值为null时,mybatis映射返回字段的时候会忽略,而原接口是null值也返回,为了兼容,需要设置不忽略null字段 mybatis.configuration.call-setters-on-nulls=true # mybatis指定日志输出的前缀 mybatis.configuration.log-prefix=mybatis_ # 打印sql-开发时启用,会影响性能【使用boot默认的logback】 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 将java类型(javaType)转化为jdbc类型(jdbcType),或者将jdbc类型(jdbcType)转化为java类型(javaType)。【这个参数还没搞得很明白】 # mybatis.type-handlers-package=com.mapper.typehandler # 允许JDBC生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 默认:false # mybatis.configuration.use-generated-keys=false # 指定代理工厂:mybatis 实现2个:CglibProxyFactory和JavassistProxyFactory(默认) # mybatis.configuration.proxy-factory=CGLIB #====================↑↑↑↑↑mybatis配置-结束↑↑↑↑↑↑=================================================== # pagehelper分页插件 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql1.3、编写druid配置类
package sqy.springtaskdemo.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
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;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
@Value("${spring.datasource.loginUsername}")
private String loginUsername;
@Value("${spring.datasource.loginPassword}")
private String loginPassword;
@Bean
public ServletRegistrationBean druidServlet() {
// 注册服务
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
// 添加过滤规则
Map initParams = new HashMap<>(1);
// 设置忽略请求
initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
@Bean(name = "transactionManager")
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public DruidStatInterceptor druidStatInterceptor() {
DruidStatInterceptor dsInterceptor = new DruidStatInterceptor();
return dsInterceptor;
}
@Bean
@Scope("prototype")
public JdkRegexpMethodPointcut druidStatPointcut() {
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
pointcut.setPattern("sqy.springtaskdemo.controller.*");
return pointcut;
}
@Bean
public DefaultPointcutAdvisor druidStatAdvisor(DruidStatInterceptor druidStatInterceptor, JdkRegexpMethodPointcut druidStatPointcut) {
DefaultPointcutAdvisor defaultPointAdvisor = new DefaultPointcutAdvisor();
defaultPointAdvisor.setPointcut(druidStatPointcut);
defaultPointAdvisor.setAdvice(druidStatInterceptor);
return defaultPointAdvisor;
}
}
1.4、启动类扫描mapper包
1.5、实体类
user表
package sqy.springtaskdemo.pojo;
public class User {
private Integer userId;
private String userName;
private String password;
//省略get、set、tostring
调度表
package sqy.springtaskdemo.pojo;
public class MyCronTask {
private Integer cronId;
private String cronTime;
//省略get、set、tostring
}
1.6、Mybatis的xml方式
1.6.1、controller
package sqy.springtaskdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import sqy.springtaskdemo.pojo.User;
import sqy.springtaskdemo.service.UserService;
import java.util.List;
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/findAllUser")
public void findAll() {
List list = userService.findAll();
System.out.println(list);
}
}
1.6.2、service
接口
package sqy.springtaskdemo.service;
import sqy.springtaskdemo.pojo.User;
import java.util.List;
public interface UserService {
List findAll();
}
实现
package sqy.springtaskdemo.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sqy.springtaskdemo.mapper.UserMapper;
import sqy.springtaskdemo.pojo.User;
import sqy.springtaskdemo.service.UserService;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public List findAll() {
return userMapper.findAll();
}
}
1.6.3、mapper接口和xml文件
mapper接口
package sqy.springtaskdemo.mapper;
import sqy.springtaskdemo.pojo.User;
import java.util.List;
public interface UserMapper {
List findAll();
}
xml文件
1.7、Mybatis的注解方式select * from user;
这边controller和service和上面类似,就省略了
不同就只有mapper接口,注解方式不需要xml文件。
但是还是推荐xml方式比较好
mapper接口
package sqy.springtaskdemo.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import sqy.springtaskdemo.pojo.MyCronTask;
import java.util.List;
public interface CronMapper {
//查找注解。还有delete、insert、update...
@Select("select * from cron_task")
@Results(id="cronMap",value={
@Result(id=true,column = "cron_id",property = "cronId"),
@Result(column = "cron_time",property = "cronTime"),
})
List findAll();
}
三、效果: 1.1、druid监控 1.2、控制台效果



