深入了解Springboot核心知识点之数据访问配置

目录
  • 自定义数据源配置
  • 多数据源配置
  • 使用Spring Data Repositories
  • 将@Entity定义与Spring配置分开
  • 配置JPA属性
  • 配置Hibernate命名策略
  • 配置Hibernat二级缓存
  • 使用多个EntityManagerFactories
  • 将Spring数据存储库公开为REST端点

环境:Springboot2.4.13

自定义数据源配置

@Bean
@ConfigurationProperties(prefix="app.datasource")
public DataSource dataSource() {
  return new FancyDataSource();
} 

配置文件

app:
  datasource:
    url: "jdbc:h2:mem:mydb"
    username: "sa"
    password: "123123"
    pool-size: 30 

FancyDataSource类具有相应的url,username,pool-size属性。

Spring Boot还提供了一个名为DataSourceBuilder的实用工具生成器类,可用于创建一个标准数据源(如果它位于类路径上)。构建器可以根据类路径上的可用内容检测要使用的类。它还根据JDBCURL自动检测驱动程序。

@Bean
@ConfigurationProperties("app.datasource")
public DataSource dataSource() {
  return DataSourceBuilder.create().build();
} 

然而,有一个陷阱。因为连接池的实际类型没有提供,所以在自定义数据源的元数据中没有生成任何键,并且IDE中没有可用的完成(因为数据源接口不公开任何属性)。此外,如果类路径上碰巧有Hikari,则此基本设置不起作用,因为Hikari没有url属性(但有jdbcUrl属性)。在这种情况下,你必须按如下方式重写配置:

app:
  datasource:
    jdbc-url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    pool-size: 30 

可以强制指定数据源类型

@Bean
@ConfigurationProperties("app.datasource")
public HikariDataSource dataSource() {
  return DataSourceBuilder.create().type(HikariDataSource.class).build();
} 

多数据源配置

如果需要配置多个数据源,可以应用上一节中描述的相同技巧。但是,你必须将其中一个数据源实例标记为@Primary,因为将来的各种自动配置都希望能够按类型获得一个。

如果您创建自己的数据源,自动配置将退出。在以下示例中,我们提供了与主数据源上的自动配置完全相同的功能集:

@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
  return new DataSourceProperties();
} 

@Bean
@Primary
@ConfigurationProperties("app.datasource.first.configuration")
public HikariDataSource firstDataSource() {
  return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
} 

@Bean
@ConfigurationProperties("app.datasource.second")
public BasicDataSource secondDataSource() {
  return DataSourceBuilder.create().type(BasicDataSource.class).build();
} 

这两个数据源还绑定了高级定制。例如,您可以按如下方式配置它们:

app:
  datasource:
    first:
      url: "jdbc:mysql://localhost/first"
      username: "dbuser"
      password: "dbpass"
      configuration:
        maximum-pool-size: 30
    second:
      url: "jdbc:mysql://localhost/second"
      username: "dbuser"
      password: "dbpass"
      max-total: 30 

你也可以将相同的概念应用于辅助数据源,如以下示例所示:

@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
  return new DataSourceProperties();
} 

@Bean
@Primary
@ConfigurationProperties("app.datasource.first.configuration")
public HikariDataSource firstDataSource() {
  return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
} 

@Bean
@ConfigurationProperties("app.datasource.second")
public DataSourceProperties secondDataSourceProperties() {
  return new DataSourceProperties();
} 

@Bean
@ConfigurationProperties("app.datasource.second.configuration")
public BasicDataSource secondDataSource() {
  return secondDataSourceProperties().initializeDataSourceBuilder().type(BasicDataSource.class).build();
} 

使用Spring Data Repositories

Spring data 可以创建各种风格的@Repository接口的实现。只要这些@Repositories包含在@EnableAutoConfiguration类的同一个包(或子包)中,Spring Boot就可以为您处理所有这些。

对于许多应用程序,只需将正确的Spring Data依赖项放在类路径上。

spring-boot-starter-data-jpa for JPA, spring-boot-starter-data-mongodb for Mongodb,等等。要开始,请创建一些存储库接口来处理@Entity对象。

