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