一、简介
对于数据访问层而言,无论是SQL还是NOSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多繁琐的设置。引入各种xxxTemplate,xxxRepository来简化对数据访问层的操作。对于使用者来说只需要进行简单地设置即可。
SpringData是一个用于简化数据库访问,并支持云服务的开源框架。主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算机数据服务。
无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。
二、特性
- 强大的存储库和自定义对象映射抽象
- 从存储库方法名称派生动态查询
- 实现域基类提供基本属性
- 支持透明审核(创建,最后更改)
- 可以集成自定义存储库代码
- 通过JavaConfig和自定义XML命名空间轻松实现Spring集成
- 与Spring MVC控制器的高级集成
- 跨存储持久性的实验支持
三、主要模块
Spring Data主要使用的一些模块,根据需要选择对应的一些功能模块。
- Spring Data common- 支持每个Spring Data模块的Core Spring概念。
- Spring Data JDBC- 对JDBC的Spring Data存储库支持。
- Spring Data JPA - 对JPA的Spring Data存储库支持。
- Spring Data MongoDB - 对MongoDB的基于Spring对象文档的存储库支持。
- Spring Data Redis - 从Spring应用程序轻松配置和访问Redis。
- Spring Data JDBC Ext- 支持标准JDBC的数据库特定扩展,包括对Oracle RAC快速连接故障转移的支持,AQ JMS支持以及对使用高级数据类型的支持。
- Spring Data KeyValue - Map基于库和SPI轻松建立键值存储一个Spring数据模块。
- Spring Data LDAP - 对Spring LDAP的 Spring Data存储库支持。
- Spring Data REST- 将Spring Data存储库导出为超媒体驱动的RESTful资源。
- Spring Data for Pivotal GemFire - 轻松配置和访问Pivotal GemFire,实现高度一致,低延迟/高吞吐量,面向数据的Spring应用程序。
- Spring Data for Apache Cassandra- 轻松配置和访问Apache Cassandra或大规模,高可用性,面向数据的Spring应用程序。
- Spring Data for Apace Geode- 轻松配置和访问Apache Geode,实现高度一致,低延迟,面向数据的Spring应用程序。
- Spring Data for Apache Solr- 为面向搜索的Spring应用程序轻松配置和访问Apache Solr。
四、SpringBoot整合基本JDBC与数据源
SpringBoot整个JDBC与数据源的主要步骤如下:
- 引入starter依赖
- spring-boot-starter-jdbc
- 配置application.yml
- 测试
- 数据源配置:使用druid数据源
- 引入druid依赖
- 配置属性
- 配置druid数据源监控
SpringBoot整合JDBC
引入JDBC+MySQL依赖
<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>
application配置文件
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.110.128:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
测试默认的数据源
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDataJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
System.out.println("数据源=========" + dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println("连接=======" + connection);
System.out.println("连接URL=======" + connection.getMetaData().getURL());
System.out.println("用户名=======" + connection.getMetaData().getUserName());
System.out.println("驱动名称=======" + connection.getMetaData().getDriverName());
connection.close();
}
}
数据源=========class org.apache.tomcat.jdbc.pool.DataSource
连接=======ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@2eb917d0]]
连接URL=======jdbc:mysql://192.168.110.128:3306/jdbc
用户名=======root@192.168.110.1
驱动名称=======MySQL Connector Java
由上可知,默认是用org.apache.tomcat.jdbc.pool.DataSource
作为数据源
数据源的相关配置都在DataSourceProperties
里面;
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties
implements BeanClassLoaderAware, EnvironmentAware, InitializingBean {
private ClassLoader classLoader;
private Environment environment;
/**
* Name of the datasource.
*/
private String name = "testdb";
/**
* Generate a random datasource name.
*/
private boolean generateUniqueName;
/**
* Fully qualified name of the connection pool implementation to use. By default, it
* is auto-detected from the classpath.
*/
private Class<? extends DataSource> type;
/**
* Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
*/
private String driverClassName;
/**
* JDBC url of the database.
*/
private String url;
/**
* Login user of the database.
*/
private String username;
/**
* Login password of the database.
*/
private String password;
自动配置原理:
1、参考DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以使用spring.datasource.type指定自定义的数据源类型;
2、SpringBoot默认可以支持的数据源如下:
org.apache.tomcat.jdbc.pool.DataSource
com.zaxxer.hikari.HikariDataSource
org.apache.commons.dbcp.BasicDataSource
org.apache.commons.dbcp2.BasicDataSource
3、自定义数据源类型
/**
* Generic DataSource configuration.
*/
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
//使用DataSourceBuilder创建数据源,利用反射创建相应type的数据源,并绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}
4、DataSourceInitializer:ApplicationListener
该类的主要作用为
- runSchemaScripts()——运行建表语句;
- runDataScripts()——运行插入数据的sql语句
默认只需要将文件命名为:
schema-*.sql、data-*.sql
默认规则:schema.sql、schema-all.sql
可以使用
schema:
- classpath: department.sql
- classpath: user.sql
指定sql文件的位置
5、操作数据库:自动配置了JdbcTemplate操作数据库
SpringBoot整合Druid数据源
1、切换Druid数据源
Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource
数据源。为了整合Druid必须手动切换数据源,可通过以下方式进行切换:
从 Spring Boot官方文档可知,通过 spring.datasource.type 指定数据源
spring.datasource.type= # Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath.
2、配置Druid数据源参数
通过spring.datasource.type=com.alibab.druid.pool.DruidDataSurce
即可将数据源切换到Druid,数据源切换成功后,需要考虑设置相关的参数,就像以前的C3P0、dbcp一样需要设置数据源连接初始化大小、最大连接数、等待时间、最小连接数以及数据库监控等参数。
Druid数据源参数配置在全局配置文件中,具体参数详情见DruidDataSource配置属性列表如下图所示:
由上图,其中标绿框中的属性对应的是com.alibaba.druid.pool.DruidDataSource中的属性,虽然成功切换到了Druid数据源,并配置了Druid参数,SpringBoot会自动生产DruidDataSource并放入容器中,但是他并不会自动绑定配置文件中的参数
如下所示:
如上图可知,在全局配置文件中,关于Druid的相关配置都没有自动生效。所以需要自己为com.alibaba.druid.pool.DruidDataSource绑定全局配置文件中的参数,再添加到容器中,相关的配置才会生效。
自行添加DruidDataSource组件到容器中,并绑定相关的属性、配置Druid相关的监控:
/**
* Druid 数据源配置类
* 将自定义的Druid数据源添加到容器中,不再使用SpringBoot自动配置
* 这样的目的是绑定全局配置文件中druid数据源属性到com.alibaba.druid.pool.DruidDataSource从而使其生效
*/
@Configuration
public class DruidConfig {
//将全局配置文件中,前缀为spring.dataspurce的属性注入到com.alibaba.druid.pool.DruidDataSource的同名参数中去
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//配置Druid的监控
//配置一个管理后台的Servlet
//Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装路由器时,人家也提供了一个默认的 web 页面
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initParams = new HashMap<>();
//以下这些参数都可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
//后台管理界面的登录账号
initParams.put("loginUsername","admin");
//后台管理界面的登录密码
initParams.put("loginPassword","123456");
//默认就是允许所有访问
initParams.put("allow","");
//拒绝访问的IP
initParams.put("deny","192.168.15.21");
//设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
/**
* 配置一个web监控的filter
* WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
*
* 这个过滤器的作用就是统计web应用请求中所有的数据库信息,比如 发出的sql语句,
* sql执行的时间、请求次数、请求的url地址、以及seesion监控、数据库表的访问次数等
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
// exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
// "/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
此时,可以获取容器中的 DataSource 转为 DruidDataSource ,然后取值看配置文件中的参数是否已经生效,如下所示:
由上图可知,druid相关的配置已经生效。
至此,SpringBoot整合Druid数据源已完成,可以运行应用,可以往后台发一些请求,同时进行一些关于数据库相关的sql操作,然后通过Druid监控查看相关的运行结果。