DEV Community

Thiago Lino
Thiago Lino

Posted on

2

Spring com MongoDB

Hoje em dia com tantas opções para armazenamento de informações para necessidades diferentes, saber como trabalhar com estas opções é importante.

Por isso decidi escrever esse tutorial de como criar uma aplicação em java utilizando um banco de dados NoSQL.
E para isto criei uma POC para ilustrar utilizando as tecnologias, java 8, spring(spring data mongodb) e o mongoDB.

Decidi por dividir o tutorial e iniciar este com a integração da nossa aplicação com a base de dados.

Vamos iniciar baixando o spring no Spring Initializr. E lá já podemos especificar as dependências necessárias.

fing. 1 - print com as dependências
fig. 1 - print com as dependências

Aqui selecionei o Spring Web, já que pretendo montar aqui uma aplicação web e ja vem com o Spring MVC além do servidor web Apache Tomcat, Thymeleaf para ser nosso template e por último o Spring Data MongoDB que vai nos auxiliar a guardar e recuperar nossa informação.

Agora vamos ao MongoDB e aqui invés de subir em um docker container ou até instalar localmente eu optei por usar a versão cloud e lá podemos utilizar a versão trial.

print mongodb cloud
fig. 2 - print mongodb cloud

Esse doc da um passo a passo para:

  • criação da conta grátis
  • do cluster
  • adicionar seu IP para acesso ao cluster
  • criação de um usuário para o cluster

O doc é bem explicado e tranquilo de seguir, porém só encontrei a versão em inglês.

Com os passos acima realizados é hora de testar conectando nossa aplicação ao cluster recém criado.

Precisamos recuperar nossa string de conexão, para isto acesse seu cluster e no dash clique em Connect

dash do cluster para pegar o host
fig. 3 - dash do cluster para pegar o host

E no box que vai abrir selecione Connect your application

box com opções de conexão
fig. 4 - box com opções de conexão

E aqui vamos selecionar o driver para a conexão e neste caso Java e a versão mais recente dele e logo abaixo já temos nossa string de conexão.

box para seleção de driver e string de conexão
fig. 5 - box para seleção de driver e string de conexão

Na fig. 3 no dash do cluster podemos criar nosso database clicando em Browse Data que irá abrir uma tela com nossas collections.

box para criar database e collection
fig. 6 - box para criar database e collection

Clicando em Create Database irá abrir um box para definirmos o nomes da database e collection.

Certo agora podemos definir estar informações em nossa aplicação, no arquivo application.properties dentro de resources.

localização do arquivo application.properties
fig. 7 - localização do arquivo application.properties

Aqui vamos definir as properties necessárias para conectar a nossa database.

spring.data.mongodb.uri={aqui nossa string de conexão}
spring.data.mongodb.database={aqui o nome da database criada}
Enter fullscreen mode Exit fullscreen mode

E ao iniciar nossa aplicação vamos receber uma mensagem similar a esta.

mensagem de conexão criada com o mongodb
fig.8 - mensagem de conexão criada com o mongodb

Por último podemos já interagir com nossa database e collection recém-criadas, inciando com a criação de um repository.

Dentro do nosso package podemos criar um diretório novo chamado repository e dentro dele nossa interface a PetRepository esta por sua vez vai extender a MongoRepository que traz os métodos como insert(), findAll(), saveAll() para o comunicação com nosso Mongo.

@Repository
public interface PetRepository extends MongoRepository<Pet, String> {
}
Enter fullscreen mode Exit fullscreen mode

Adicionamos a anotação @Repository para o spring saber do que se trata e além disso passamos para nosso MongoRepository a entity Pet que vamos criar agora.

Aqui vamos fazer uma simples Entity com o identificador id(o MongoDB precisa deste) com a anotação @id, name, age e type do pet que vamos manipular. Anotamos a entidade com o nome da collection que vamos mapear.

@Document(collection="pets")
public class Pet {

    @Id
    private String id;

    private String name;
    private int age;
    private String type;

// todos os getters e setters
}
Enter fullscreen mode Exit fullscreen mode

