Springboot—数据访问
目录
DataSourceAutoConfiguration:数据源的自动配置
JdbcTemplateAutoConfiguration:
SQL:
1.首先导入JDBC场景:
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-data-jdbc</artifactId>
-
</dependency>
2.然后我们导入驱动(数据库版本尽量与驱动版本保持一致):
-
<dependency>
-
<!-- 数据库版本最好与数据库版本一致:可以利用就近原则约定-->
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>5.1.49</version>
-
</dependency>
自动配置分析:
DataSourceAutoConfiguration:数据源的自动配置
public class DataSourceAutoConfiguration { public DataSourceAutoConfiguration() { }可以发现底层默认配置好的连接池为:HikariDataSource
protected static class PooledDataSourceConfiguration然后我们看看被数据源自动配置所绑定的DataSourceProperties:
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean { private ClassLoader classLoader; private boolean generateUniqueName = true; private String name; private Class<? extends DataSource> type; private String driverClassName; private String url; private String username; private String password; private String jndiName;所以说我们可以用yml对数据源驱动进行配置(以spring.datasource.xxx进行配置)
spring: datasource: url: jdbc:mysql://localhost:3306/db_account username: root password: 123456 driver-class-name: com.mysql.jdbc.DriverJdbcTemplateAutoConfiguration:
JdbcTemplate的自动配置,里面有对数据库的crud;
public class JdbcTemplateAutoConfiguration { public JdbcTemplateAutoConfiguration() { } }JdbcProperties中绑定了jdbc操作(以spring.jdbc.xxx在yml中配置):
扩:
public class JdbcProperties { private final JdbcProperties.Template template = new JdbcProperties.Template(); public JdbcProperties() { }
- DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置
- JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud
- 可以修改这个配置项@ConfigurationProperties(prefix = "spring.jdbc") 来修改JdbcTemplate
- @Bean@Primary JdbcTemplate;容器中有这个组件
- JndiDataSourceAutoConfiguration: jndi的自动配置
- XADataSourceAutoConfiguration: 分布式事务相关的
测试:
class Boot05WebAdminApplicationTests { JdbcTemplate jdbcTemplate; void contextLoads() { // jdbcTemplate.queryForObject("select * from account_tbl") // jdbcTemplate.queryForList("select * from account_tbl",) Long aLong = jdbcTemplate.queryForObject("select count(*) from account_tbl", Long.class); log.info("记录总数:{}",aLong); } }
Druid数据源:
这里放上druid的文档
在springboot中,我们不能像之前那样导入bean来配置数据源,或者在web.xml中通过servlet映射来配置功能了;
而是自定义Configuration,注册组件的方式或者通过yaml配置的方式来配置数据源增加配置功能;
DruidDataSourceAutoConfigure
可以发现它是要在DataSourceAutoConfiguration之前执行的,因为DataSourceAutoConfiguration里面配置了默认数据源,所以要先执行;
-
-
-
-
-
-
-
public class DruidDataSourceAutoConfigure {
-
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
-
-
public DruidDataSourceAutoConfigure() {
-
}
-
-
-
-
-
-
public DataSource dataSource() {
-
LOGGER.info("Init DruidDataSource");
-
return new DruidDataSourceWrapper();
-
}
-
}
然后我们看下关键的DruidStatProperties:
里面能够配置的东西有很多:以spring.datasource.druid为前缀,实现aoppatterns(监控springBean);还可以开启filters:stat,wall,slf4j等功能(全局性的,不是具体的)
大致有两个功能:1:StatViewServlet:配置监控页功能;2:WebStatFilter:监控web
-
-
-
public class DruidStatProperties {
-
private String[] aopPatterns;
-
private DruidStatProperties.StatViewServlet statViewServlet = new DruidStatProperties.StatViewServlet();
-
private DruidStatProperties.WebStatFilter webStatFilter = new DruidStatProperties.WebStatFilter();
-
-
public DruidStatProperties() {
-
}
-
-
public String[] getAopPatterns() {
-
return this.aopPatterns;
-
}
-
-
public void setAopPatterns(String[] aopPatterns) {
-
this.aopPatterns = aopPatterns;
-
}
-
-
public DruidStatProperties.StatViewServlet getStatViewServlet() {
-
return this.statViewServlet;
-
}
-
-
public void setStatViewServlet(DruidStatProperties.StatViewServlet statViewServlet) {
-
this.statViewServlet = statViewServlet;
-
}
-
-
public DruidStatProperties.WebStatFilter getWebStatFilter() {
-
return this.webStatFilter;
-
}
-
-
public void setWebStatFilter(DruidStatProperties.WebStatFilter webStatFilter) {
-
this.webStatFilter = webStatFilter;
-
}
-
-
public static class WebStatFilter {
-
private boolean enabled;
-
private String urlPattern;
-
private String exclusions;
-
private String sessionStatMaxCount;
-
private String sessionStatEnable;
-
private String principalSessionName;
-
private String principalCookieName;
-
private String profileEnable;}
-
-
public static class StatViewServlet {
-
private boolean enabled;
-
private String urlPattern;
-
private String allow;
-
private String deny;
-
private String loginUsername;
-
private String loginPassword;
-
private String resetEnable;}
-
在yml中实现对statviewServlet与webstatFilter的全局配置:
-
spring:
-
datasource:
-
url: jdbc:mysql://localhost:3306/db_account
-
username: Wuyuhang
-
password: 2002514wyh11
-
driver-class-name: com.mysql.jdbc.Driver
-
-
druid:
-
filters: stat,wall,slf4j #开启监控和防火墙and日志功能
-
stat-view-servlet: admin
-
login-password: 123456
-
reset-enable: false
-
#监控web应用
-
web-stat-filter:
-
enabled: true
-
url-pattern: /*
-
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
-
aop-patterns: com.atguigu.admin.*
DruidDataSourceAutoConfigure:
它在DruidDataSourceAutoConfigure类中被导入,作用:
你可以发现它里面导入了非常多的组件,监控、防火墙、日志slf4j等等:你可以自己配置这些功能,很明显它组件都用了@ConditionOnMissingBean,说明他是优先自定义的;
-
//
-
// Source code recreated from a .class file by IntelliJ IDEA
-
// (powered by FernFlower decompiler)
-
//
-
-
package com.alibaba.druid.spring.boot.autoconfigure.stat;
-
-
import com.alibaba.druid.filter.config.ConfigFilter;
-
import com.alibaba.druid.filter.encoding.EncodingConvertFilter;
-
import com.alibaba.druid.filter.logging.CommonsLogFilter;
-
import com.alibaba.druid.filter.logging.Log4j2Filter;
-
import com.alibaba.druid.filter.logging.Log4jFilter;
-
import com.alibaba.druid.filter.logging.Slf4jLogFilter;
-
import com.alibaba.druid.filter.stat.StatFilter;
-
import com.alibaba.druid.wall.WallConfig;
-
import com.alibaba.druid.wall.WallFilter;
-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.context.annotation.Bean;
-
-
public class DruidFilterConfiguration {
-
private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
-
private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
-
private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
-
private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
-
private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
-
private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
-
private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
-
private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";
-
private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";
-
-
public DruidFilterConfiguration() {
-
}
-
-
-
-
-
-
-
-
-
public StatFilter statFilter() {
-
return new StatFilter();
-
}
-
-
-
-
-
-
-
-
-
public ConfigFilter configFilter() {
-
return new ConfigFilter();
-
}
-
-
-
-
-
-
-
-
-
public EncodingConvertFilter encodingConvertFilter() {
-
return new EncodingConvertFilter();
-
}
-
-
-
-
-
-
-
-
-
public Slf4jLogFilter slf4jLogFilter() {
-
return new Slf4jLogFilter();
-
}
-
-
-
-
-
-
-
-
-
public Log4jFilter log4jFilter() {
-
return new Log4jFilter();
-
}
-
-
-
-
-
-
-
-
-
public Log4j2Filter log4j2Filter() {
-
return new Log4j2Filter();
-
}
-
-
-
-
-
-
-
-
-
public CommonsLogFilter commonsLogFilter() {
-
return new CommonsLogFilter();
-
}
-
-
-
-
-
-
-
-
-
public WallConfig wallConfig() {
-
return new WallConfig();
-
}
-
-
-
-
-
-
-
-
-
public WallFilter wallFilter(WallConfig wallConfig) {
-
WallFilter filter = new WallFilter();
-
filter.setConfig(wallConfig);
-
return filter;
-
}
-
}
这里是对stat、wall防火墙、slf4j等配置的详细配置:
-
//对上面的全局配置filters详细配置
-
filter:
-
stat: #对上面filters的详细配置
-
slow-sql-millis: 1000 #超过1000ms都为慢查询
-
log-slow-sql: true
-
enabled: true #是否开启
-
wall:
-
enabled: true
-
config:
-
drop-table-allow: false #防火墙阻止所有删表的操作
yml全部:
-
spring:
-
datasource:
-
url: jdbc:mysql://localhost:3306/db_account
-
username: root
-
password: 123456
-
driver-class-name: com.mysql.jdbc.Driver
-
-
druid:
-
aop-patterns: com.atguigu.admin.* #监控SpringBean
-
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
-
-
stat-view-servlet: # 配置监控页功能
-
enabled: true
-
login-username: admin
-
login-password: admin
-
resetEnable: false
-
-
web-stat-filter: # 监控web
-
enabled: true
-
urlPattern: /*
-
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
-
-
-
filter:
-
stat: # 对上面filters里面的stat的详细配置
-
slow-sql-millis: 1000
-
logSlowSql: true
-
enabled: true
-
wall:
-
enabled: true
-
config:
-
drop-table-allow: false
-
自定义实现监控页与监控功能:
还是一样的思想,按照上面的来,将自定义的StatViewServlet(监控视图)与WebStatFilter(监控)的组件注册到容器就可以了,要注意的是:分别要利用ServletRegisterationBean与FilterRegisterationBean去装载对应的组件然后实现功能,最后返回;
-
/**
-
* 配置 druid的监控页功能
-
* @return
-
*/
-
-
public ServletRegistrationBean statViewServlet(){
-
// statViewServlet就是监控视图响应
-
StatViewServlet statViewServlet = new StatViewServlet();
-
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
-
-
registrationBean.addInitParameter("loginUsername","admin");
-
registrationBean.addInitParameter("loginPassword","123456");
-
-
-
return registrationBean;
-
}
-
/**
-
* WebStatFilter 用于采集web-jdbc关联监控的数据。
-
*/
-
-
public FilterRegistrationBean webStatFilter(){
-
WebStatFilter webStatFilter = new WebStatFilter();
-
-
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
-
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
-
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
-
-
return filterRegistrationBean;
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfkacig
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24