2017-10-13 83 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