4.10。使用SQL数据库

从使用JdbcTemplate直接的JDBC访问到完整的“对象关系映射”技术(例如Hibernate),Spring框架为使用SQL数据库提供了广泛的支持。 Spring Data提供了更高级别的功能:直接从接口创建Repository实现,并使用约定从您的方法名称生成查询。

4.10.1。配置数据源

Java的javax.sql.DataSource接口提供了使用数据库连接的标准方法。传统上,“数据源”使用URL以及一些凭据来建立数据库连接。

嵌入式数据库支持

使用内存嵌入式数据库来开发应用程序通常很方便。显然,内存数据库不提供持久存储。您需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。

Spring Boot可以自动配置嵌入式H2HSQLDerby数据库。您无需提供任何连接URL。您只需要包含要使用的嵌入式数据库的构建依赖项即可。

如果您在测试中使用此功能,则可能会注意到,整个测试套件将重复使用同一数据库,而不管您使用的应用程序上下文有多少。如果要确保每个上下文都有一个单独的嵌入式数据库,则应设置spring.datasource.generate-unique-name为true。

例如,典型的POM依赖关系如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>

您需要依赖spring-jdbc才能自动配置嵌入式数据库。在此示例中,它通过spring-boot-starter-data-jpa引入。

如果出于某种原因确实为嵌入式数据库配置了连接URL,请确保禁用了数据库的自动关闭功能。如果您使用H2,则应该DB_CLOSE_ON_EXIT=FALSE这样做。如果使用HSQLDB,则应确保未使用shutdown=true。通过禁用数据库的自动关闭功能,Spring Boot可以控制何时关闭数据库,从而确保一旦不再需要访问数据库时就可以执行该操作。

连接到数据库

数据库连接也可以通过使用pooling DataSource进行自动配置。Spring Boot使用以下算法来选择特定的实现:

我们更喜欢HikariCP的性能和并发性。如果有HikariCP,我们总是选择它。

否则,如果Tomcat pooling DataSource可用,我们将使用它。

如果HikariCP和Tomcat pooling 数据源均不可用,并且Commons DBCP2可用,我们将使用它。

如果使用spring-boot-starter-jdbcspring-boot-starter-data-jpa“启动器”,则会自动获得对的依赖HikariCP

您可以完全绕过该算法,并通过设置spring.datasource.type属性来指定要使用的连接池。如果您在tomcat-jdbc默认情况下提供的Tomcat容器中运行应用程序,则这一点尤其重要。

其他连接池始终可以手动配置。如果定义自己的DataSource bean,则不会进行自动配置。

DataSource配置由spring.datasource.*中的外部配置属性控制。例如,您可以在application.properties中声明以下部分:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

您至少应通过设置spring.datasource.url属性来指定URL 。否则,Spring Boot会尝试自动配置嵌入式数据库。

您通常不需要指定driver-class-name,因为Spring Boot可以从url推导大多数数据库。

对于要创建的pooling DataSource,我们需要验证有效的Driver类是否可用,因此我们在进行任何操作之前都要进行检查。换句话说,如果您设置spring.datasource.driver-class-name=com.mysql.jdbc.Driver,则该类必须是可加载的。

请参阅DataSourceProperties以获取更多受支持的选项。这些是不管实际实现如何都起作用的标准选项。它也有可能微调特定实现的设置,使用各自的前缀(spring.datasource.hikari.*spring.datasource.tomcat.*,和spring.datasource.dbcp2.*)。有关更多详细信息,请参阅所用连接池实现的文档。

例如,如果使用Tomcat连接池,则可以自定义许多其他设置,如以下示例所示:

# Number of ms to wait before throwing an exception if no connection is available.
spring.datasource.tomcat.max-wait=10000 # Maximum number of active connections that can be allocated from this pool at the same time.
spring.datasource.tomcat.max-active=50 # Validate the connection before borrowing it from the pool.
spring.datasource.tomcat.test-on-borrow=true

参考源码:

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

连接到JNDI数据源

如果您将Spring Boot应用程序部署到Application Server,则可能要使用Application Server的内置功能来配置和管理DataSource,并使用JNDI对其进行访问。

spring.datasource.jndi-name属性可以被用来替代spring.datasource.urlspring.datasource.usernamespring.datasource.password属性来从一个特定的JNDI位置访问DataSource。例如,application.properties以下部分显示了如何访问JBoss AS定义的 DataSource:

