簡體   English   中英

使用 Springboot 在 Oracle、MySQL 數據庫中創建用戶 - Spring Data JPA

[英]Create users in Oracle, MySQL databases using Springboot - Spring Data JPA

我對 Springboot 和 Spring Data JPA 非常陌生,正在研究一個需要在不同數據庫中創建用戶的用例。 應用程序將從隊列中接收 2 個輸入 - 用戶名和數據庫名稱。 使用這個我必須在給定的數據庫中提供給定的用戶。 我無法理解項目架構。 由於我需要運行的查詢將采用以下格式 - 創建由密碼標識的用戶 ABC; 項目在模型類、存儲庫等方面應該是什么樣子? 由於我沒有運行查詢的實際表,我是否需要模型類,因為不會發生列映射。

TLDR - 幫助構建配置了多個數據源的 Springboot-Spring Data JPA 應用程序以運行以下格式的查詢:創建由密碼標識的用戶

我一直在使用這個 GitHub 存儲庫作為參考 - https://github.com/jahe/spring-boot-multiple-datasources/blob/master/src/main/java/com/foobar

我將在這里做一些假設:

  • 您選擇的數據庫是Oracle ,基於提供的語法: create user ABC identified by password
  • 您要創建和列出用戶
  • 您的數據庫是眾所周知的,並在 JNDI 中定義

不幸的是,我不能只提供代碼,因為設置它需要我做一些工作,但我可以給你它的要點。


方法一:使用JPA

  • 首先,創建一個User實體和一個對應的UserRepository 將實體綁定到all_users表。 主鍵可能是USERNAMEUSER_ID列......但這並不重要,因為您不會對該表進行任何插入。
  • 要創建用戶,請向您自己的UserRepository添加專用方法,在@NativeQuery注釋中指定用戶創建查詢。 它應該是開箱即用的。
  • 要列出用戶,您不需要做任何事情,因為此時您的實體已經綁定到正確的表。 只需在您的存儲庫中調用適當的(並且已經存在的)方法。

以上理論上涵蓋了使用 JPA 在給定數據庫中創建和列出用戶。

如果此時您的數據庫數量有限(因此眾所周知的 JNDI 數據源數量有限),您可以按照您引用的 GitHub 示例中所示繼續操作,為每個不同的DataSource提供不同的@Configuration類,每個類都有相關(相同)存儲庫位於單獨的包中。

您當然必須添加一些邏輯,以允許您適當地選擇要用於操作的JpaRepository

這將導致一些代碼重復,並且只有在隨着時間的推移需求保持非常簡單的情況下才能很好地工作。 也就是說:如果您所有的“微服務”只需要創建/列出(可能刪除)用戶,並且數據源的數量隨着時間的推移仍然很少,那么它就可以工作,因為每個新數據源都需要您添加新類,重新編譯和重新部署微服務。

或者,嘗試使用此處提出的方法: https : //www.endpoint.com/blog/2016/11/16/connect-multiple-jpa-repositories-using


然而,就我個人而言,我會完全拋棄 JPA,因為動態配置任意DataSource對象並重新配置存儲庫以每次針對不同的DataSource工作都非常容易,並且上述解決方案將迫使您對這樣一個簡單的應用程序進行持續維護。

我會做的是堅持使用NamedParameterJdbcTemplate使用JndiTemplate初始化它。 例子:

void createUser(String username, String password, String database) {
    DataSource ds = (new JndiTemplate()).lookup(database);
    NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate();
    Map<String, Object> params = new HashMap<>();
    params.put("USERNAME", username);
    params.put("PASSWORD", password);
    npjt.execute('create user :USERNAME identified by :PASSWORD', params);
}

List<Map<String, Object>> listUsers() {
    DataSource ds = (new JndiTemplate()).lookup(database);
    NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate();
    return npjt.queryForList("select * from all_users", new HashMap<>());
}

假設您的容器已經定義了 JNDI 數據源,上面的代碼應該涵蓋用戶的創建和用戶的列表。 無需定義實體或存儲庫或其他任何內容。 您甚至不必在 spring @Configuration定義數據源。 上面的代碼(您必須測試)確實是您所需要的,因此您可以將其連接到@Controller並完成它。

如果您不使用 JNDI,那也沒有問題:您可以使用HikariCP來定義您的數據源,提供額外的參數作為參數。

無論您擁有多少不同的數據源,此解決方案都將起作用,並且不需要重新部署,除非您確實必須處理其功能。 此外,它不需要開發人員了解 JPA,也不需要將配置散布到各處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM