Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何构造与数据库通信的控制器_Java_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

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

Java 如何构造与数据库通信的控制器,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我对模式的概念很陌生。我正在练习依赖注入技能以及使用DAO原则。我写的代码很有用,但我觉得可以用更优雅的方式来写。我试着按照我看到的模式对其进行重组,但这会使事情变得复杂,所以不确定我是否正确地实现了它。一般来说,当web应用程序与数据库通信并抛出结果时,应该如何构造其项目? 我听说过MVC原则,但这并不一定会增加数据库 这就是我到目前为止所做的: 在控制器包中包含控制器的类: 包含数据库包中数据库的CRUD方法的类: 那么,有没有更好/更有效的方法来写这篇文章呢?另外,我觉得我还没有在Mono

我对模式的概念很陌生。我正在练习依赖注入技能以及使用DAO原则。我写的代码很有用,但我觉得可以用更优雅的方式来写。我试着按照我看到的模式对其进行重组,但这会使事情变得复杂,所以不确定我是否正确地实现了它。一般来说,当web应用程序与数据库通信并抛出结果时,应该如何构造其项目? 我听说过MVC原则,但这并不一定会增加数据库

这就是我到目前为止所做的:

在控制器包中包含控制器的类:

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


那么,有没有更好/更有效的方法来写这篇文章呢?另外,我觉得我还没有在Monogbase类中完全实现DI,因为它包含了新的关键字..

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

你用的是弹簧。您不应该使用new创建任何注入bean。让Spring为您实例化和管理这些bean。 使用@Repository注释来标记持久性类。 使您的存储库类基于接口。 不要将Mongo嵌入到类名中。您现在正使用Mongo作为持久性提供者,但稍后可能会改变主意。不要在类名中显示实现信息-隐藏它。 控制器是UI的一部分。它使用存储库和/或服务来实现用例。使用Spring将存储库注入控制器是完全正确的。
我建议您使用,一个固执己见的Spring版本。查看他们的应用程序,了解如何正确使用它。

当我构建web应用程序时,我通常将整个链定义如下:

客户端:

视图-这是MVC中的V,您可以在其中控制视觉效果和用户操作派生的工作流

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

客户端-在这里调用REST web服务并解析/反序列化结果/处理异常

服务器端:

RestController有时称为资源-这是您的RESTAPI端点。这里您提取并验证一个请求

服务-这是大多数服务器逻辑的所在。有时,您可能需要进行多个数据访问调用或调用其他服务函数

DataAccessObject有时称为Provider—这是将数据从数据库拉入模型的数据库交互。CRUD操作创建读取更新删除

示例场景: 假设我们要提交给定用户的数据和权限

jsp-用户在用户和权限数据中键入并点击提交。 java-验证用户和权限数据,进行任何必要的查找,然后调用UserClient。 java-构建REST请求并调用/user/create REST端点。 UserRestController.java-解包/验证请求,然后调用UserManagementService java-服务器逻辑发生在这里!假设我的数据库中有两个表。用户表和权限表。我想在user表中存储用户信息,在permission表中存储权限信息,因此我将为用户数据调用UserDAO,为权限数据调用PermissionDAO。 UserDAO&PermissionDAO-将传递的模型保存到各自的表中

返回到服务、返回到RestController、返回到客户端解析响应、返回到控制器使用重定向或成功消息向前移动工作流

结论:


这看起来可能需要很多中间步骤,但这种设计提供了很大的灵活性,尤其是在构建大型复杂web服务时。每个组件都有特定的用途,遵循简单的命名约定,并将复杂的逻辑拆分为更小、更简单的步骤。

如果您使用的是springboot,那么您就不需要这种旧样式 也不需要自己创建mongoClient bean,spring boot可以帮助您 您只需要在application.properties文件中添加以下属性

还声明了pom或gradle中的spring boot starter数据mongodb 对于使用MongoDB访问数据来说,这是一个非常酷的依赖项 你可以从这里读到[

假设你有一个域名 @Documentcollection=域

public class User {

    @Id
    private long id;

    @Indexed(unique = true)
    private String domain;

    private boolean displayAds;

    //getters and setters
}
现在,如果我们需要在这个域上执行curd操作,扩展MongoRepository,您可以自动使用CRUD函数。Spring数据附带许多神奇的查询,请查看官方的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);

}
你也可以用它做很多事情。你只需要把它扔掉,博士

您还可以使用mongoTemplate执行查询

 @Autowired
    MongoTemplate mongoTemplate;

Spring数据推荐非常好。 弹簧靴是最好的选择。
public class User {

    @Id
    private long id;

    @Indexed(unique = true)
    private String domain;

    private boolean displayAds;

    //getters and setters
}
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);

}
public class ResponseController {

@Autowired
UserRepository userRepository;

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

}
 @Autowired
    MongoTemplate mongoTemplate;