spring.datasource.jndi-name=java:jboss/datasources/customers

4.10.2。使用JdbcTemplate

Spring的JdbcTemplateNamedParameterJdbcTemplate类是自动配置的,您可以通过@Autowire将它们直接放入自己的bean中,如以下示例所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component; @Component
public class MyBean { private final JdbcTemplate jdbcTemplate; @Autowired
public MyBean(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} // ... }

您可以使用spring.jdbc.template.*属性来自定义模板的某些属性,如以下示例所示:

spring.jdbc.template.max-rows=500

NamedParameterJdbcTemplate重复使用相同的JdbcTemplate。如果JdbcTemplate定义了多个,并且不存在主要候选对象,NamedParameterJdbcTemplate则不会自动配置。

参考源码:

org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration

4.10.3。JPA和Spring Data JPA

Java Persistence API是一种标准技术,可让您将对象“映射”到关系数据库。spring-boot-starter-data-jpa POM提供了上手的快捷方式。它提供以下关键依赖性:

  • Hibernate:最流行的JPA实现之一。
  • Spring Data JPA:使基于JPA的repositories的实现变得容易。
  • Spring ORM:Spring Framework提供的核心ORM支持。

实体类

传统上,JPA“实体”类在persistence.xml文件中指定。在Spring Boot中,此文件不是必需的,而是使用“实体扫描”。默认情况下,将搜索主配置类(用@EnableAutoConfiguration@SpringBootApplication注解的主程序类)下的所有软件包。

任何类标注了@Entity@Embeddable或者@MappedSuperclass被认为是。典型的实体类类似于以下示例:

package com.example.myapp.domain;

import java.io.Serializable;
import javax.persistence.*; @Entity
public class City implements Serializable { @Id
@GeneratedValue
private Long id; @Column(nullable = false)
private String name; @Column(nullable = false)
private String state; // ... additional members, often include @OneToMany mappings protected City() {
// no-args constructor required by JPA spec
// this one is protected since it shouldn't be used directly
} public City(String name, String state) {
this.name = name;
this.state = state;
} public String getName() {
return this.name;
} public String getState() {
return this.state;
} // ... etc }

Spring Data JPA Repositories

Spring Data JPA Repositories是可以定义以访问数据的接口。JPA查询是根据您的方法名称自动创建的。例如,CityRepository接口可能声明了一个给定州查找所有城市的方法findAllByState(String state)

对于更复杂的查询,可以对方法使用Spring Data的Query注解。

Spring Data Repositories通常从RepositoryCrudRepository接口扩展。如果使用自动配置,则从包含主配置类(用@EnableAutoConfiguration@SpringBootApplication注解的主配置类)的包中搜索Repositories。

以下示例显示了典型的Spring Data Repository接口定义:

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }

Spring Data JPA存储库支持三种不同的引导模式:defaultdeferredlazy。要启用deferred或lazy引导,请将spring.data.jpa.repositories.bootstrap-mode属性分别设置为deferred或lazy。当使用deferred或lazy引导时,自动配置的EntityManagerFactoryBuilder将使用上下文的AsyncTaskExecutor(如果有)作为引导执行器。如果存在多个,将使用命名为applicationTaskExecutor的。

更多信息参考Spring Data JPA文档。

创建和删除JPA数据库

默认情况下,仅当您使用嵌入式数据库(H2,HSQL或Derby)时,才会自动创建JPA数据库。您可以使用spring.jpa.*属性来显式配置JPA设置。例如,要创建和删除表,可以将以下行添加到application.properties中:

spring.jpa.hibernate.ddl-auto=create-drop

Hibernate自己的内部属性名称是(如果您记得更好的话)是hibernate.hbm2ddl.auto。您可以通过使用spring.jpa.properties.*(与其他Hibernate原生属性一起)设置它(将前缀添加到实体管理器之前先删除前缀)。下面的行显示了为Hibernate设置JPA属性的示例:

spring.jpa.properties.hibernate.globally_quoted_identifiers = true

在前面的示例中为Hibernate实体管理器将hibernate.globally_quoted_identifiers属性赋值true。

默认情况下,DDL执行(或验证)推迟到ApplicationContext开始执行之前。还有一个spring.jpa.generate-ddl标志,但是如果Hibernate自动配置处于活动状态,则不使用该标志,因为ddl-auto设置更细粒度。

在视图中打开EntityManager

