You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 8.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. # spring-boot-demo-mongodb
  2. > 此 demo 主要演示了 Spring Boot 如何集成 MongoDB,使用官方的 starter 实现增删改查。
  3. ## 注意
  4. 作者编写本demo时,MongoDB 最新版本为 `4.1`,使用 docker 运行,下面是所有步骤:
  5. 1. 下载镜像:`docker pull mongo:4.1`
  6. 2. 运行容器:`docker run -d -p 27017:27017 -v /Users/yangkai.shen/docker/mongo/data:/data/db --name mongo-4.1 mongo:4.1`
  7. 3. 停止容器:`docker stop mongo-4.1`
  8. 4. 启动容器:`docker start mongo-4.1`
  9. ## pom.xml
  10. ```xml
  11. <?xml version="1.0" encoding="UTF-8"?>
  12. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  13. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  14. <modelVersion>4.0.0</modelVersion>
  15. <artifactId>spring-boot-demo-mongodb</artifactId>
  16. <version>1.0.0-SNAPSHOT</version>
  17. <packaging>jar</packaging>
  18. <name>spring-boot-demo-mongodb</name>
  19. <description>Demo project for Spring Boot</description>
  20. <parent>
  21. <groupId>com.xkcoding</groupId>
  22. <artifactId>spring-boot-demo</artifactId>
  23. <version>1.0.0-SNAPSHOT</version>
  24. </parent>
  25. <properties>
  26. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  27. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  28. <java.version>1.8</java.version>
  29. </properties>
  30. <dependencies>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. <dependency>
  45. <groupId>cn.hutool</groupId>
  46. <artifactId>hutool-all</artifactId>
  47. </dependency>
  48. <dependency>
  49. <groupId>com.google.guava</groupId>
  50. <artifactId>guava</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.projectlombok</groupId>
  54. <artifactId>lombok</artifactId>
  55. <optional>true</optional>
  56. </dependency>
  57. </dependencies>
  58. <build>
  59. <finalName>spring-boot-demo-mongodb</finalName>
  60. <plugins>
  61. <plugin>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-maven-plugin</artifactId>
  64. </plugin>
  65. </plugins>
  66. </build>
  67. </project>
  68. ```
  69. ## application.yml
  70. ```yaml
  71. spring:
  72. data:
  73. mongodb:
  74. host: localhost
  75. port: 27017
  76. database: article_db
  77. logging:
  78. level:
  79. org.springframework.data.mongodb.core: debug
  80. ```
  81. ## Article.java
  82. ```java
  83. /**
  84. * <p>
  85. * 文章实体类
  86. * </p>
  87. *
  88. * @author yangkai.shen
  89. * @date Created in 2018-12-28 16:21
  90. */
  91. @Data
  92. @Builder
  93. @NoArgsConstructor
  94. @AllArgsConstructor
  95. public class Article {
  96. /**
  97. * 文章id
  98. */
  99. @Id
  100. private Long id;
  101. /**
  102. * 文章标题
  103. */
  104. private String title;
  105. /**
  106. * 文章内容
  107. */
  108. private String content;
  109. /**
  110. * 创建时间
  111. */
  112. private Date createTime;
  113. /**
  114. * 更新时间
  115. */
  116. private Date updateTime;
  117. /**
  118. * 点赞数量
  119. */
  120. private Long thumbUp;
  121. /**
  122. * 访客数量
  123. */
  124. private Long visits;
  125. }
  126. ```
  127. ## ArticleRepository.java
  128. ```java
  129. /**
  130. * <p>
  131. * 文章 Dao
  132. * </p>
  133. *
  134. * @author yangkai.shen
  135. * @date Created in 2018-12-28 16:30
  136. */
  137. public interface ArticleRepository extends MongoRepository<Article, Long> {
  138. /**
  139. * 根据标题模糊查询
  140. *
  141. * @param title 标题
  142. * @return 满足条件的文章列表
  143. */
  144. List<Article> findByTitleLike(String title);
  145. }
  146. ```
  147. ## ArticleRepositoryTest.java
  148. ```java
  149. /**
  150. * <p>
  151. * 测试操作 MongoDb
  152. * </p>
  153. *
  154. * @author yangkai.shen
  155. * @date Created in 2018-12-28 16:35
  156. */
  157. @Slf4j
  158. public class ArticleRepositoryTest extends SpringBootDemoMongodbApplicationTests {
  159. @Autowired
  160. private ArticleRepository articleRepo;
  161. @Autowired
  162. private MongoTemplate mongoTemplate;
  163. @Autowired
  164. private Snowflake snowflake;
  165. /**
  166. * 测试新增
  167. */
  168. @Test
  169. public void testSave() {
  170. Article article = new Article(1L, RandomUtil.randomString(20), RandomUtil.randomString(150), DateUtil.date(), DateUtil
  171. .date(), 0L, 0L);
  172. articleRepo.save(article);
  173. log.info("【article】= {}", JSONUtil.toJsonStr(article));
  174. }
  175. /**
  176. * 测试新增列表
  177. */
  178. @Test
  179. public void testSaveList() {
  180. List<Article> articles = Lists.newArrayList();
  181. for (int i = 0; i < 10; i++) {
  182. articles.add(new Article(snowflake.nextId(), RandomUtil.randomString(20), RandomUtil.randomString(150), DateUtil
  183. .date(), DateUtil.date(), 0L, 0L));
  184. }
  185. articleRepo.saveAll(articles);
  186. log.info("【articles】= {}", JSONUtil.toJsonStr(articles.stream()
  187. .map(Article::getId)
  188. .collect(Collectors.toList())));
  189. }
  190. /**
  191. * 测试更新
  192. */
  193. @Test
  194. public void testUpdate() {
  195. articleRepo.findById(1L).ifPresent(article -> {
  196. article.setTitle(article.getTitle() + "更新之后的标题");
  197. article.setUpdateTime(DateUtil.date());
  198. articleRepo.save(article);
  199. log.info("【article】= {}", JSONUtil.toJsonStr(article));
  200. });
  201. }
  202. /**
  203. * 测试删除
  204. */
  205. @Test
  206. public void testDelete() {
  207. // 根据主键删除
  208. articleRepo.deleteById(1L);
  209. // 全部删除
  210. articleRepo.deleteAll();
  211. }
  212. /**
  213. * 测试点赞数、访客数,使用save方式更新点赞、访客
  214. */
  215. @Test
  216. public void testThumbUp() {
  217. articleRepo.findById(1L).ifPresent(article -> {
  218. article.setThumbUp(article.getThumbUp() + 1);
  219. article.setVisits(article.getVisits() + 1);
  220. articleRepo.save(article);
  221. log.info("【标题】= {}【点赞数】= {}【访客数】= {}", article.getTitle(), article.getThumbUp(), article.getVisits());
  222. });
  223. }
  224. /**
  225. * 测试点赞数、访客数,使用更优雅/高效的方式更新点赞、访客
  226. */
  227. @Test
  228. public void testThumbUp2() {
  229. Query query = new Query();
  230. query.addCriteria(Criteria.where("_id").is(1L));
  231. Update update = new Update();
  232. update.inc("thumbUp", 1L);
  233. update.inc("visits", 1L);
  234. mongoTemplate.updateFirst(query, update, "article");
  235. articleRepo.findById(1L)
  236. .ifPresent(article -> log.info("【标题】= {}【点赞数】= {}【访客数】= {}", article.getTitle(), article.getThumbUp(), article
  237. .getVisits()));
  238. }
  239. /**
  240. * 测试分页排序查询
  241. */
  242. @Test
  243. public void testQuery() {
  244. Sort sort = Sort.by("thumbUp", "updateTime").descending();
  245. PageRequest pageRequest = PageRequest.of(0, 5, sort);
  246. Page<Article> all = articleRepo.findAll(pageRequest);
  247. log.info("【总页数】= {}", all.getTotalPages());
  248. log.info("【总条数】= {}", all.getTotalElements());
  249. log.info("【当前页数据】= {}", JSONUtil.toJsonStr(all.getContent()
  250. .stream()
  251. .map(article -> "文章标题:" + article.getTitle() + "点赞数:" + article.getThumbUp() + "更新时间:" + article.getUpdateTime())
  252. .collect(Collectors.toList())));
  253. }
  254. /**
  255. * 测试根据标题模糊查询
  256. */
  257. @Test
  258. public void testFindByTitleLike() {
  259. List<Article> articles = articleRepo.findByTitleLike("更新");
  260. log.info("【articles】= {}", JSONUtil.toJsonStr(articles));
  261. }
  262. }
  263. ```
  264. ## 参考
  265. 1. Spring Data MongoDB 官方文档:https://docs.spring.io/spring-data/mongodb/docs/2.1.2.RELEASE/reference/html/
  266. 2. MongoDB 官方镜像地址:https://hub.docker.com/_/mongo
  267. 3. MongoDB 官方快速入门:https://docs.mongodb.com/manual/tutorial/getting-started/
  268. 4. MongoDB 官方文档:https://docs.mongodb.com/manual/