application-dev.yml
server:
port: 8888
mongo:
host: localhost
port: 27017
timeout: 60000
db: mamabike
配置类
1 package com.tangzhe.configuration; 2 3 import com.mongodb.MongoClient; 4 import com.mongodb.MongoClientOptions; 5 import com.mongodb.ServerAddress; 6 import com.tangzhe.autoid.SaveMongoEventListener; 7 import lombok.Data; 8 import org.springframework.boot.context.properties.ConfigurationProperties; 9 import org.springframework.context.annotation.Bean; 10 import org.springframework.context.annotation.Configuration; 11 import org.springframework.data.mongodb.core.MongoTemplate; 12 import org.springframework.data.mongodb.core.SimpleMongoDbFactory; 13 import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; 14 import org.springframework.data.mongodb.core.convert.MappingMongoConverter; 15 import org.springframework.data.mongodb.core.mapping.MongoMappingContext; 16 import org.springframework.data.mongodb.gridfs.GridFsTemplate; 17 18 /** 19 * Created by 唐哲 20 * 2018-03-13 17:20 21 * MongoDB配置 22 */ 23 @Configuration 24 @ConfigurationProperties(prefix = "mongo") 25 @Data 26 public class MongoDBConfiguration { 27 28 //mongodb服务地址 29 private String host; 30 31 //mongodb服务端口号 32 private Integer port; 33 34 //连接超时 35 private Integer timeout; 36 37 //mongodb数据库名 38 private String db; 39 40 /** 41 * 配置MongoDB模板 42 */ 43 @Bean 44 public MongoTemplate mongoTemplate(SimpleMongoDbFactory mongoDbFactory, 45 MappingMongoConverter mappingMongoConverter) { 46 return new MongoTemplate(mongoDbFactory, mappingMongoConverter); 47 } 48 49 /** 50 * 配置自增ID监听器 51 */ 52 @Bean 53 public SaveMongoEventListener saveMongoEventListener() { 54 return new SaveMongoEventListener(); 55 } 56 57 /** 58 * 配置GridFs模板,实现文件上传下载 59 */ 60 @Bean 61 public GridFsTemplate gridFsTemplate(SimpleMongoDbFactory mongoDbFactory, 62 MappingMongoConverter mappingMongoConverter) { 63 return new GridFsTemplate(mongoDbFactory, mappingMongoConverter); 64 } 65 66 /** 67 * 配置mongoDbFactory 68 */ 69 @Bean 70 public SimpleMongoDbFactory mongoDbFactory() { 71 MongoClientOptions options = MongoClientOptions.builder().connectTimeout(timeout).build(); 72 MongoClient client = new MongoClient(new ServerAddress(host, port), options); 73 return new SimpleMongoDbFactory(client, db); 74 } 75 76 /** 77 * 配置mongoMappingContext 78 */ 79 @Bean 80 public MongoMappingContext mongoMappingContext() { 81 return new MongoMappingContext(); 82 } 83 84 /** 85 * 配置defaultMongoTypeMapper 86 */ 87 @Bean 88 public DefaultMongoTypeMapper defaultMongoTypeMapper() { 89 //去掉_class字段 90 return new DefaultMongoTypeMapper(null); 91 } 92 93 /** 94 * 配置mappingMongoConverter 95 */ 96 @Bean 97 public MappingMongoConverter mappingMongoConverter(SimpleMongoDbFactory mongoDbFactory, 98 MongoMappingContext mongoMappingContext, 99 DefaultMongoTypeMapper defaultMongoTypeMapper) { 100 MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(mongoDbFactory, mongoMappingContext); 101 mappingMongoConverter.setTypeMapper(defaultMongoTypeMapper); 102 return mappingMongoConverter; 103 } 104 105 }
实体类
1 package com.tangzhe.repository; 2 3 import lombok.Data; 4 import org.springframework.data.annotation.Id; 5 import org.springframework.data.mongodb.core.mapping.Document; 6 import org.springframework.data.mongodb.core.mapping.Field; 7 8 import java.util.Date; 9 import java.util.List; 10 11 /** 12 * Created by 唐哲 13 * 2018-03-13 17:40 14 */ 15 @Document(collection = "article_info") 16 @Data 17 public class Article { 18 19 @Id 20 private String id; 21 22 @Field("title") 23 private String title; 24 25 @Field("v_count") 26 private Long visitCount; 27 28 @Field("tags") 29 private List<String> tags; 30 31 @Field("add_time") 32 private Date addTime; 33 34 }
repository类
1 package com.tangzhe.repository; 2 3 import org.springframework.data.domain.Pageable; 4 import org.springframework.data.domain.Sort; 5 import org.springframework.data.repository.CrudRepository; 6 7 import java.util.List; 8 9 /** 10 * Created by 唐哲 11 * 2018-03-14 22:04 12 */ 13 public interface ArticleRepository extends CrudRepository<Article, String> { 14 15 List<Article> findByTitle(String title); 16 17 List<Article> findByTitleAndVisitCount(String title, Long visitCount); 18 19 /** 分页查询 */ 20 List<Article> findByTitle(String title, Pageable pageable); 21 22 /** 排序 */ 23 List<Article> findByTitle(String title, Sort sort); 24 25 /** 查询头一条 */ 26 List<Article> findTop1ByTitle(String title); 27 28 /** 查询头二条 */ 29 List<Article> findTop2ByTitle(String title); 30 31 }
测试repository
1 package com.tangzhe.repository; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.boot.test.context.SpringBootTest; 7 import org.springframework.data.domain.PageRequest; 8 import org.springframework.data.domain.Sort; 9 import org.springframework.test.context.junit4.SpringRunner; 10 11 import java.util.Date; 12 import java.util.Iterator; 13 import java.util.List; 14 15 /** 16 * Created by 唐哲 17 * 2018-03-14 22:07 18 */ 19 @RunWith(SpringRunner.class) 20 @SpringBootTest 21 public class ArticleRepositoryTest { 22 23 @Autowired 24 private ArticleRepository articleRepository; 25 26 //@Test 27 public void repositoryTest() { 28 System.out.println(articleRepository.count()); 29 30 Iterator<Article> iterator = articleRepository.findAll().iterator(); 31 while (iterator.hasNext()) { 32 Article article = iterator.next(); 33 System.out.println(article); 34 } 35 } 36 37 //@Test 38 public void testFindByTitle() { 39 List<Article> list = articleRepository.findByTitle("猿天地实战课程1"); 40 System.out.println(list.size()); 41 } 42 43 //@Test 44 public void testSave() { 45 Article article = new Article(); 46 article.setTitle("猿天地实战课程1"); 47 article.setAddTime(new Date()); 48 article.setVisitCount(100L); 49 article = articleRepository.save(article); 50 System.out.println(article); 51 } 52 53 //@Test 54 public void testFindByTitleAndVisitCount() { 55 List<Article> list = articleRepository.findByTitleAndVisitCount("猿天地实战课程1", 10L); 56 System.out.println(list.size()); 57 } 58 59 //@Test 60 public void testPageable() { 61 List<Article> list = articleRepository.findByTitle("猿天地实战课程1", new PageRequest(0, 2)); 62 System.out.println(list.size()); 63 } 64 65 //@Test 66 public void testSort() { 67 List<Article> list = articleRepository.findByTitle("猿天地实战课程1", new Sort(new Sort.Order(Sort.Direction.DESC, "visitCount"))); 68 for(Article article : list) { 69 System.out.println(article.getVisitCount()); 70 } 71 } 72 73 //@Test 74 public void testFindTop1ByTitle() { 75 List<Article> list = articleRepository.findTop1ByTitle("猿天地实战课程1"); 76 System.out.println(list.size()); 77 } 78 79 //@Test 80 public void testFindTop2ByTitle() { 81 List<Article> list = articleRepository.findTop2ByTitle("猿天地实战课程1"); 82 System.out.println(list.size()); 83 } 84 85 }