我对模式的概念很陌生。我正在练习我的依赖注入技能以及使用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
关键字..
答案 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访问数据是一个很酷且超级棒的依赖 你可以从这里[
了解它假设您有一个域名 @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)
我想对您的解决方案进行一些改进:
new
创建任何注入的bean。让Spring为您实例化并管理这些bean。@Repository
注释标记持久性类。我建议您使用Spring Boot,一个固定版本的Spring。看看他们的guides,了解如何正确使用它。
答案 2 :(得分:0)
当我构建Web应用程序时,我通常按如下方式定义完整链:
客户端:
查看 - 这是MVC中的 V ,您可以在其中控制视觉效果&amp;用户操作派生的工作流程。
控制器 - 这是管理工作流的MVC中的 C 。大多数客户端处理将在此处进行,并且可以进行多个客户端调用以获取/发送数据或执行查找。
客户端 - 这是您调用REST Web服务并解析/反序列化结果/处理异常的地方。
服务器端:
RestController (有时称为资源) - 这是您的REST API端点。在这里你提取&amp;验证请求。
服务 - 这是您的大多数服务器逻辑的用武之地。有时您可能需要进行多次数据访问调用或调用其他服务功能。
DataAccessObject (有时称为提供程序) - 这是您将数据库中的数据提取到模型中的数据库交互。 CRUD操作(创建读取更新删除)
示例场景: 让我们说我们想提交数据&amp;给定用户的权限
UserDAO&amp; PermissionDAO - 将传递的模型保存到各自的表中。
返回服务,返回RestController,返回客户端(解析响应),返回控制器(使用重定向或成功消息向前移动工作流程)。
<强>结论:强>
这可能看起来像很多中间步骤,但这种设计提供了很大的灵活性,特别是如果您构建大型,复杂的Web服务。每个组件都有一个特定的目的,遵循简单的命名约定,并将复杂的逻辑分成更小,更简单的步骤。