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.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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. * @package: com.xkcoding.mongodb.model
  89. * @description: 文章实体类
  90. * @author: yangkai.shen
  91. * @date: Created in 2018-12-28 16:21
  92. * @copyright: Copyright (c) 2018
  93. * @version: V1.0
  94. * @modified: yangkai.shen
  95. */
  96. @Data
  97. @Builder
  98. @NoArgsConstructor
  99. @AllArgsConstructor
  100. public class Article {
  101. /**
  102. * 文章id
  103. */
  104. @Id
  105. private Long id;
  106. /**
  107. * 文章标题
  108. */
  109. private String title;
  110. /**
  111. * 文章内容
  112. */
  113. private String content;
  114. /**
  115. * 创建时间
  116. */
  117. private Date createTime;
  118. /**
  119. * 更新时间
  120. */
  121. private Date updateTime;
  122. /**
  123. * 点赞数量
  124. */
  125. private Long thumbUp;
  126. /**
  127. * 访客数量
  128. */
  129. private Long visits;
  130. }
  131. ```
  132. ## ArticleRepository.java
  133. ```java
  134. /**
  135. * <p>
  136. * 文章 Dao
  137. * </p>
  138. *
  139. * @package: com.xkcoding.mongodb.repository
  140. * @description: 文章 Dao
  141. * @author: yangkai.shen
  142. * @date: Created in 2018-12-28 16:30
  143. * @copyright: Copyright (c) 2018
  144. * @version: V1.0
  145. * @modified: yangkai.shen
  146. */
  147. public interface ArticleRepository extends MongoRepository<Article, Long> {
  148. /**
  149. * 根据标题模糊查询
  150. *
  151. * @param title 标题
  152. * @return 满足条件的文章列表
  153. */
  154. List<Article> findByTitleLike(String title);
  155. }
  156. ```
  157. ## ArticleRepositoryTest.java
  158. ```java
  159. /**
  160. * <p>
  161. * 测试操作 MongoDb
  162. * </p>
  163. *
  164. * @package: com.xkcoding.mongodb.repository
  165. * @description: 测试操作 MongoDb
  166. * @author: yangkai.shen
  167. * @date: Created in 2018-12-28 16:35
  168. * @copyright: Copyright (c) 2018
  169. * @version: V1.0
  170. * @modified: yangkai.shen
  171. */
  172. @Slf4j
  173. public class ArticleRepositoryTest extends SpringBootDemoMongodbApplicationTests {
  174. @Autowired
  175. private ArticleRepository articleRepo;
  176. @Autowired
  177. private MongoTemplate mongoTemplate;
  178. @Autowired
  179. private Snowflake snowflake;
  180. /**
  181. * 测试新增
  182. */
  183. @Test
  184. public void testSave() {
  185. Article article = new Article(1L, RandomUtil.randomString(20), RandomUtil.randomString(150), DateUtil.date(), DateUtil
  186. .date(), 0L, 0L);
  187. articleRepo.save(article);
  188. log.info("【article】= {}", JSONUtil.toJsonStr(article));
  189. }
  190. /**
  191. * 测试新增列表
  192. */
  193. @Test
  194. public void testSaveList() {
  195. List<Article> articles = Lists.newArrayList();
  196. for (int i = 0; i < 10; i++) {
  197. articles.add(new Article(snowflake.nextId(), RandomUtil.randomString(20), RandomUtil.randomString(150), DateUtil
  198. .date(), DateUtil.date(), 0L, 0L));
  199. }
  200. articleRepo.saveAll(articles);
  201. log.info("【articles】= {}", JSONUtil.toJsonStr(articles.stream()
  202. .map(Article::getId)
  203. .collect(Collectors.toList())));
  204. }
  205. /**
  206. * 测试更新
  207. */
  208. @Test
  209. public void testUpdate() {
  210. articleRepo.findById(1L).ifPresent(article -> {
  211. article.setTitle(article.getTitle() + "更新之后的标题");
  212. article.setUpdateTime(DateUtil.date());
  213. articleRepo.save(article);
  214. log.info("【article】= {}", JSONUtil.toJsonStr(article));
  215. });
  216. }
  217. /**
  218. * 测试删除
  219. */
  220. @Test
  221. public void testDelete() {
  222. // 根据主键删除
  223. articleRepo.deleteById(1L);
  224. // 全部删除
  225. articleRepo.deleteAll();
  226. }
  227. /**
  228. * 测试点赞数、访客数,使用save方式更新点赞、访客
  229. */
  230. @Test
  231. public void testThumbUp() {
  232. articleRepo.findById(1L).ifPresent(article -> {
  233. article.setThumbUp(article.getThumbUp() + 1);
  234. article.setVisits(article.getVisits() + 1);
  235. articleRepo.save(article);
  236. log.info("【标题】= {}【点赞数】= {}【访客数】= {}", article.getTitle(), article.getThumbUp(), article.getVisits());
  237. });
  238. }
  239. /**
  240. * 测试点赞数、访客数,使用更优雅/高效的方式更新点赞、访客
  241. */
  242. @Test
  243. public void testThumbUp2() {
  244. Query query = new Query();
  245. query.addCriteria(Criteria.where("_id").is(1L));
  246. Update update = new Update();
  247. update.inc("thumbUp", 1L);
  248. update.inc("visits", 1L);
  249. mongoTemplate.updateFirst(query, update, "article");
  250. articleRepo.findById(1L)
  251. .ifPresent(article -> log.info("【标题】= {}【点赞数】= {}【访客数】= {}", article.getTitle(), article.getThumbUp(), article
  252. .getVisits()));
  253. }
  254. /**
  255. * 测试分页排序查询
  256. */
  257. @Test
  258. public void testQuery() {
  259. Sort sort = Sort.by("thumbUp", "updateTime").descending();
  260. PageRequest pageRequest = PageRequest.of(0, 5, sort);
  261. Page<Article> all = articleRepo.findAll(pageRequest);
  262. log.info("【总页数】= {}", all.getTotalPages());
  263. log.info("【总条数】= {}", all.getTotalElements());
  264. log.info("【当前页数据】= {}", JSONUtil.toJsonStr(all.getContent()
  265. .stream()
  266. .map(article -> "文章标题:" + article.getTitle() + "点赞数:" + article.getThumbUp() + "更新时间:" + article.getUpdateTime())
  267. .collect(Collectors.toList())));
  268. }
  269. /**
  270. * 测试根据标题模糊查询
  271. */
  272. @Test
  273. public void testFindByTitleLike() {
  274. List<Article> articles = articleRepo.findByTitleLike("更新");
  275. log.info("【articles】= {}", JSONUtil.toJsonStr(articles));
  276. }
  277. }
  278. ```
  279. ## 参考
  280. 1. Spring Data MongoDB 官方文档:https://docs.spring.io/spring-data/mongodb/docs/2.1.2.RELEASE/reference/html/
  281. 2. MongoDB 官方镜像地址:https://hub.docker.com/_/mongo
  282. 3. MongoDB 官方快速入门:https://docs.mongodb.com/manual/tutorial/getting-started/
  283. 4. MongoDB 官方文档:https://docs.mongodb.com/manual/

一个用来深度学习并实战 spring boot 的项目,目前总共包含 66 个集成demo,已经完成 55 个。