Spring Boot根据找到的@EnableAutoConfiguration,尝试猜测@Repository定义的位置。要获得更多控制,请使用@EnableJpaRepositories注释。

将@Entity定义与Spring配置分开

Spring Boot试图根据它找到的@EnableAutoConfiguration猜测@Entity定义的位置。要获得更多控制,可以使用@EntityScan注释,如下例所示:

@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@EntityScan(basePackageClasses=City.class)
public class Application {
  //...
} 

配置JPA属性

Spring Data JPA已经提供了一些独立于供应商的配置选项(如SQL日志记录选项),SpringBoot将这些选项和Hibernate的一些选项公开为外部配置属性。其中一些是根据上下文自动检测的,因此您不必设置它们。

spring.jpa.hibernate.ddl-auto是一种特殊情况,因为根据运行时条件,它有不同的默认值。如果使用嵌入式数据库,并且没有模式管理器(如Liquibase或Flyway)处理数据源,则默认情况下为create-drop。在所有其他情况下,它默认为none。

要使用的方言由JPA提供程序检测。如果您喜欢自己设置方言,请设置

spring.jpa.database-platform属性。

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: "com.example.MyPhysicalNamingStrategy"
    show-sql: true 

配置Hibernate命名策略

Hibernate使用两种不同的命名策略将名称从对象模型映射到相应的数据库名称。可以通过设置

spring.jpa.hibernate.naming.physical-strategy属性,属性值为类的全限定名,package + clalss。

默认情况下,Spring Boot使用

SpringPhysicalNamingStrategy配置物理命名策略。此实现提供了与Hibernate4相同的表结构:所有点都替换为下划线,驼峰大小写也替换为下划线。此外,默认情况下,所有表名都以小写形式生成。例如,电话号码实体映射到电话号码表。如果您的模式需要混合大小写标识符,请定义自定义SpringPhysicalNamingStrategybean,如以下示例所示:

@Bean
SpringPhysicalNamingStrategy caseSensitivePhysicalNamingStrategy() {
  return new SpringPhysicalNamingStrategy() {
    @Override
    protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
      return false;
    }
 };
} 

如果您更喜欢使用Hibernate 5的默认设置,请设置以下属性:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

或者,您可以配置以下bean

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

配置Hibernat二级缓存

Hibernate二级缓存可以为一系列缓存提供程序进行配置。与其将Hibernate配置为再次查找缓存提供程序,不如尽可能提供上下文中可用的缓存提供程序。

要使用JCache实现这一点,首先要确保

org.hibernate.HibernateJCache在类路径上可用。然后,添加HibernatePropertiesCustomizer bean,如以下示例所示:

@Configuration(proxyBeanMethods = false)
public class HibernateSecondLevelCacheExample {
  @Bean
  public HibernatePropertiesCustomizer hibernateSecondLevelCacheCustomizer(JCacheCacheManager cacheManager) {
    return (properties) -> properties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());
    }
} 

使用多个EntityManagerFactories

如果需要对多个数据源使用JPA,那么每个数据源可能需要一个EntityManagerFactory。Spring ORM中的

LocalContainerEntityManagerFactoryBean允许您根据需要配置EntityManagerFactory。您还可以重用JPA属性来绑定每个EntityManagerFactory的设置,如以下示例所示:

@Bean
@ConfigurationProperties("app.jpa.first")
public JpaProperties firstJpaProperties() {
  return new JpaProperties();
} 

@Bean
public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(DataSource firstDataSource, JpaProperties firstJpaProperties) {
  EntityManagerFactoryBuilder builder = createEntityManagerFactoryBuilder(firstJpaProperties);
  return builder.dataSource(firstDataSource).packages(Order.class).persistenceUnit("firstDs").build();
} 

private EntityManagerFactoryBuilder createEntityManagerFactoryBuilder(JpaProperties jpaProperties) {
  JpaVendorAdapter jpaVendorAdapter = createJpaVendorAdapter(jpaProperties);
  return new EntityManagerFactoryBuilder(jpaVendorAdapter, jpaProperties.getProperties(), null);
} 

