37.數(shù)據(jù)訪問

配置一個數(shù)據(jù)源

  • 想要覆蓋默認(rèn)的設(shè)置只需要定義一個你自己的DataSource類型的 @Bean 珊随。Spring Boot提供一個工具構(gòu)建類DataSourceBuilder笔喉,可用來創(chuàng)建一個標(biāo)準(zhǔn)的DataSource(如果它處于classpath下)堡僻,或者僅創(chuàng)建你自己的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.配置兩個數(shù)據(jù)源

*創(chuàng)建多個數(shù)據(jù)源和創(chuàng)建第一個工作都是一樣的靴患。如果使用針對JDBC或JPA的默認(rèn)自動配置,你可能想要將其中一個設(shè)置為 @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 接口創(chuàng)建各種風(fēng)格的實現(xiàn)。Spring Boot會為你處理所有事情厨幻,只要那些 @Repositories 接口跟你的 @EnableAutoConfiguration 類處于相同的包(或子包)相嵌。

  • 對于很多應(yīng)用來說,你需要做的就是將正確的Spring Data依賴添加到classpath下(對于JPA有一個 spring-boot-starterdata-jpa 况脆,對于Mongodb有一個 spring-boot-starter-data-mongodb )饭宾,創(chuàng)建一些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已經(jīng)提供了一些獨立的配置選項(比如棠隐,針對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
    
  • (由于寬松的數(shù)據(jù)綁定策略,連字符或下劃線作為屬性keys作用應(yīng)該是等效的) ddl-auto 配置是個特殊情況嚎京,它有不同的默認(rèn)設(shè)置嗡贺,這取決于你是否使用一個內(nèi)嵌數(shù)據(jù)庫(create-drop)。當(dāng)本地EntityManagerFactory被創(chuàng)建時鞍帝,所有 spring.jpa.properties.* 屬性都被作為正常的JPA屬性(去掉前綴)傳遞進(jìn)去了诫睬。

6.使用自定義的EntityManagerFactory

  • 為了完全控制EntityManagerFactory的配置,你需要添加一個名為 entityManagerFactory 的 @Bean 帕涌。Spring Boot自動配置會根據(jù)是否存在該類型的bean來關(guān)閉它的實體管理器(entity manager)摄凡。

7.使用兩個EntityManagers

  • 即使默認(rèn)的EntityManagerFactory工作的很好续徽,你也需要定義一個新的EntityManagerFactory,因為一旦出現(xiàn)第二個該類型的bean架谎,默認(rèn)的將會被關(guān)閉炸宵。為了輕松的實現(xiàn)該操作,你可以使用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默認(rèn)的JpaTransactionManager獲取裹匙,如果你將它標(biāo)記為 @Primary 。另一個需要顯式注入到一個新實例末秃「乓常或你可以使用一個JTA事物管理器生成它兩個。

8.使用普通的persistence.xml

  • Spring不要求使用XML配置JPA提供者(provider)练慕,并且Spring Boot假定你想要充分利用該特性惰匙。如果你傾向于使用 persistence.xml ,那你需要定義你自己的id為'entityManagerFactory'的LocalEntityManagerFactoryBean類型的 @Bean 铃将,并在那設(shè)置持久化單元的名稱项鬼。

9.使用Spring Data JPA和Mongo倉庫

  • Spring Data JPA和Spring Data Mongo都能自動為你創(chuàng)建Repository實現(xiàn)。如果它們同時出現(xiàn)在classpath下劲阎,你可能需要添加額外的配置來告訴Spring Boot你想要哪個(或兩個)為你創(chuàng)建倉庫绘盟。最明確地方式是使用標(biāo)準(zhǔn)的Spring Data @EnableRepositories ,然后告訴它你的Repository接口的位置(此處即可以是Jpa悯仙,也可以是Mongo龄毡,或者兩者都是)。

  • 這里也有 spring.data.*.repositories.enabled 標(biāo)志锡垄,可用來在外部配置中開啟或關(guān)閉倉庫的自動配置沦零。這在你想關(guān)閉Mongo倉庫,但仍舊使用自動配置的MongoTemplate時非常有用货岭。

  • 相同的障礙和特性也存在于其他自動配置的Spring Data倉庫類型(Elasticsearch, Solr)蠢终。只需要改變對應(yīng)注解的名稱和標(biāo)志。

10.將Spring Data倉庫暴露為REST端點

  • Spring Data REST能夠?qū)epository的實現(xiàn)暴露為REST端點茴她,只要該應(yīng)用啟用Spring MVC。

  • Spring Boot暴露一系列來自 spring.data.rest 命名空間的有用屬性來定制化RepositoryRestConfiguration程奠。如果需要提供其他定制丈牢,你可以創(chuàng)建一個繼承自SpringBoot RepositoryRestMvcConfiguration的 @Configuration 類。該類功能和
    RepositoryRestMvcConfiguration相同瞄沙,但允許你繼續(xù)使用 spring.data.rest.* 屬性己沛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慌核,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子申尼,更是在濱河造成了極大的恐慌垮卓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件师幕,死亡現(xiàn)場離奇詭異粟按,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霹粥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門灭将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人后控,你說我怎么就攤上這事庙曙。” “怎么了浩淘?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵捌朴,是天一觀的道長。 經(jīng)常有香客問我张抄,道長砂蔽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任欣鳖,我火速辦了婚禮察皇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泽台。我一直安慰自己什荣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布怀酷。 她就那樣靜靜地躺著稻爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕依。 梳的紋絲不亂的頭發(fā)上桅锄,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音样眠,去河邊找鬼友瘤。 笑死,一個胖子當(dāng)著我的面吹牛檐束,可吹牛的內(nèi)容都是我干的辫秧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼被丧,長吁一口氣:“原來是場噩夢啊……” “哼盟戏!你這毒婦竟也來了绪妹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤柿究,失蹤者是張志新(化名)和其女友劉穎邮旷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝇摸,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡婶肩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了探入。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狡孔。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜂嗽,靈堂內(nèi)的尸體忽然破棺而出苗膝,到底是詐尸還是另有隱情,我是刑警寧澤植旧,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布辱揭,位于F島的核電站,受9級特大地震影響病附,放射性物質(zhì)發(fā)生泄漏问窃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一完沪、第九天 我趴在偏房一處隱蔽的房頂上張望域庇。 院中可真熱鬧,春花似錦覆积、人聲如沸听皿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尉姨。三九已至,卻和暖如春吗冤,著一層夾襖步出監(jiān)牢的瞬間又厉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工椎瘟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留覆致,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓肺蔚,卻偏偏與公主長得像篷朵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容