如果您正在运行Web应用程序,则默认情况下,Spring Boot注册OpenEntityManagerInViewInterceptor以应用“在视图中打开EntityManager”模式,以允许在Web视图中进行延迟加载。如果你不希望这种行为,你应该在application.properties设置spring.jpa.open-in-view为false。

4.10.4。Spring Data JDBC

Spring Data包括对JDBC的repository支持,并将自动为CrudRepository上的方法生成SQL。对于更高级的查询,提供了@Query注解。

当必要的依赖项位于类路径上时,Spring Boot将自动配置Spring Data的JDBC repositories。可以将它们添加到您的项目中,而只需依赖于spring-boot-starter-data-jdbc。如有必要,您可以通过向应用程序中添加@EnableJdbcRepositories注解或JdbcConfiguration子类来控制Spring Data JDBC的配置。

有关Spring Data JDBC的完整详细信息,请参考参考文档

4.10.5。使用H2的Web控制台

H2数据库提供了一个基于浏览器的控制台是Spring Boot自动为您配置。满足以下条件时,将自动配置控制台:

  • 您正在开发基于servlet的Web应用程序。
  • com.h2database:h2 在类路径上。
  • 您正在使用Spring Boot的开发人员工具。

如果您不使用Spring Boot的开发人员工具,但仍想使用H2的控制台,则可以将spring.h2.console.enabled属性配置为true。

H2控制台仅在开发期间使用,因此您应注意确保spring.h2.console.enabled=true不在生产环境中使用。

更改H2控制台的路径

默认情况下,控制台位于/h2-console。您可以使用spring.h2.console.path属性来自定义控制台的路径。

4.10.6。使用jOOQ

jOOQ面向对象查询(jOOQ)是Data Geekery的流行产品,它可以从数据库中生成Java代码,并允许您通过其流式API构建类型安全的SQL查询。商业版和开源版都可以与Spring Boot一起使用。

代码生成

为了使用jOOQ的类型安全查询,您需要从数据库架构中生成Java类。您可以按照jOOQ用户手册中的说明进行操作。如果您使用jooq-codegen-maven插件并且还使用spring-boot-starter-parent“父POM”,则可以安全地省略插件的<version>标签。您还可以使用Spring Boot定义的版本变量(例如h2.version)来声明插件的数据库依赖关系。以下清单显示了一个示例:

<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
...
</executions>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
</dependencies>
<configuration>
<jdbc>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/yourdatabase</url>
</jdbc>
<generator>
...
</generator>
</configuration>
</plugin>

使用DSLContext

jOOQ提供的流式API通过org.jooq.DSLContext接口开始。Spring Boot将自动配置DSLContext为Spring Bean并将其连接到您的应用程序DataSource。要使用DSLContext,可以使用@Autowire,如以下示例所示:

@Component
public class JooqExample implements CommandLineRunner { private final DSLContext create; @Autowired
public JooqExample(DSLContext dslContext) {
this.create = dslContext;
} }

jOOQ手册倾向于使用名为create的变量来保存DSLContext。

然后,您可以使用DSLContext构造查询,如以下示例所示:

public List<GregorianCalendar> authorsBornAfter1980() {
return this.create.selectFrom(AUTHOR)
.where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
.fetch(AUTHOR.DATE_OF_BIRTH);
}

jOOQ SQL方言

除非配置了spring.jooq.sql-dialect属性,否则Spring Boot会确定要用于数据源的SQL方言。如果Spring Boot无法检测到方言,则使用DEFAULT

Spring Boot只能自动配置开源版本的jOOQ支持的方言。

定制jOOQ

通过定义自己的@Bean定义(可以在jOOQ Configuration创建时使用)可以实现更高级的自定义。您可以为以下jOOQ类型定义bean:

  • ConnectionProvider
  • ExecutorProvider
  • TransactionProvider
  • RecordMapperProvider
  • RecordUnmapperProvider
  • RecordListenerProvider
  • ExecuteListenerProvider
  • VisitListenerProvider
  • TransactionListenerProvider

如果要完全控制jOOQ配置,也可以创建自己的org.jooq.Configuration @Bean。

