SpringBoot数据访问配置


一、简介

对于数据访问层而言,无论是SQL还是NOSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多繁琐的设置。引入各种xxxTemplate,xxxRepository来简化对数据访问层的操作。对于使用者来说只需要进行简单地设置即可。

SpringData是一个用于简化数据库访问,并支持云服务的开源框架。主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算机数据服务。

无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。

二、特性

  1. 强大的存储库和自定义对象映射抽象
  2. 从存储库方法名称派生动态查询
  3. 实现域基类提供基本属性
  4. 支持透明审核(创建,最后更改)
  5. 可以集成自定义存储库代码
  6. 通过JavaConfig和自定义XML命名空间轻松实现Spring集成
  7. 与Spring MVC控制器的高级集成
  8. 跨存储持久性的实验支持

三、主要模块

Spring Data主要使用的一些模块,根据需要选择对应的一些功能模块。

  1. Spring Data common- 支持每个Spring Data模块的Core Spring概念。
  2. Spring Data JDBC- 对JDBC的Spring Data存储库支持。
  3. Spring Data JPA - 对JPA的Spring Data存储库支持。
  4. Spring Data MongoDB - 对MongoDB的基于Spring对象文档的存储库支持。
  5. Spring Data Redis - 从Spring应用程序轻松配置和访问Redis。
  6. Spring Data JDBC Ext- 支持标准JDBC的数据库特定扩展,包括对Oracle RAC快速连接故障转移的支持,AQ JMS支持以及对使用高级数据类型的支持。
  7. Spring Data KeyValue - Map基于库和SPI轻松建立键值存储一个Spring数据模块。
  8. Spring Data LDAP - 对Spring LDAP的 Spring Data存储库支持。
  9. Spring Data REST- 将Spring Data存储库导出为超媒体驱动的RESTful资源。
  10. Spring Data for Pivotal GemFire - 轻松配置和访问Pivotal GemFire,实现高度一致,低延迟/高吞吐量,面向数据的Spring应用程序。
  11. Spring Data for Apache Cassandra- 轻松配置和访问Apache Cassandra或大规模,高可用性,面向数据的Spring应用程序。
  12. Spring Data for Apace Geode- 轻松配置和访问Apache Geode,实现高度一致,低延迟,面向数据的Spring应用程序。
  13. Spring Data for Apache Solr- 为面向搜索的Spring应用程序轻松配置和访问Apache Solr。

四、SpringBoot整合基本JDBC与数据源

SpringBoot整个JDBC与数据源的主要步骤如下:

  1. 引入starter依赖
    • spring-boot-starter-jdbc
  2. 配置application.yml
  3. 测试
  4. 数据源配置:使用druid数据源
    • 引入druid依赖
    • 配置属性
  5. 配置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监控查看相关的运行结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值