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

最佳答案

如果您使用的是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访问数据的一种非常酷的超棒依赖
您可以从这里阅读它[https://spring.io/guides/gs/accessing-data-mongodb/]

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

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接口,并插入了它可以使用的值和ID的类型:User和Long。该界面开箱即用,具有许多操作,包括标准的CRUD操作(创建读取更新更新删除)。

现在您可以轻松地在控制器中使用它
@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;

09-27 01:39
查看更多