20191127 Spring Boot官方文档学习(4.10)的更多相关文章

  1. 20191127 Spring Boot官方文档学习(9.1-9.3)

    9."使用方法"指南 9.1.Spring Boot应用程序 9.1.1.创建自己的FailureAnalyzer FailureAnalyzer被包装在FailureAnalys ...

  2. 20191127 Spring Boot官方文档学习(4.11)

    4.11.使用NoSQL技术 Spring Data提供了其他项目来帮助您访问各种NoSQL技术,包括: Redis MongoDB Neo4J Solr Elasticsearch Cassandr ...

  3. 20191127 Spring Boot官方文档学习(4.12)

    4.12.缓存(Caching) Spring框架提供了对应用程序透明添加缓存的支持.从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明应用的,不会对调用者造成任何 ...

  4. 20191127 Spring Boot官方文档学习(4.13)

    4.13.Messaging Spring框架为与消息传递系统集成提供了广泛的支持,从使用JmsTemplate简化JMS API到完整的异步接收消息的基础结构.Spring AMQP为高级消息队列协 ...

  5. 20191127 Spring Boot官方文档学习(4.14-4.17)

    4.14.使用RestTemplate调用REST服务 如果需要从应用程序调用远程REST服务,则可以使用Spring Framework的RestTemplate类.由于RestTemplate实例 ...

  6. 20191127 Spring Boot官方文档学习(4.18-4.24)

    4.18.JTA的分布式事务 通过使用Atomikos或Bitronix嵌入式事务管理器,Spring Boot支持跨多个XA资源的分布式JTA事务.部署到合适的Java EE应用程序服务器时,还支持 ...

  7. 20191127 Spring Boot官方文档学习(4.25)

    4.25. Testing Spring Boot提供了许多实用程序和注解,可以在测试应用程序时提供帮助.测试支持由两个模块提供:spring-boot-test包含核心项,spring-boot-t ...

  8. 20191127 Spring Boot官方文档学习(5)

    5.Spring Boot Actuator:可投入生产的功能 Spring Boot包含许多其他功能,可帮助您在将应用程序投入生产时监控和管理您的应用程序.您可以选择使用HTTP端点或JMX管理和监 ...

  9. 20191127 Spring Boot官方文档学习(6-8)

    6.部署Spring Boot应用程序 在部署应用程序时,Spring Boot的灵活打包选项提供了很多选择.您可以将Spring Boot应用程序部署到各种云平台,容器映像(例如Docker)或虚拟 ...

随机推荐

  1. outlook 使用临时邮箱 使用旧数据

    控制面板-->邮件32位 显示配置文件 删除再添加 具体可参考 https://blog.csdn.net/liuyukuan/article/details/80043840 偷懒,图片从网上 ...

  2. python 后台 安装 富文本编辑

    前言 当然需要安装一些后台只能输入一些文本编辑器,不然这样多少不美观呀 当然python 有 safe 可以把后台的标签转换 , 还有 striptags   这个是换成html 格式的,但不会加粗或 ...

  3. pt-align的用法简要记录

    pt-align的用法简要记录 1.pt-align 功能:将其它工具的输出按列对齐用法:pt-align [FILES]如果没有指定文件,则默认读取标准输入的内容. 2.例如: [root@dbte ...

  4. 自己用ul模拟实现下拉多选框,

    模拟实现下拉多选框 效果如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. end of sleepyhead

  6. select服务器端模型封装——回调方式快速建立服务端

    #pragma once #ifndef WINSOCK2_H #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h> # ...

  7. [NOIP2017]注意点

    1.数据大却没开long long 导致的gg.2.文件读入时stdin打成stdout...3.桶维护数值,有负值要平移,且数值最好稍大(否则可能RE).4.很智障地打错变量.5.DP或其他涉及到转 ...

  8. scrapy项目4:爬取当当网中机器学习的数据及价格(CrawlSpider类)

    scrapy项目3中已经对网页规律作出解析,这里用crawlspider类对其内容进行爬取: 项目结构与项目3中相同如下图,唯一不同的为book.py文件 crawlspider类的爬虫文件book的 ...

  9. Maven开发环境搭建

    配置Maven流程: 1.下载Maven,官网:http://maven.apache.org/ 2.安装到本地: 1 ).解压apache-maven-x.x.x-bin.zip文件 2 ).配置M ...

  10. Java基础之文件的输入输出流操作

    在介绍输入输出流之前,首先需要了解如何创建文件,创建文件夹以及遍历文件夹等各种操作,这里面不在一一介绍,主要介绍的是文件的输入输出流操作. 在起初学习文件操作之前,总是喜欢将输入输出弄混淆,后来通过看 ...