2017-10-13 86 views
0

我對模式的概念很陌生。我正在練習依賴注入技能以及使用DAO原則。我編寫的代碼很有用,但我覺得它可以用更優雅的方式編寫。我已經嘗試重組它,我看到一個模式,但是那些複雜的事情,所以不知道我是否正確實施它。作爲Web應用程序與數據庫通信並拋出結果的一般規則,應該如何構造其項目? 我聽說過MVC原理,但並不一定會將數據庫添加到組合中。如何構造與數據庫通信的控制器

這是我到目前爲止有:

一個在Controller包包含控制器類:

@RestController 
public class ResponseController { 

    @Autowired 
    MongoBase dbConnection; 

    @RequestMapping(value = "/jsonresult", method = RequestMethod.GET) 
    @ResponseBody 
    public String jsonresult(@RequestParam(value = "id", required = true) String id){ 

     return dbConnection.documentToJSON(id, Constants.database,Constants.collection); 

    } 

    @RequestMapping(value = "/alljsonresult", method = RequestMethod.GET) 
    @ResponseBody 
    public String alljsonresult(){ 

     return dbConnection.allDocumentToJSON(Constants.database,Constants.collection); 
    }} 

一個包含CRUD方法到數據庫中Database包裝類:

@Component 
public class MongoBase { 

    @Autowired 
    MongoClient mongoClient; 

    public MongoBase() { 
     try { 
      mongoClient = new MongoClient("localhost", 27017); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void printAllCollection(String databaseName, String collectionName) { 

     ... 

    } 

那麼有沒有更好的方法/更有效的寫作方式?此外,我覺得在Monogbase類我還沒有完全實現DI,因爲它包含了new關鍵詞..

回答

0

我想推薦一些改進,您的解決方案:

  1. 你使用Spring。您不應使用new創建任何注入的豆。讓Spring爲你實例化和管理這些bean。
  2. 使用@Repository註釋標記您的持久性類。
  3. 使您的存儲庫類接口基於。
  4. 不要將「Mongo」嵌入到類名中。您現在正好將Mongo用作持久性提供程序,但稍後您可能會改變主意。不要在類名中顯示實現信息 - 隱藏它。
  5. 控制器是UI的一部分。它使用存儲庫和/或服務來完成用例。使用Spring將知識庫注入Controller是完全正確的。

我建議您使用Spring Boot,這是Spring的一個自以爲是的版本。看看他們的guides瞭解如何正確使用它。

0

當我構建Web應用程序我通常定義上滿鏈如下:

客戶端:

查看 - 這是MVC中V,你控制的視覺效果&用戶操作派生工作流。

控制器 - 這是在管理工作流的MVC中的C。大多數客戶端處理將在此處進行,並且可以進行多個客戶端調用來獲取/發送數據或執行查找。

客戶端 - 這是您調用REST Web服務並解析/反序列化結果/句柄異常的地方。

服務器端:

RestController(有時被稱爲資源) - 這是你的REST API端點。在此解壓縮&驗證請求。

服務 - 這是大多數服務器邏輯將去的地方。有時您可能必須進行多個數據訪問調用或調用其他服務功能。

DataAccessObject(有時稱爲提供者) - 這是您的數據庫交互,將數據從數據庫中提取到模型中。 CRUD操作(創建,讀取,更新,刪除)

示例場景: 比方說,我們要提交數據&權限給定用戶

  • UserView.jsp - 用戶&許可數據和點擊用戶類型提交。
  • UserController.java - 驗證用戶&權限數據,執行任何必要的查找,然後調用UserClient。
  • UserClient.java - 構建REST請求並調用/ user/create REST端點。
  • UserRestController.java - 解包/驗證請求,然後調用UserManagementService
  • UserManagementService.java - 服務器邏輯發生在這裏!比方說,我有兩個表在我的數據庫。用戶表和權限表。我想將用戶信息存儲在用戶表中,並將權限信息存儲在權限表中,因此我將調用用戶數據的UserDAO和權限數據的PermissionDAO。
  • UserDAO & PermissionDAO - 將傳遞的模型保存到它們各自的表中。

  • 返回服務,返回到RestController,返回到客戶端(分析響應),返回到控制器(使用重定向或成功消息向前移動工作流)。

結論:

這可能看起來像很多的中間步驟,但這樣的設計提供了一噸的靈活性,特別是如果你的建築龐大,複雜的網絡服務。每個組件都有一個特定的目的,遵循一個簡單的命名約定,並將複雜的邏輯分成更小,更簡單的步驟。

1

如果使用springboot,那麼你就不需要這個老式 也不需要它來創建mongoClient豆你的自我,春天開機幫你 你只需要在應用程序中添加以下屬性。性能文件

#mongodb 
spring.data.mongodb.host=localhost 
spring.data.mongodb.port=27017 
spring.data.mongodb.database=app1 

還聲明彈簧引導起動數據的MongoDB在你的POM或gradle這個 它是與MongoDB的 訪問數據的冷靜和超級真棒依賴,你可以從這裏讀到它[https://spring.io/guides/gs/accessing-data-mongodb/]

假設你有一個域 @Document(集合= 「域」)

public class User { 

    @Id 
    private long id; 

    @Indexed(unique = true) 
    private String domain; 

    private boolean displayAds; 

    //getters and setters 
} 

現在,如果我們需要執行的操作豆腐在這個領域,擴展MongoRepository,你自動擁有CRUD功能。 Spring數據附帶許多神奇的findBy查詢,查看官方Spring數據MongoDB - 查詢方法的詳細信息。

public interface UserRepository extends MongoRepository<User, Long> { 

    Domain findFirstByDomain(String domain); 

    Domain findByDomainAndDisplayAds(String domain, boolean displayAds); 

    //Supports native JSON query string 
    @Query("{domain:'?0'}") 
    Domain findCustomByDomain(String domain); 

    @Query("{domain: { $regex: ?0 } })") 
    List<Domain> findCustomByRegExDomain(String domain); 

} 

UserRepository擴展了MongoRepository接口,並插入值類型和它的工作原理:User和Long。開箱即用,這個接口帶有很多操作,包括標準的CRUD操作(create-read-update-delete)。

現在你可以在你的控制器 @RestController

public class ResponseController { 

@Autowired 
UserRepository userRepository; 

@RequestMapping(method = RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    User create(@RequestBody @Valid User user) { 
     return userRepository.create(user); 
    } 

} 

,你也可以用它做很多事情伊斯利使用它。你只需要去扔doc。

您也可以使用mongoTemplate用於執行查詢

@Autowired 
    MongoTemplate mongoTemplate; 
+0

Spring的數據推薦非常出色。 Spring Boot是要走的路。 – duffymo