如何构建与数据库通信的控制器

时间:2017-10-13 17:13:54

标签: java spring spring-mvc spring-boot

我对模式的概念很陌生。我正在练习我的依赖注入技能以及使用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);
    }}

包含Database包中数据库的CRUD方法的类:

@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关键字..

3 个答案:

答案 0 :(得分:1)

如果您使用的是springboot,那么您不需要这种旧式 也不需要自己创建mongoClient bean,spring boot帮助你 您只需在 application.properties 文件

中添加以下属性
#mongodb 
spring.data.mongodb.host=localhost 
spring.data.mongodb.port=27017  
spring.data.mongodb.database=app1

还在你的pom或gradle中声明一个spring-boot-starter-data-mongodb 使用MongoDB访问数据是一个很酷且超级棒的依赖 你可以从这里[enter image description here

了解它

假设您有一个域名 @Document(collection =“domain”)

public class User {

    @Id
    private long id;

    @Indexed(unique = true)
    private String domain;

    private boolean displayAds;

    //getters and setters
}

现在如果我们需要在这个域上执行curd操作,扩展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接口,并插入了值类型和ID的用户: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);
    }

}

你也可以做很多事情。你只需要随身携带它。

您还可以使用mongoTemplate执行查询

 @Autowired
    MongoTemplate mongoTemplate;

答案 1 :(得分:0)

我想对您的解决方案进行一些改进:

  1. 您正在使用Spring。您不应使用new创建任何注入的bean。让Spring为您实例化并管理这些bean。
  2. 使用@Repository注释标记持久性类。
  3. 基于您的存储库类接口。
  4. 不要嵌入&#34; Mongo&#34;进入班级名称。您现在正好使用Mongo作为持久性提供程序,但您可能会在以后改变主意。不要在您的班级名称中显示实施信息 - 隐藏它。
  5. Controller是UI的一部分。它使用存储库和/或服务来完成用例。使用Spring将存储库注入Controller是完全正确的。
  6. 我建议您使用Spring Boot,一个固定版本的Spring。看看他们的guides,了解如何正确使用它。

答案 2 :(得分:0)

当我构建Web应用程序时,我通常按如下方式定义完整链:

客户端:

查看 - 这是MVC中的 V ,您可以在其中控制视觉效果&amp;用户操作派生的工作流程。

控制器 - 这是管理工作流的MVC中的 C 。大多数客户端处理将在此处进行,并且可以进行多个客户端调用以获取/发送数据或执行查找。

客户端 - 这是您调用REST Web服务并解析/反序列化结果/处理异常的地方。

服务器端:

RestController (有时称为资源) - 这是您的REST API端点。在这里你提取&amp;验证请求。

服务 - 这是您的大多数服务器逻辑的用武之地。有时您可能需要进行多次数据访问调用或调用其他服务功能。

DataAccessObject (有时称为提供程序) - 这是您将数据库中的数据提取到模型中的数据库交互。 CRUD操作(创建读取更新删除)

示例场景: 让我们说我们想提交数据&amp;给定用户的权限

  • UserView.jsp - 用户和用户类型权限数据和点击提交。
  • UserController.java - 验证用户和&amp;权限数据,执行任何必要的查找,然后调用UserClient。
  • UserClient.java - 构建REST请求并调用/ user / create REST端点。
  • UserRestController.java - 解包/验证请求,然后调用UserManagementService
  • UserManagementService.java - 服务器逻辑在这里发生!假设我的数据库中有两个表。用户表和权限表。我想将用户信息存储在User表中,将权限信息存储在权限表中,这样我就会调用UserDAO来获取用户数据,并调用PermissionDAO来获取权限数据。
  • UserDAO&amp; PermissionDAO - 将传递的模型保存到各自的表中。

  • 返回服务,返回RestController,返回客户端(解析响应),返回控制器(使用重定向或成功消息向前移动工作流程)。

<强>结论:

这可能看起来像很多中间步骤,但这种设计提供了很大的灵活性,特别是如果您构建大型,复杂的Web服务。每个组件都有一个特定的目的,遵循简单的命名约定,并将复杂的逻辑分成更小,更简单的步骤。