Code ví dụ Spring Boot – Spring Data MongoDB với MongoRepository

Code ví dụ Spring Boot – Spring Data MongoDB với MongoRepository

Ở bài này mình sẽ sử dụng Spring Boot với Spring Data để thực hiện ví dụ thêm, sửa, xóa dữ liệu với database MongoDB.

Các công nghệ sử dụng:

Tạo Database

Với MongoDB, ta không cần phải tạo trước database hay collections, khi Spring boot kết nối tới MongoDB mà database chưa tồn tại thì nó sẽ được tự động tạo.

Khởi động MongoDB và xem lại các thông số cài đặt MongoDB, ví dụ uri MongoDB của mình là mongodb://localhost:27017

(Xem lại: Hướng dẫn cài đặt, cấu hình MongoDB)

Tạo Spring Boot Project

spring starter project

Code ví dụ Spring Boot - Spring Data MongoDB với MongoRepository Code ví dụ Spring Boot - Spring Data MongoDB với MongoRepository

Cấu trúc project.

Code ví dụ Spring Boot - Spring Data MongoDB với MongoRepository

Cấu hình MongoDB:

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/stackjava

uri của MongoDB sẽ có dạng: mongodb://username:password@host:port?replicaset=name

Server MongoDB của mình không sử dụng username/password, cũng không tạo Replica Set, và thực hiện kết nối tới database stackjava

File Entities

package stackjava.com.sbmongo.entities;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "player")
public class Player {

  @Id
  private String id;
  private String name;
  private String footballClub;
  private String position;
  private int age;

  // getter - setter

}
  • Annotation @Document tương tự như annotation @Table khi làm việc với JPA, nó sẽ thực hiện mapping class với collection tương ứng, ví dụ ở đây sẽ mapping với collection player
  • Annotation @Id đánh dấu khóa chính, nếu bạn không truyền id lúc insert thì nó sẽ tự động tạo id cho bạn.

File Repository

package stackjava.com.sbmongo.repository;

import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;
import stackjava.com.sbmongo.entities.Player;

@Repository
public interface PlayerRepository extends MongoRepository<Player, String>{
  
    @Query("{ 'name': ?0}")
  List<Player> findByName(String name);
  
    List<Player> findByNameLike(String name);

}

Phần repository sẽ sử dụng Spring Data, ở đây mình thừa kế MongoRepository.

MongoRepository giống hệt với JpaRepository, nó cũng định nghĩa sẵn các method như findAll, findById, remove, save… và cũng hỗ trợ cả Query Creation, điểm khác biệt duy nhất ở đây là trong trường hợp bạn muốn chỉ rõ câu query thì sẽ là các tham số như khi thực hiện method find() trong MongoDB chứ không phải là các câu lệnh SQL

Demo Insert, thêm dữ liệu

@SpringBootApplication
public class DemoInsert {

  public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(DemoInsert.class, args);
    PlayerRepository playerRepository = context.getBean(PlayerRepository.class);

    System.out.println("--------------- Insert -----------------");
    Player player1 = new Player();
    player1.setName("Ronaldo");
    player1.setAge(33);
    player1.setFootballClub("Juventus");
    player1.setPosition("Striker");
    playerRepository.save(player1);
    
    Player player2 = new Player();
    player2.setId("1");
    player2.setName("Ramos");
    player2.setAge(19);
    player2.setFootballClub("Real Madrid");
    player2.setPosition("Midfielder");
    playerRepository.save(player2);
    System.out.println("Insert Success!");
    
    System.out.println("--------------- FindAll -----------------");
    List<Player> allPlayers = playerRepository.findAll();
    for(Player player: allPlayers) {
      System.out.println(player);
    }
    
  }
}

Kết quả:

--------------- Insert -----------------
Insert Success!
--------------- FindAll -----------------
Player [id=5b8bf785744aad35d4a3ed61, name=Ronaldo, footballClub=Juventus, position=Striker, age=33]
Player [id=1, name=Ramos, footballClub=Real Madrid, position=Midfielder, age=19]

Demo find, search document

package stackjava.com.sbmongo;

import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import stackjava.com.sbmongo.entities.Player;
import stackjava.com.sbmongo.repository.PlayerRepository;

@SpringBootApplication
public class DemoSearch {

  public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(DemoSearch.class, args);
    PlayerRepository playerRepository = context.getBean(PlayerRepository.class);

