37.数据访问

配置一个数据源

  • 想要覆盖默认的设置只需要定义一个你自己的DataSource类型的 @Bean 。Spring Boot提供一个工具构建类DataSourceBuilder,可用来创建一个标准的DataSource(如果它处于classpath下),或者仅创建你自己的DataSource,然后将它和在Section 23.7.1, “Third-party configuration”解释的一系列Environment属性绑定。

比如:

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


datasource.mine.jdbcUrl=jdbc:h2:mem:mydb
datasource.mine.user=sa
datasource.mine.poolSize=30

2.配置两个数据源

*创建多个数据源和创建第一个工作都是一样的。如果使用针对JDBC或JPA的默认自动配置,你可能想要将其中一个设置为 @Primary (然后它就能被任何 @Autowired 注入获取)。

@Bean
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
}

3.使用Spring Data仓库

  • Spring Data可以为你的 @Repository 接口创建各种风格的实现。Spring Boot会为你处理所有事情,只要那些 @Repositories 接口跟你的 @EnableAutoConfiguration 类处于相同的包(或子包)。

  • 对于很多应用来说,你需要做的就是将正确的Spring Data依赖添加到classpath下(对于JPA有一个 spring-boot-starterdata-jpa ,对于Mongodb有一个 spring-boot-starter-data-mongodb ),创建一些repository接口来处理 @Entity 对象。具体参考JPA sample或Mongodb sample。

  • Spring Boot会基于它找到的 @EnableAutoConfiguration 来尝试猜测你的 @Repository 定义的位置。想要获取更多控制,可以使用 @EnableJpaRepositories 注解(来自Spring Data JPA)。

4.从Spring配置分离 @Entity 定义

  • Spring Boot会基于它找到的 @EnableAutoConfiguration 来尝试猜测你的 @Entity 定义的位置。想要获取更多控制,你可以使用 @EntityScan 注解,比如:

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

5.配置JPA属性

  • Spring Data JPA已经提供了一些独立的配置选项(比如,针对SQL日志),并且Spring Boot会暴露它们,针对hibernate的外部配置属性也更多些。最常见的选项如下:

      spring.jpa.hibernate.ddl-auto: create-drop
      spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
      spring.jpa.database: H2
      spring.jpa.show-sql: true
    
  • (由于宽松的数据绑定策略,连字符或下划线作为属性keys作用应该是等效的) ddl-auto 配置是个特殊情况,它有不同的默认设置,这取决于你是否使用一个内嵌数据库(create-drop)。当本地EntityManagerFactory被创建时,所有 spring.jpa.properties.* 属性都被作为正常的JPA属性(去掉前缀)传递进去了。

6.使用自定义的EntityManagerFactory

  • 为了完全控制EntityManagerFactory的配置,你需要添加一个名为 entityManagerFactory 的 @Bean 。Spring Boot自动配置会根据是否存在该类型的bean来关闭它的实体管理器(entity manager)。

7.使用两个EntityManagers

  • 即使默认的EntityManagerFactory工作的很好,你也需要定义一个新的EntityManagerFactory,因为一旦出现第二个该类型的bean,默认的将会被关闭。为了轻松的实现该操作,你可以使用Spring Boot提供的EntityManagerBuilder,或者如果你喜欢
    的话可以直接使用来自Spring ORM的LocalContainerEntityManagerFactoryBean。

示例:

// add two data sources configured as above
@Bean
public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(customerDataSource())
            .packages(Customer.class)
            .persistenceUnit("customers")
            .build();
}
@Bean
public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(orderDataSource())
            .packages(Order.class)
            .persistenceUnit("orders")
            .build();
}
  • 上面的配置靠自己基本可以运行。想要完成作品你也需要为两个EntityManagers配置TransactionManagers。其中的一个会被Spring Boot默认的JpaTransactionManager获取,如果你将它标记为 @Primary 。另一个需要显式注入到一个新实例。或你可以使用一个JTA事物管理器生成它两个。

8.使用普通的persistence.xml

  • Spring不要求使用XML配置JPA提供者(provider),并且Spring Boot假定你想要充分利用该特性。如果你倾向于使用 persistence.xml ,那你需要定义你自己的id为'entityManagerFactory'的LocalEntityManagerFactoryBean类型的 @Bean ,并在那设置持久化单元的名称。

9.使用Spring Data JPA和Mongo仓库

  • Spring Data JPA和Spring Data Mongo都能自动为你创建Repository实现。如果它们同时出现在classpath下,你可能需要添加额外的配置来告诉Spring Boot你想要哪个(或两个)为你创建仓库。最明确地方式是使用标准的Spring Data @EnableRepositories ,然后告诉它你的Repository接口的位置(此处即可以是Jpa,也可以是Mongo,或者两者都是)。

  • 这里也有 spring.data.*.repositories.enabled 标志,可用来在外部配置中开启或关闭仓库的自动配置。这在你想关闭Mongo仓库,但仍旧使用自动配置的MongoTemplate时非常有用。

  • 相同的障碍和特性也存在于其他自动配置的Spring Data仓库类型(Elasticsearch, Solr)。只需要改变对应注解的名称和标志。

10.将Spring Data仓库暴露为REST端点

  • Spring Data REST能够将Repository的实现暴露为REST端点,只要该应用启用Spring MVC。

  • Spring Boot暴露一系列来自 spring.data.rest 命名空间的有用属性来定制化RepositoryRestConfiguration。如果需要提供其他定制,你可以创建一个继承自SpringBoot RepositoryRestMvcConfiguration的 @Configuration 类。该类功能和
    RepositoryRestMvcConfiguration相同,但允许你继续使用 spring.data.rest.* 属性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容