栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

详解MongoDB和Spring整合的实例代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解MongoDB和Spring整合的实例代码

MongoDB现在用的非常非常多,如何和Spring整合也是经常碰到的问题。

Spring提供了MongoTemplate这样一个模板类的实现方法,简化了具体操作。

下面讲一下具体实现:

添加依赖


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

其余Spring相关的忽略

Spring的配置applicationContext-mongo.xml



  

  
    
  

  
  
  
    
      
      
    
  

  
  
  
  

  
  
    
    
  


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 < 10; i++) {
      Article article2 = new Article();
      article2.setId(String.valueOf(i + 1));
      article2.setTitle("MongoTemplate的基本使用");
      article2.setAuthor("kcy");
      article2.setUrl("http://jianshu.com" + i);
      article2.setTags(Arrays.asList("java", "mongodb", "spring"));
      article2.setVisitCount(0L);
      article2.setAddTime(new Date());
      articles.add(article2);
    }
    articleRepository.save(articles);
  }

  
  @Test
  public void update() {
    Article article = articleRepository.findOne("1");
    article.setVisitCount(article.getVisitCount() + 1);
    articleRepository.save(article);
  }

  
  @Test
  public void batchUpdate() {
    List articles = articleRepository.findByAuthor("kcy");
    articles.forEach(article -> {
      article.setAuthor("kcy2");
    });
    articleRepository.save(articles);
  }

  
  @Test
  public void delete() {
    Article article = articleRepository.findOne("10");
    articleRepository.delete(article);
  }

  @Test
  public void batchDelete() {
    List articles = articleRepository.findByAuthor("kcy2");
    articleRepository.delete(articles);
  }

  
  @Test
  public void findAll() {
    Iterable articles = articleRepository.findAll();
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }

  
  @Test
  public void findByAuthor() {
    List articles = articleRepository.findByAuthor("kcy");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }

  
  @Test
  public void findByAuthorAndTitle() {
    List articles = articleRepository.findByAuthorAndTitle("kcy", "MongoTemplate的基本使用");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }

  
  @Test
  public void findByAuthorIgnoreCase() {
    List articles = articleRepository.findByAuthorIgnoreCase("JASON");
    articles.forEach(article -> {
      System.out.println(article.getId());
    });
  }

  
  @Test
  public void findByAuthorAndTitleAllIgnoreCase() {
    List articles = articleRepository.findByAuthorAndTitleAllIgnoreCase("KCY", "MONGOTEMPLATE的基本使用");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }

  
  @Test
  public void findByAuthorOrderByVisitCountDesc() {
    List articles = articleRepository.findByAuthorOrderByVisitCountDesc("kcy");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }


  
  @Test
  public void findByAuthorOrderByVisitCountAsc() {
    List articles = articleRepository.findByAuthorOrderByVisitCountAsc("kcy");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }

  
  @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查找、按标题查询、分页等等。

源码下载

本工程详细源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/145363.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号