ITPub博客

首页 > IT职业 > IT图书 > 4.2MongoDB和Spring整合

4.2MongoDB和Spring整合

IT图书 作者:rocox 时间:2021-09-09 09:32:16 0 删除 编辑

MongoDB现在用的非常非常多,如何和Spring整合也是经常碰到的问题。
Spring提供了MongoTemplate这样一个模板类的实现方法,简化了具体操作。

下面讲一下具体实现:

添加依赖


      org.springframework.data
      spring-data-mongodb
      1.10.3.RELEASE

其余Spring相关的忽略

Spring的配置applicationContext-mongo.xml


    

    
        <!-- credentials="${mongo.user}:${mongo.pwd}@${mongo.defaultDbName}"-->
    

    
    <!-- 默认Mongodb类型映射 -->
    
        
            <!-- 这里设置为空,可以把 spring data mongodb 多余保存的_class字段去掉 -->
            
        
    

    
    <!-- 自动扫描以下包的有Doucment注解的类 -->
    
    

    <!-- Mongodb的模板 -->
    
        
        
    

mongo:mongo-client是定义MongoDB的客户端连接,需要host和port参数,如果需要账号密码的话,需要增加credentials配置

mongo:db-factory配置连接工厂,指定具体的连接数据库,本例默认为test

defaultMongoTypeMapper默认Mongodb类型映射

mongo:mapping-converterMongoDB的实体映射

mongoTemplate这是最主要的,定义模板类,依赖连接工厂和实体映射

这里举一个article的增删改查的例子。

相关实体Article.java

@Document(collection = "article_info")public class Article {    @Id
    private String id;//id
    @Field("title")    private String title;//标题
    @Field("url")    private String url;//链接
    @Field("author")    private String author;//作者
    @Field("tags")    private List tags;//tag 标签
    @Field("visit_count")    private Long visitCount;//访问次数
    @Field("add_time")    private Date addTime;//添加时间// get set方法省略

@Document(collection = "article_info")这个注解和Hibernate的注解Entiry非常相似,就是定义一个文档,对象MongoDB存储的Collection的名称是article_info

@Id指该字段是主键,不能缺少

@Field("add_time")指该字段映射MongoDB的实际字段,如果一致可以省略

ArticleRepository实际访问接口

@Repository("ArticleRepository")public interface ArticleRepository extends PagingAndSortingRepository
 {    //分页查询     public Page
 findAll(Pageable pageable);    //根据author查询     public List
 findByAuthor(String author);         //根据作者和标题查询     public List
 findByAuthorAndTitle(String author, String title);         //忽略参数大小写     public List
 findByAuthorIgnoreCase(String author);         //忽略所有参数大小写     public List
 findByAuthorAndTitleAllIgnoreCase(String author, String title);         //排序     public List
 findByAuthorOrderByVisitCountDesc(String author);    public List
 findByAuthorOrderByVisitCountAsc(String author);         //自带排序条件     public List
 findByAuthor(String author, Sort sort);      }

Spring的data repository封装了一套增删改查的方法,就和JPA实现的一样,ArticleRepository继承PagingAndSortingRepository,就集成了常用的增删改查方法,比如save、findOne、exists、findAll、delete等等,可以采用默认实现方式来完成常用的增删改查操作。

测试上述各个方法ArticleRepositoryTest.java

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath*:applicationContext-mongo.xml"})public class ArticleRepositoryTest {    @Autowired
    private ArticleRepository articleRepository;    /**
     * 新增记录
     */
    @Test
    public void add() {        //增加一条记录
        Article article = new Article();
        article.setId("1");
        article.setTitle("MongoTemplate的基本使用");
        article.setAuthor("kcy");
        article.setUrl("http://jianshu.com/");
        article.setTags(Arrays.asList("java", "mongodb", "spring"));
        article.setVisitCount(0L);
        article.setAddTime(new Date());
        articleRepository.save(article);        //批量添加
        List
 articles = new ArrayList(10);        for (int i = 0; i  articles = articleRepository.findByAuthor("kcy");         articles.forEach(article -> {             article.setAuthor("kcy2");         });         articleRepository.save(articles);     }    /**      * 删除记录,删除id为10的      */     @Test     public void delete() {         Article article = articleRepository.findOne("10");         articleRepository.delete(article);     }    @Test     public void batchDelete() {         List
 articles = articleRepository.findByAuthor("kcy2");         articleRepository.delete(articles);     }    /**      * 查询所有      *      * @author 孔垂云      */     @Test     public void findAll() {         Iterable
 articles = articleRepository.findAll();         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 根据author查询      *      * @author 孔垂云      */     @Test     public void findByAuthor() {         List
 articles = articleRepository.findByAuthor("kcy");         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 按照author和title查询      *      * @author 孔垂云      */     @Test     public void findByAuthorAndTitle() {         List
 articles = articleRepository.findByAuthorAndTitle("kcy", "MongoTemplate的基本使用");         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 根据作者查询,忽略大小写      *      * @author 孔垂云      */     @Test     public void findByAuthorIgnoreCase() {         List
 articles = articleRepository.findByAuthorIgnoreCase("JASON");         articles.forEach(article -> {             System.out.println(article.getId());         });     }    /**      * 忽略所有参数的大小写      *      * @author 孔垂云      */     @Test     public void findByAuthorAndTitleAllIgnoreCase() {         List
 articles = articleRepository.findByAuthorAndTitleAllIgnoreCase("KCY", "MONGOTEMPLATE的基本使用");         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 根据author查询,并且以访问次数降序排序显示      *      * @author 孔垂云      */     @Test     public void findByAuthorOrderByVisitCountDesc() {         List
 articles = articleRepository.findByAuthorOrderByVisitCountDesc("kcy");         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 根据作者查询,并且以访问次数升序排序显示      *      * @author 孔垂云      */     @Test     public void findByAuthorOrderByVisitCountAsc() {         List
 articles = articleRepository.findByAuthorOrderByVisitCountAsc("kcy");         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 自带排序条件      *      * @author 孔垂云      */     @Test     public void findByAuthorBySort() {         List
 articles = articleRepository.findByAuthor("kcy", new Sort(Direction.ASC, "VisitCount"));         articles.forEach(article -> {             System.out.println(article.toString());         });     }    /**      * 分页查询所有,并且排序      */     @Test     public void findByPage() {        int page = 1;        int size = 2;         Pageable pageable = new PageRequest(page, size, new Sort(Direction.ASC, "VisitCount"));         Page
 pageInfo = articleRepository.findAll(pageable);        //总数量         System.out.println(pageInfo.getTotalElements());        //总页数         System.out.println(pageInfo.getTotalPages());        for (Article article : pageInfo.getContent()) {             System.out.println(article.toString());         }     } }

上面一段代码较长,基本上MongoDB常用的各种例子都讲清楚了,比如增加、批量增加、修改、删除、按id查找、按标题查询、分页等等。

源码下载

本工程详细源码



作者:孔垂云
链接:https://www.jianshu.com/p/cba5d31ea70e

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3306/viewspace-2804433/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-14

  • 博文量
    82
  • 访问量
    719