最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MongoDB和Spring整合的實例代碼

 更新時間:2017年07月10日 10:50:44   作者:孔垂云  
這篇文章主要介紹了詳解MongoDB和Spring整合的實例代碼,Spring提供了MongoTemplate這樣一個模板類的實現(xiàn)方法,簡化了具體操作。有興趣的可以了解一下

MongoDB現(xiàn)在用的非常非常多,如何和Spring整合也是經(jīng)常碰到的問題。

Spring提供了MongoTemplate這樣一個模板類的實現(xiàn)方法,簡化了具體操作。

下面講一下具體實現(xiàn):

添加依賴

<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-mongodb</artifactId>
   <version>1.10.3.RELEASE</version>
</dependency>

其余Spring相關(guān)的忽略

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">
      <!-- 這里設(shè)置為空,可以把 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參數(shù),如果需要賬號密碼的話,需要增加credentials配置

mongo:db-factory配置連接工廠,指定具體的連接數(shù)據(jù)庫,本例默認為test

defaultMongoTypeMapper默認Mongodb類型映射

mongo:mapping-converterMongoDB的實體映射

mongoTemplate這是最主要的,定義模板類,依賴連接工廠和實體映射

這里舉一個article的增刪改查的例子。

相關(guān)實體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;//訪問次數(shù)
  @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);


  //根據(jù)author查詢
  public List<Article> findByAuthor(String author);

  //根據(jù)作者和標題查詢
  public List<Article> findByAuthorAndTitle(String author, String title);

  //忽略參數(shù)大小寫
  public List<Article> findByAuthorIgnoreCase(String author);

  //忽略所有參數(shù)大小寫
  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實現(xiàn)的一樣,ArticleRepository繼承PagingAndSortingRepository,就集成了常用的增刪改查方法,比如save、findOne、exists、findAll、delete等等,可以采用默認實現(xiàn)方式來完成常用的增刪改查操作。

測試上述各個方法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的訪問次數(shù)+1
   */
  @Test
  public void update() {
    Article article = articleRepository.findOne("1");
    article.setVisitCount(article.getVisitCount() + 1);
    articleRepository.save(article);
  }

  /**
   * 批量修改,查看author為kcy的統(tǒng)一修改為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());
    });
  }

  /**
   * 根據(jù)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());
    });
  }

  /**
   * 根據(jù)作者查詢,忽略大小寫
   *
   * @author 孔垂云
   */
  @Test
  public void findByAuthorIgnoreCase() {
    List<Article> articles = articleRepository.findByAuthorIgnoreCase("JASON");
    articles.forEach(article -> {
      System.out.println(article.getId());
    });
  }

  /**
   * 忽略所有參數(shù)的大小寫
   *
   * @author 孔垂云
   */
  @Test
  public void findByAuthorAndTitleAllIgnoreCase() {
    List<Article> articles = articleRepository.findByAuthorAndTitleAllIgnoreCase("KCY", "MONGOTEMPLATE的基本使用");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }

  /**
   * 根據(jù)author查詢,并且以訪問次數(shù)降序排序顯示
   *
   * @author 孔垂云
   */
  @Test
  public void findByAuthorOrderByVisitCountDesc() {
    List<Article> articles = articleRepository.findByAuthorOrderByVisitCountDesc("kcy");
    articles.forEach(article -> {
      System.out.println(article.toString());
    });
  }


  /**
   * 根據(jù)作者查詢,并且以訪問次數(shù)升序排序顯示
   *
   * @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);
    //總數(shù)量
    System.out.println(pageInfo.getTotalElements());
    //總頁數(shù)
    System.out.println(pageInfo.getTotalPages());
    for (Article article : pageInfo.getContent()) {
      System.out.println(article.toString());
    }
  }
}

上面一段代碼較長,基本上MongoDB常用的各種例子都講清楚了,比如增加、批量增加、修改、刪除、按id查找、按標題查詢、分頁等等。

源碼下載

本工程詳細源碼

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Servlet處理一個上傳的文件

    使用Servlet處理一個上傳的文件

    今天小編就為大家分享一篇關(guān)于使用Servlet處理一個上傳的文件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • mybatis-sqlserver批量新增返回id方式

    mybatis-sqlserver批量新增返回id方式

    這篇文章主要介紹了mybatis-sqlserver批量新增返回id方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring中Transactional注解使用的心得(推薦)

    Spring中Transactional注解使用的心得(推薦)

    這篇文章主要介紹了Spring中Transactional注解使用的心得,事務(wù)是用來控制數(shù)據(jù)的ACID特性的,用于保證數(shù)據(jù)的正確性和完整性,需要的朋友可以參考下
    2022-10-10
  • Mybatis統(tǒng)計sql運行時間的兩種方式

    Mybatis統(tǒng)計sql運行時間的兩種方式

    這篇文章主要介紹了Mybatis統(tǒng)計sql運行時間的方案,Spring?Boot?+?Mybatis?web項目,統(tǒng)計sql運行時間,用于分析慢sql,優(yōu)化系統(tǒng)速度,方案有兩種:自定義實現(xiàn)?Interceptor和使用現(xiàn)有依賴庫(Druid),文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-11-11
  • Java中@Accessors注解的具體使用

    Java中@Accessors注解的具體使用

    @Accessors是Lombok提供的注解之一,用于自動生成getter和setter方法,本文主要介紹了@Accessors注解的常用屬性,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Java中Elasticsearch的4種分頁方式詳解

    Java中Elasticsearch的4種分頁方式詳解

    在?Elasticsearch?中,有?4種常見的分頁方法,本文將帶大家分析一下每種方法的優(yōu)缺點以及我們該如何選擇,感興趣的小伙伴可以參考一下
    2025-01-01
  • 通過volatile驗證線程之間的可見性

    通過volatile驗證線程之間的可見性

    這篇文章主要介紹了通過volatile驗證線程之間的可見性,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot?整合mybatis+mybatis-plus的詳細步驟

    SpringBoot?整合mybatis+mybatis-plus的詳細步驟

    這篇文章主要介紹了SpringBoot?整合mybatis+mybatis-plus的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Spring Security 使用 OncePerRequestFilter 過濾器校驗登錄過期、請求日志等操作

    Spring Security 使用 OncePerRequestFilter 

    OncePerRequestFilter是一個過濾器,每個請求都會執(zhí)行一次;一般開發(fā)中主要是做檢查是否已登錄、Token是否過期和授權(quán)等操作,而每個操作都是一個過濾器,下面介紹Spring Security 使用 OncePerRequestFilter 過濾器校驗登錄過期、請求日志等操作方法,感興趣的朋友一起看看吧
    2024-06-06
  • SpringBoot + thymeleaf 實現(xiàn)讀取視頻列表并播放視頻功能

    SpringBoot + thymeleaf 實現(xiàn)讀取視頻列表并播放視頻功能

    這篇文章主要介紹了SpringBoot + thymeleaf 實現(xiàn)讀取視頻列表并播放視頻功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論

郓城县| 郧西县| 久治县| 于都县| 大竹县| 益阳市| 宾川县| 宜春市| 肥东县| 横峰县| 瑞安市| 衢州市| 临泽县| 习水县| 奉化市| 米泉市| 苍梧县| 林甸县| 河源市| 平罗县| 尚志市| 博爱县| 崇左市| 锦州市| 浦北县| 西贡区| 凤凰县| 涞源县| 竹山县| 冷水江市| 淅川县| 门源| 肥乡县| 泰兴市| 阿城市| 东丰县| 元氏县| 拉萨市| 九龙县| 潞西市| 大竹县|