    System.out.println("--------------- Find Player Where name = 'Ronaldo' -----------------");
    List<Player> list1 = playerRepository.findByName("Ronaldo");
    for(Player player: list1) {
      System.out.println(player);
    }
    
    System.out.println("--------------- Find Player Where name contains 'Ra' -----------------");
    List<Player> list2 = playerRepository.findByNameLike("Ra");
    for(Player player: list2) {
      System.out.println(player);
    }
    
  }
}

Kết quả:

--------------- Find Player Where name = 'Ronaldo' -----------------
Player [name=Ronaldo, footballClub=Juventus, position=Striker, age=33]
--------------- Find Player Where name contains 'Ra' -----------------
Player [name=Ramos, footballClub=Real Madrid, position=Midfielder, age=19]

Demo update document

Ví dụ mình thực hiện sửa tên của player có id = ‘1’ thành ‘Marcelo’

package stackjava.com.sbmongo;

import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import stackjava.com.sbmongo.entities.Player;
import stackjava.com.sbmongo.repository.PlayerRepository;

@SpringBootApplication
public class DemoUpdate {

  public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(DemoUpdate.class, args);
    PlayerRepository playerRepository = context.getBean(PlayerRepository.class);

    System.out.println("--------------- FindAll -----------------");
    List<Player> allPlayers = playerRepository.findAll();
    for(Player player: allPlayers) {
      System.out.println(player);
    }
    
    System.out.println("--------------- Update -----------------");
    Player result = playerRepository.findById("1").orElse(null);
    if(result == null) {
      System.out.println("Not found player with id = 1");
    } else {
      result.setName("Marcelo");
      playerRepository.save(result);
      System.out.println("Updated!");
    }
    
    System.out.println("--------------- FindAll After Update -----------------");
    allPlayers = playerRepository.findAll();
    for(Player player: allPlayers) {
      System.out.println(player);
    }
    
  }
}

Kết quả:

--------------- FindAll -----------------
Player [id=5b8bf785744aad35d4a3ed61, name=Ronaldo, footballClub=Juventus, position=Striker, age=33]
Player [id=1, name=Ramos, footballClub=Real Madrid, position=Midfielder, age=19]
--------------- Update -----------------
Updated!
--------------- FindAll After Update -----------------
Player [id=5b8bf785744aad35d4a3ed61, name=Ronaldo, footballClub=Juventus, position=Striker, age=33]
Player [id=1, name=Marcelo, footballClub=Real Madrid, position=Midfielder, age=19]

Demo delete – xóa document

Ví dụ thực hiện xóa player có id = ‘1’

package stackjava.com.sbmongo;

import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import stackjava.com.sbmongo.entities.Player;
import stackjava.com.sbmongo.repository.PlayerRepository;

@SpringBootApplication
public class DemoDelete {

  public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(DemoUpdate.class, args);
    PlayerRepository playerRepository = context.getBean(PlayerRepository.class);

    System.out.println("--------------- FindAll -----------------");
    List<Player> allPlayers = playerRepository.findAll();
    for(Player player: allPlayers) {
      System.out.println(player);
    }
    
    System.out.println("--------------- Delete -----------------");
    Player result = playerRepository.findById("1").orElse(null);
    if(result == null) {
      System.out.println("Not found player with id = 1");
    } else {
      playerRepository.delete(result);
      System.out.println("Deleted!");
    }
    
    System.out.println("--------------- FindAll After Delete -----------------");
    allPlayers = playerRepository.findAll();
    for(Player player: allPlayers) {
      System.out.println(player);
    }
    
  }
}

Kết quả:

--------------- FindAll -----------------
Player [id=5b8bf785744aad35d4a3ed61, name=Ronaldo, footballClub=Juventus, position=Striker, age=33]
Player [id=1, name=Marcelo, footballClub=Real Madrid, position=Midfielder, age=19]
--------------- Delete -----------------
Deleted!
--------------- FindAll After Delete -----------------
Player [id=5b8bf785744aad35d4a3ed61, name=Ronaldo, footballClub=Juventus, position=Striker, age=33]

 

Các bài tiếp theo mình sẽ thực hiện ví dụ Spring Boot với MongoDB sử dụng MongoTemplate, MongoOperation, BulkOperations để thực hiện batch insert, batch update.

Okay, Done!

Download code ví dụ trên tại đây.

References:

https://docs.spring.io/spring-data/../reference/html/

stackjava.com