Só um detalhe para o atributo type que aqui pretendo criar uma classe para ele, porém para agilizar o teste fiz com tipo String.

Com isso já podemos criar nosso service que vai chamar os métodos do nosso repository. Criamos um pacote chamado service e dentro dele nosso PetService com um método para retornar todos os pets existentes.
Anotamos a classe com a anotação @Service e injetamos nossa dependência PetRepository com a anotação @Autowired e criamos o nosso método findAll()

@Service
public class PetService {

    @Autowired
    private PetRepository repository;

    public List<Pet> findAll() {
        return repository.findAll();
    }
}
Enter fullscreen mode Exit fullscreen mode

E agora para ver nossos pets cadastrados vamos criar uma controller para através da nossa service resgatar nossos pets. No código abaixo da para ver que algumas partes são similares a nossa service, mudando alguns detalhes como a injeção que desta vez é nossa PetService e as anotações usadas, como a @RequestMapping para mapear as requisições recebidas. E por último recebemos como parâmetro um Model para setar o atributo para nossa view

@Controller
@RequestMapping("/pets")
public class PetController {

    @Autowired
    private PetService petService;

    @RequestMapping("/list")
    public String list(Model model) {
        final List<Pet> petList = petService.findAll();
        model.addAttribute("pets", petList);

        return "pets/list";
    }
}
Enter fullscreen mode Exit fullscreen mode

Só precisamos criar nosso arquivo html em um diretório dentro de resources > templates chamados pets. Aqui fiz um html bem simples, apenas para listar o nome e idade dos nossos pets e neste html como estamos usando a biblioteca thymeleaf usei as propriedades da mesma para iterar e exibir os itens.

<body>
    <div id="listPets">
        <h3>List all pets</h3>
        <table>
            <thead>
            <tr>
                <td>Name: </td>
                <td>Age: </td>
            </tr>
            </thead>
            <tr th:each="pet : ${pets}">
                <td><span th:text="${pet.name}"></span></td>
                <td><span th:text="${pet.age}"></span></td>
            </tr>
        </table>
    </div>
</body>
Enter fullscreen mode Exit fullscreen mode

E quando rodarmos temos uma página sem itens. E por quê? Porque não adicionamos nenhum item e agora é uma boa oportunidade para também testarmos o insert.

Na nossa entity criei um construtor, para facilitar a atribuição da nossa entidade, passando o name, type e age.

public Pet(String name, String type, int age) {
     this.name = name;
     this.type = type;
     this.age = age;
}
Enter fullscreen mode Exit fullscreen mode

No service criamos um novo método chamado save que recebe a entidade Pet e chamamos nosso PetRepository chamando o método save() passando nosso pet.

public void save(Pet pet) {
     repository.save(pet);
}
Enter fullscreen mode Exit fullscreen mode

Nossa controller vai chamar o save() da nossa PetService
passando um novo Pet e retornando uma string com o html que vamos criar

@GetMapping("/populate")
public String populateWithPets() {
     petService.save(new Pet("nina", "cat", 7));
     return "pets/populate";
}
Enter fullscreen mode Exit fullscreen mode

E por fim criamos um html, aqui pode ser vazio, em templates > pets, que já tinhamos criado anteriormente.

E se tudo deu certo depois de acessar nossa url pets/populate podemos conferir nosso pet recém salvo em pets/list ou até mesmo dentro do nosso cluster la no mongodb atlas

pet salvo no mongodb
fig. - 9 pet salvo no mongodb

E para esta primeira parte do tutorial creio ser o suficiente, pretendo continuar com o tutorial utilizando esta app para nos auxiliar. Se tiverem alguma dúvida, dificuldade ou verem algum ponto que poderia ter feito de outra maneira só comentarem para interagirmos.

Obrigado e nos vemos na continuação =)

Image of Wix Studio

2025: Your year to build apps that sell

Dive into hands-on resources and actionable strategies designed to help you build and sell apps on the Wix App Market.

Get started

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay