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:
- Spring Boot 2.0.3
- Maven
- JDK 1.8
- Eclipse + Spring Tool Suite
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
Cấu trúc project.
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 collectionplayer
- 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: