zoukankan      html  css  js  c++  java
  • MongoDB学习-->Spring Data Mongodb-->MongodbTemplate

    配置文件application-dev.yml:

    server:
    port: 8888

    mongo:
    host: localhost
    port: 27017
    timeout: 60000
    db: mamabike

    配置类MongoDBConfiguration:

    package com.tangzhe.configuration;
    
    import com.mongodb.MongoClient;
    import com.mongodb.MongoClientOptions;
    import com.mongodb.ServerAddress;
    import com.tangzhe.autoid.SaveMongoEventListener;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
    import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
    import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
    import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
    import org.springframework.data.mongodb.gridfs.GridFsTemplate;
    
    /**
     * Created by 唐哲
     * 2018-03-13 17:20
     * MongoDB配置
     */
    @Configuration
    @ConfigurationProperties(prefix = "mongo")
    @Data
    public class MongoDBConfiguration {
    
        //mongodb服务地址
        private String host;
    
        //mongodb服务端口号
        private Integer port;
    
        //连接超时
        private Integer timeout;
    
        //mongodb数据库名
        private String db;
    
        /**
         * 配置MongoDB模板
         */
        @Bean
        public MongoTemplate mongoTemplate(SimpleMongoDbFactory mongoDbFactory,
                                           MappingMongoConverter mappingMongoConverter) {
            return new MongoTemplate(mongoDbFactory, mappingMongoConverter);
        }
    
        /**
         * 配置自增ID监听器
         */
        @Bean
        public SaveMongoEventListener saveMongoEventListener() {
            return new SaveMongoEventListener();
        }
    
        /**
         * 配置GridFs模板,实现文件上传下载
         */
        @Bean
        public GridFsTemplate gridFsTemplate(SimpleMongoDbFactory mongoDbFactory,
                                             MappingMongoConverter mappingMongoConverter) {
            return new GridFsTemplate(mongoDbFactory, mappingMongoConverter);
        }
    
        /**
         * 配置mongoDbFactory
         */
        @Bean
        public SimpleMongoDbFactory mongoDbFactory() {
            MongoClientOptions options = MongoClientOptions.builder().connectTimeout(timeout).build();
            MongoClient client = new MongoClient(new ServerAddress(host, port), options);
            return new SimpleMongoDbFactory(client, db);
        }
    
        /**
         * 配置mongoMappingContext
         */
        @Bean
        public MongoMappingContext mongoMappingContext() {
            return new MongoMappingContext();
        }
    
        /**
         * 配置defaultMongoTypeMapper
         */
        @Bean
        public DefaultMongoTypeMapper defaultMongoTypeMapper() {
            //去掉_class字段
            return new DefaultMongoTypeMapper(null);
        }
    
        /**
         * 配置mappingMongoConverter
         */
        @Bean
        public MappingMongoConverter mappingMongoConverter(SimpleMongoDbFactory mongoDbFactory,
                                                           MongoMappingContext mongoMappingContext,
                                                           DefaultMongoTypeMapper defaultMongoTypeMapper) {
            MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(mongoDbFactory, mongoMappingContext);
            mappingMongoConverter.setTypeMapper(defaultMongoTypeMapper);
            return mappingMongoConverter;
        }
    
    }
    

    测试类:

     1 package com.tangzhe.mongodb;
     2 
     3 import org.junit.runner.RunWith;
     4 import org.springframework.boot.test.context.SpringBootTest;
     5 import org.springframework.test.context.junit4.SpringRunner;
     6 
     7 /**
     8  * Created by 唐哲
     9  * 2018-03-13 17:25
    10  */
    11 @RunWith(SpringRunner.class)
    12 @SpringBootTest
    13 public class BaseTest {
    14 }

    实体类:

     1 package com.tangzhe.mongodb;
     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 }

    测试mongodbTemplate:

      1 package com.tangzhe.mongodb.mongotemplate;
      2 
      3 import com.tangzhe.mongodb.Article;
      4 import com.tangzhe.mongodb.BaseTest;
      5 import org.bson.types.ObjectId;
      6 import org.junit.Test;
      7 import org.springframework.beans.factory.annotation.Autowired;
      8 import org.springframework.data.mongodb.core.MongoTemplate;
      9 import org.springframework.data.mongodb.core.query.Criteria;
     10 import org.springframework.data.mongodb.core.query.Query;
     11 import org.springframework.data.mongodb.core.query.Update;
     12 
     13 import java.util.ArrayList;
     14 import java.util.Arrays;
     15 import java.util.Date;
     16 import java.util.List;
     17 
     18 /**
     19  * Created by 唐哲
     20  * 2018-03-13 17:27
     21  */
     22 public class MongoTemplateTest extends BaseTest {
     23 
     24     @Autowired
     25     private MongoTemplate mongoTemplate;
     26 
     27     /**
     28      * 查询某数据库中所有集合(表)
     29      */
     30     //@Test
     31     public void findAllCollections() {
     32         mongoTemplate.getCollectionNames().forEach(System.out::println);
     33     }
     34 
     35     /**
     36      * 批量插入数据
     37      */
     38     //@Test
     39     public void insertBatch() {
     40         List<Article> datas = new ArrayList<>();
     41         for(int i=0; i<10; i++) {
     42             Article article = new Article();
     43             article.setTitle("猿天地实战课程" + i);
     44             article.setVisitCount(10L);
     45             article.setTags(Arrays.asList("java", "python", "c#"));
     46             article.setAddTime(new Date());
     47             datas.add(article);
     48         }
     49 
     50         mongoTemplate.insert(datas, Article.class);
     51     }
     52 
     53     /**
     54      * 修改数据
     55      */
     56     @Test
     57     public void update() {
     58         //根据title修改
     59 //        mongoTemplate.updateFirst(
     60 //                Query.query(
     61 //                    new Criteria("title").is("猿天地实战课程0")
     62 //                ),
     63 //                Update.update("visitCount", 100L),
     64 //                Article.class
     65 //        );
     66 
     67         //存在就修改不存在就插入
     68 //        mongoTemplate.upsert(
     69 //                Query.query(
     70 //                        new Criteria("title").is("猿天地实战课程10")
     71 //                ),
     72 //                Update.update("visitCount", 200L),
     73 //                Article.class
     74 //        );
     75 
     76         //修改title,并将visitCount加1
     77 //        mongoTemplate.updateFirst(
     78 //                Query.query(
     79 //                        new Criteria("title").is("猿天地实战课程0")
     80 //                ),
     81 //                Update.update("title", "猿天地实战课程").inc("visitCount", 1),
     82 //                Article.class
     83 //        );
     84 
     85         //如果传入的是集合名称,则需要写苦衷原始的key名称,如果是实体类就写类中的字段名称
     86 //        mongoTemplate.updateFirst(
     87 //                Query.query(
     88 //                        new Criteria("title").is("猿天地实战课程")
     89 //                ),
     90 //                Update.update("v_count", 1L),
     91 //                "article_info"
     92 //        );
     93 
     94         //删除key
     95         mongoTemplate.updateFirst(
     96                 Query.query(
     97                         new Criteria("title").is("猿天地实战课程")
     98                 ),
     99                 new Update().unset("visitCount"),
    100                 Article.class
    101         );
    102     }
    103 
    104     /**
    105      * 删除数据
    106      */
    107     @Test
    108     public void delete() {
    109 //        mongoTemplate.remove(
    110 //                Query.query(
    111 //                        Criteria.where("title").is("猿天地实战课程")
    112 //                ),
    113 //                Article.class
    114 //        );
    115 
    116         //删除一条,并且返回这条数据
    117         Article article = mongoTemplate.findAndRemove(
    118                 Query.query(
    119                         Criteria.where("title").is("猿天地实战课程10")
    120                 ),
    121                 Article.class
    122         );
    123         System.out.println(article);
    124 
    125         //批量删除,并且返回数据列表
    126         List<Article> articles = mongoTemplate.findAllAndRemove(
    127                 Query.query(
    128                         Criteria.where("title").is("猿天地实战课程10")
    129                 ),
    130                 Article.class
    131         );
    132 
    133         //删除集合(表)的两种方式
    134         mongoTemplate.dropCollection(Article.class);
    135         mongoTemplate.dropCollection("article_info");
    136 
    137         //删除数据库
    138         mongoTemplate.getDb().dropDatabase();
    139     }
    140 
    141     /**
    142      * 查询数据
    143      */
    144     @Test
    145     public void select() {
    146         //数量查询
    147         long count = mongoTemplate.count(
    148                 Query.query(
    149                         Criteria.where("visitCount").is(10)
    150                 ),
    151                 Article.class
    152         );
    153         System.out.println(count);
    154 
    155         //查询第一条
    156         Article article = mongoTemplate.findOne(
    157                 Query.query(
    158                         Criteria.where("visitCount").is(10)
    159                 ),
    160                 Article.class
    161         );
    162         System.out.println(article);
    163 
    164         //查询所有
    165         List<Article> articles = mongoTemplate.findAll(Article.class);
    166         System.out.println(articles.size());
    167 
    168         //带条件查询
    169         mongoTemplate.find(
    170                 Query.query(
    171                         Criteria.where("visitCount").is(100)
    172                 ),
    173                 Article.class
    174         );
    175 
    176         //如果在大数据量的情况下,最好是排序,记住你上次最后一条数据的ID,
    177         //然后就是大于上次的ID,然后limit页数
    178         articles = mongoTemplate.find(
    179                 Query.query(
    180                         Criteria.where("visitCount").is(100)
    181                 ).skip(0).limit(10),
    182                 Article.class
    183         );
    184         System.out.println(articles.size());
    185 
    186         //根据ID查询
    187         mongoTemplate.findById(new ObjectId("5aa79ddecdb51518c073a247"), Article.class);
    188 
    189         //in查询
    190         articles = mongoTemplate.find(
    191                 Query.query(
    192                         Criteria.where("visitCount").in(100, 200, 300)
    193                 ),
    194                 Article.class
    195         );
    196         System.out.println(articles.size());
    197 
    198         //or查询
    199         articles = mongoTemplate.find(
    200                 Query.query(
    201                         new Criteria().orOperator(
    202                                 Criteria.where("visitCount").is(100),
    203                                 Criteria.where("visitCount").is(200),
    204                                 Criteria.where("visitCount").is(300)
    205                         )
    206                 ),
    207                 Article.class
    208         );
    209         System.out.println(articles.size());
    210     }
    211 
    212 }
  • 相关阅读:
    2.8
    2.7
    2.6
    2.5
    2.4第三篇读后感
    2.2第一篇读后感
    2.1
    字符统计
    6468: Snuke's Coloring
    6463: Tak and Hotels II
  • 原文地址:https://www.cnblogs.com/tangzhe/p/8599415.html
Copyright © 2011-2022 走看看