private JpaVendorAdapter createJpaVendorAdapter(JpaProperties jpaProperties) {
  // Map JPA properties as needed
  return new HibernateJpaVendorAdapter();
} 

上面的示例使用名为firstDataSource的数据源bean创建EntityManagerFactory。它扫描与订单位于同一包中的实体。可以使用该应用程序映射其他JPA属性。

将Spring数据存储库公开为REST端点

Spring Data Rest可以将 Repository 实现公开为REST端点,前提是已经为应用程序启用了 SpringMVC。

Spring Boot暴露了一组有用的属性(来自Spring.data.rest命名空间),用于自定义

RepositoryRestConfiguration。如果需要提供额外的定制,那么应该使用RepositoryRestConfiguration。

使用

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-rest-webmvc</artifactId>
</dependency> 

以上就是深入了解Springboot核心知识点之数据访问配置的详细内容,更多关于Springboot数据访问配置的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot多数据源配置的全过程记录

    目录 前言 配置文件 依赖 构建 AbstractRoutingDataSource 数据源切换 目录 总结 前言 多数据源的核心就是向 IOC 容器注入 AbstractRoutingDataSource 和如何切换数据源.注入的方式可以是注册 BeanDefinition 或者是构建好的 Bean,切换数据源的方式可以是方法参数或者是注解切换(其他的没想象出来),具体由需求决定. 我的需求是统计多个库的数据,将结果写入另一个数据库,统计的数据库数量是不定的,无法通过 @Bean 直接注入,又

  • SpringBoot+Jpa项目配置双数据源的实现

    目录 引言 配置yml文件 创建数据源配置类 为每个数据库创建配置类 引言 今天为大家带来一些非常有用的实战技巧,比如在我们需要对两个数据库进行操作的时候而哦我们通常用的只是单数据库查询,这就触及到知识盲点了,那么废话不多说上代码! 配置yml文件 server: port: 8080 spring: profiles: active: dev jackson: time-zone: GMT+8 # 这里是我们的数据库配置地方 datasource: data1: #这里是数据库一 driver

  • SpringBoot响应Json数据乱码通过配置的解决

    目录 场景 实现 把SpringBoot的response编码设置为utf-8 找到application.properties配置文件 添加如下: #设置响应为utf-8spring.http.encoding.force-response=true 再次刷新浏览器 SpringBoot返回json数据乱码 第一种解决方式 在请求RequestMapping直接设置,只针对请求,在拦截器返回json数据时有可能乱码 @RequestMapping(value ="/user", pr

  • springboot项目访问静态资源的配置代码实例

    这篇文章主要介绍了springboot项目访问静态资源的配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这里只是简单记录当上传图片不是放在tomcat其他服务器中时,只是放在磁盘中便可以这样配置,在项目启动后可以访问到磁盘中的资源. @Configuration public class SystemConfigurer implements WebMvcConfigurer { @Value("${jeewx.path.uploa

  • springboot整合多数据源配置方式

    目录 简介 一.表结构 二.多数据源整合 1. springboot+mybatis使用分包方式整合 1.1 主要依赖包 1.2 application.yml 配置文件 1.3 建立连接数据源的配置文件 1.4 具体实现 2. springboot+druid+mybatisplus使用注解整合 2.1 主要依赖包 2.2 application.yml 配置文件 2.3 给使用非默认数据源添加注解@DS 简介 主要介绍两种整合方式,分别是 springboot+mybatis 使用分包方式整

  • springboot配置templates直接访问的实现

    目录 springboot配置templates直接访问 配置公有访问方式如下 springboot的templates用法 在controller中添加视图 springboot配置templates直接访问 springboot下的templates目录的资源默认是受保护的,类似于javaweb项目的WEB-INF目录,但是给每个springboot的html页面都配置控制器跳转过于麻烦 配置公有访问方式如下 在配置文件加如下: spring.resources.static-locatio

  • 深入了解Springboot核心知识点之数据访问配置

    目录 自定义数据源配置 多数据源配置 使用Spring Data Repositories 将@Entity定义与Spring配置分开 配置JPA属性 配置Hibernate命名策略 配置Hibernat二级缓存 使用多个EntityManagerFactories 将Spring数据存储库公开为REST端点 环境:Springboot2.4.13 自定义数据源配置 @Bean @ConfigurationProperties(prefix="app.datasource") publ

  • SpringBoot中Mybatis + Druid 数据访问的详细过程

    目录 1.简介 2.JDBC 3.CRUD操作 4.自定义数据源 DruidDataSource 1.配置 Druid 数据源监控 2.配置 Druid web 监控 filter 5.SpringBoot 整合mybatis 1. 导入mybatis所需要的依赖 2.配置数据库连接信息 3,创建实体类 4.配置Mapper接口类 6.SpringBoot 整合 1.简介 ​ 对于数据访问层,无论是SQL(关系型数据库) 还是NOSQL(非关系型数据库),SpringBoot 底层都是采用 Sp

  • SpringBoot实战记录之数据访问

    目录 前言 SpringBoot整合MyBatis 环境搭建 注解方式整合mybatis 使用xml配置Mybatis 整合Redis 接口整合 测试 总结 前言 在开发中我们通常会对数据库的数据进行操作,SpringBoot对关系性和非关系型数据库的访问操作都提供了非常好的整合支持.SpringData是spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞状项目,包含大量关系型和非关系型数据库数据访问解决方案,让我们快速简单的使用各种数据访问技术,springboot默认

  • SpringBoot+MyBatis简单数据访问应用的实例代码

    因为实习用的是MyBatis框架,所以写一篇关于SpringBoot整合MyBatis框架的总结. 一,Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:

  • SpringBoot数据访问自定义使用Druid数据源的方法

    数据访问之Druid数据源的使用 说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主. 为什么要使用数据源: ​数据源是提高数据库连接性能的常规手段,数据源会负责维持一个数据连接池,当程序创建数据源实例时,系统会一次性地创建多个数据库连接,并把这些数据库连接保存在连接池中. ​当程序需要进行数据库访问时,无须重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接. ​当程序使用数据库连接访问数据库结束后,无须关闭数据库连接,而是将数据库连接归还给连接

  • 《解剖PetShop》之三:PetShop数据访问层之消息处理

    三.PetShop数据访问层之消息处理 在进行系统设计时,除了对安全.事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量.数据流量.服务器负荷的问题.解决性能的瓶颈,除了对硬件系统进行升级外,软件设计的合理性尤为重要. 在前面我曾提到,分层式结构设计可能会在一定程度上影响数据访问的性能,然而与它给设计人员带来的好处相比,几乎可以忽略.要提供整个系统的性能,还可以从数据库的优化着手,例如连接池的使用.建立索引.优化查询策略等等,例如在P

  • springboot整合redis进行数据操作(推荐)

    redis是一种常见的nosql,日常开发中,我们使用它的频率比较高,因为它的多种数据接口,很多场景中我们都可以用到,并且redis对分布式这块做的非常好. springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作. 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

  • 基于SpringBoot核心原理(自动配置、事件驱动、Condition)

    前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理.如果还不清楚Spring原理的,可以先查看博主之前的文章,本篇主要分析SpringBoot的启动.自动配置.Condition.事件驱动原理. 正文 启动原理 SpringBoot启动非常简单,因其内置了Tomcat,所以只需要通过下面几种方式启动即可: @SpringBootApplication(scanBas

  • python编程的核心知识点总结

    一.为什么提出python编程的核心是什么? 我想要Python实现,这已经不是什么秘密了.WebAssembly它不仅会让Python进入浏览器,而且事实是两者都是IOS和安卓支持将JavaScript作为应用程序的一部分运行,它还可以让Python进入移动平台.这一切都让我兴奋. 但是当想到创建Python的新实现这一艰巨任务时,我的大脑也开始问到底是什么东西.是Python?我们一起生活过CPython长期以来,我怀疑我们大多数人只是认为"Python==CPython".皮皮试

  • Java中的重要核心知识点之继承详解

    目录 一.继承 1.概念 2.语法 3.父类成员的访问 (1)子类中访问父类成员变量 (2)子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.super和this 7.代码块执行顺序 8.父类成员在子类中的可见性 9.继承方式 10.final关键字 11.组合 一.继承 1.概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的

随机推荐