欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-11 08:29:16
mongodb现在用的非常非常多,如何和spring整合也是经常碰到的问题。 spring提供了mongotemplate这样一个模板类的实现方法,简化了具体操作。...

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

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

下面讲一下具体实现:

添加依赖

<dependency>
   <groupid>org.springframework.data</groupid>
   <artifactid>spring-data-mongodb</artifactid>
   <version>1.10.3.release</version>
</dependency>

其余spring相关的忽略

spring的配置applicationcontext-mongo.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemalocation="
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
  <context:property-placeholder
      ignore-unresolvable="true" location="classpath:/mongodb.properties"/>

  <mongo:mongo-client id="mongoclient" host="${mongo.host}" port="${mongo.port}">
    <!-- credentials="${mongo.user}:${mongo.pwd}@${mongo.defaultdbname}"-->
  </mongo:mongo-client>

  <mongo:db-factory id="mongodbfactory"
           dbname="${mongo.database}"
           mongo-ref="mongoclient"/>
  <!-- 默认mongodb类型映射 -->
  <bean id="defaultmongotypemapper" class="org.springframework.data.mongodb.core.convert.defaultmongotypemapper">
    <constructor-arg name="typekey">
      <!-- 这里设置为空,可以把 spring data mongodb 多余保存的_class字段去掉 -->
      <null/>
    </constructor-arg>
  </bean>

  <mongo:repositories base-package="com.critc.mongo"/>
  <!-- 自动扫描以下包的有doucment注解的类 -->
  <mongo:mapping-converter id="mappingconverter" base-package="com.critc.mongo.model"
               type-mapper-ref="defaultmongotypemapper">
  </mongo:mapping-converter>

  <!-- mongodb的模板 -->
  <bean id="mongotemplate" class="org.springframework.data.mongodb.core.mongotemplate">
    <constructor-arg name="mongodbfactory" ref="mongodbfactory"/>
    <constructor-arg name="mongoconverter" ref="mappingconverter"/>
  </bean>
</beans>

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<string> 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<article, string> {

  //分页查询
  public page<article> findall(pageable pageable);


  //根据author查询
  public list<article> findbyauthor(string author);

  //根据作者和标题查询
  public list<article> findbyauthorandtitle(string author, string title);

  //忽略参数大小写
  public list<article> findbyauthorignorecase(string author);

  //忽略所有参数大小写
  public list<article> findbyauthorandtitleallignorecase(string author, string title);

  //排序
  public list<article> findbyauthororderbyvisitcountdesc(string author);
  public list<article> findbyauthororderbyvisitcountasc(string author);

  //自带排序条件
  public list<article> 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<article> 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);
  }

  /**
   * 修改记录,修改id为1的访问次数+1
   */
  @test
  public void update() {
    article article = articlerepository.findone("1");
    article.setvisitcount(article.getvisitcount() + 1);
    articlerepository.save(article);
  }

  /**
   * 批量修改,查看author为kcy的统一修改为kcy2
   */
  @test
  public void batchupdate() {
    list<article> 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<article> articles = articlerepository.findbyauthor("kcy2");
    articlerepository.delete(articles);
  }

  /**
   * 查询所有
   *
   * @author 孔垂云
   */
  @test
  public void findall() {
    iterable<article> articles = articlerepository.findall();
    articles.foreach(article -> {
      system.out.println(article.tostring());
    });
  }

  /**
   * 根据author查询
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthor() {
    list<article> articles = articlerepository.findbyauthor("kcy");
    articles.foreach(article -> {
      system.out.println(article.tostring());
    });
  }

  /**
   * 按照author和title查询
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthorandtitle() {
    list<article> articles = articlerepository.findbyauthorandtitle("kcy", "mongotemplate的基本使用");
    articles.foreach(article -> {
      system.out.println(article.tostring());
    });
  }

  /**
   * 根据作者查询,忽略大小写
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthorignorecase() {
    list<article> articles = articlerepository.findbyauthorignorecase("jason");
    articles.foreach(article -> {
      system.out.println(article.getid());
    });
  }

  /**
   * 忽略所有参数的大小写
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthorandtitleallignorecase() {
    list<article> articles = articlerepository.findbyauthorandtitleallignorecase("kcy", "mongotemplate的基本使用");
    articles.foreach(article -> {
      system.out.println(article.tostring());
    });
  }

  /**
   * 根据author查询,并且以访问次数降序排序显示
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthororderbyvisitcountdesc() {
    list<article> articles = articlerepository.findbyauthororderbyvisitcountdesc("kcy");
    articles.foreach(article -> {
      system.out.println(article.tostring());
    });
  }


  /**
   * 根据作者查询,并且以访问次数升序排序显示
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthororderbyvisitcountasc() {
    list<article> articles = articlerepository.findbyauthororderbyvisitcountasc("kcy");
    articles.foreach(article -> {
      system.out.println(article.tostring());
    });
  }

  /**
   * 自带排序条件
   *
   * @author 孔垂云
   */
  @test
  public void findbyauthorbysort() {
    list<article> 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<article> 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查找、按标题查询、分页等等。

源码下载


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