<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    這里我們用到的是spring-data中一個集成mongodb的項目,首先在maven中添加對它的依賴,這里我用的是1.0.0.M5版本

            <!-- mongodb spring -->
            
    <dependency>
                
    <groupId>org.springframework.data</groupId>
                
    <artifactId>spring-data-mongodb</artifactId>
                
    <version>1.0.0.M5</version>
            
    </dependency>

    然后是配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        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/context
              http://www.springframework.org/schema/context/spring-context-3.0.xsd
              http://www.springframework.org/schema/data/mongo
              http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
              http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
        <context:property-placeholder location="classpath*:META-INF/mongodb/mongodb.properties"/>
        
        
    <!-- 定義mongo對象,對應的是mongodb官方jar包中的Mongo,replica-set設置集群副本的ip地址和端口 -->
        
    <mongo:mongo id="mongo" replica-set="localhost:27017">
            
    <!-- 一些連接屬性的設置 -->    
            
    <mongo:options
                 connections
    -per-host="${mongo.connectionsPerHost}"
                 threads
    -allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
                 connect
    -timeout="${mongo.connectTimeout}"
                 max
    -wait-time="${mongo.maxWaitTime}"
                 auto
    -connect-retry="${mongo.autoConnectRetry}"
                 socket
    -keep-alive="${mongo.socketKeepAlive}"
                 socket
    -timeout="${mongo.socketTimeout}"
                 slave
    -ok="${mongo.slaveOk}"
                 write
    -number="1"
                 write
    -timeout="0"
                 write
    -fsync="true"/>        
        
    </mongo:mongo>

        
    <!-- mongo的工廠,通過它來取得mongo實例,dbname為mongodb的數據庫名,沒有的話會自動創建 -->
        
    <mongo:db-factory dbname="test" mongo-ref="mongo"/>

        
    <!-- mongodb的主要操作對象,所有對mongodb的增刪改查的操作都是通過它完成 -->
        
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
          
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
        
    </bean>
        
        
    <!-- 映射轉換器,掃描back-package目錄下的文件,根據注釋,把它們作為mongodb的一個collection的映射 -->
        
    <mongo:mapping-converter base-package="com.xxx.xxx.domain" />
        
        
    <!-- mongodb bean的倉庫目錄,會自動掃描擴展了MongoRepository接口的接口進行注入 -->
        
    <mongo:repositories base-package="com.xxx.xxx.persist.mongodb"/>

        
    <!-- To translate any MongoExceptions thrown in @Repository annotated classes -->
        
    <context:annotation-config />
        
    </beans>

    這樣基本配置就完成了,其它深入操作將在后續文章中說明。


    spring-data-mongodb中的實體映射是通過

    MongoMappingConverter這個類實現的。它可以通過注釋把

    java類轉換為mongodb的文檔。
    它有以下幾種注釋:
    @Id - 文檔的唯一標識,在mongodb中為ObjectId,它是唯一的,通過時間戳+機器標識+進程ID+自增計數器(確保同一秒內產生的Id不會沖突)構成。

    @Document - 把一個java類聲明為mongodb的文檔,可以通

    過collection參數指定這個類對應的文檔。

    @DBRef - 聲明類似于關系數據庫的關聯關系。ps:暫不支持級聯的保存功能,當你在本實例中修改了DERef對象里面的值時,單獨保存本實例并不能保存DERef引用的對象,它要另外保存,如下面例子的Person和Account。

    @Indexed - 聲明該字段需要索引,建索引可以大大的提高查詢效率。

    @CompoundIndex - 復合索引的聲明,建復合索引可以有效地提高多字段的查詢效率。

    @GeoSpatialIndexed - 聲明該字段為地理信息的索引。

    @Transient - 映射忽略的字段,該字段不會保存到

    mongodb。

    @PersistenceConstructor - 聲明構造函數,作用是把從數據庫取出的數據實例化為對象。該構造函數傳入的值為從DBObject中取出的數據。

    以下引用一個官方文檔的例子:

    Person類


    @Document(collection="person")
    @CompoundIndexes({
        @CompoundIndex(name 
    = "age_idx", def = "{'lastName': 1, 'age': -1}")
    })
    public class Person<extends Address> {

      @Id
      
    private String id;
      @Indexed(unique 
    = true)
      
    private Integer ssn;
      
    private String firstName;
      @Indexed
      
    private String lastName;
      
    private Integer age;
      @Transient
      
    private Integer accountTotal;
      @DBRef
      
    private List<Account> accounts;
      
    private T address;

      
      
    public Person(Integer ssn) {
        
    this.ssn = ssn;
      }
      
      @PersistenceConstructor
      
    public Person(Integer ssn, String firstName, String lastName, Integer age, T address) {
        
    this.ssn = ssn;
        
    this.firstName = firstName;
        
    this.lastName = lastName;
        
    this.age = age;
        
    this.address = address;
      }


    Account類

    @Document
    public class Account {

      @Id
      
    private ObjectId id;
      
    private Float total;

    }



    與HibernateRepository類似,通過繼承MongoRepository接口,我們可以非常方便地實現對一個對象的增刪改查,要使 用Repository的功能,先繼承MongoRepository<T, TD>接口,其中T為倉庫保存的bean類,TD為該bean的唯一標識的類型,一般為ObjectId。之后在service中注入該接口就可以 使用,無需實現里面的方法,spring會根據定義的規則自動生成。

    例:


    public interface PersonRepository extends 

    MongoRepository
    <Person, ObjectId>{
    //這里可以添加額外的查詢方法



    但是MongoRepository實現了的只是最基本的增刪改查的功能,要想增加額外的查詢方法,可以按照以下規則定義接口的方法。自定義查詢方 法,格式為“findBy+字段名+方法后綴”,方法傳進的參數即字段的值,此外還支持分頁查詢,通過傳進一個Pageable對象,返回Page集合。

    例:


    public interface PersonRepository extends 

    MongoRepository
    <Person, ObjectId>{
     
    //查詢大于age的數據 
           public Page<Product> findByAgeGreaterThan(int age,Pageable page) ;



    下面是支持的查詢類型,每三條數據分別對應:(方法后綴,方法例子,mongodb原生查詢語句)

    GreaterThan(大于)
    findByAgeGreaterThan(int age)
    {"age" : {"$gt" : age}}

    LessThan(小于)
    findByAgeLessThan(int age)
    {"age" : {"$lt" : age}}

    Between(在...之間)
    findByAgeBetween(int from, int to)
    {"age" : {"$gt" : from, "$lt" : to}}

    IsNotNull, NotNull(是否非空)
    findByFirstnameNotNull()
    {"age" : {"$ne" : null}}

    IsNull, Null(是否為空)
    findByFirstnameNull()
    {"age" : null}

    Like(模糊查詢)
    findByFirstnameLike(String name)
    {"age" : age} ( age as regex)

    (No keyword) findByFirstname(String name)
    {"age" : name}

    Not(不包含)
    findByFirstnameNot(String name)
    {"age" : {"$ne" : name}}

    Near(查詢地理位置相近的)
    findByLocationNear(Point point)
    {"location" : {"$near" : [x,y]}}

    Within(在地理位置范圍內的)
    findByLocationWithin(Circle circle)
    {"location" : {"$within" : {"$center" : [ [x, y], distance]}}}

    Within(在地理位置范圍內的)
    findByLocationWithin(Box box)
    {"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}

    盡管以上查詢功能已經很豐富,但如果還不能滿足使用情況的話可以用一下方法---基于mongodb原本查詢語句的查詢方式。
    例:在原接口中加入


    @Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}")
    public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);

    注釋Query里面的就是mongodb原來的查詢語法,我們可以定義傳進來的查詢參數,通過坐標定義方法的參數。

    還可以在后面指定要返回的數據字段,如上面的例子修改如下,則只通過person表里面的name和age字段構建person對象。


    @Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}"
    public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
    posted on 2012-03-29 15:19 SIMONE 閱讀(7570) 評論(1)  編輯  收藏 所屬分類: JAVA

    FeedBack:
    # re: Mongodb與spring集成(1)------配置
    2012-05-11 17:04 | 楊飛
    請問mongodb.properties"怎么寫啊
      回復  更多評論
      
    主站蜘蛛池模板: 亚洲一区二区三区在线观看网站 | 亚洲一区无码中文字幕乱码| 妞干网免费视频在线观看| 草久免费在线观看网站| 久久精品亚洲综合| 日本免费人成视频播放| 久久一本岛在免费线观看2020| 亚洲国产区男人本色在线观看| 中文字幕亚洲一区二区三区| 成人黄色免费网站| 一级毛片aaaaaa视频免费看| 亚洲youjizz| 久久久久亚洲精品中文字幕| 日本阿v免费费视频完整版| 久久99久久成人免费播放| 亚洲一久久久久久久久| 亚洲av无码不卡| 亚洲成网777777国产精品| 免费99精品国产自在现线| 国产精品偷伦视频观看免费 | 亚洲视频免费在线播放| 一本一道dvd在线观看免费视频| 精品亚洲AV无码一区二区| 国产精品亚洲二区在线观看| 午夜视频免费成人| 1000部拍拍拍18勿入免费凤凰福利| 人妻巨大乳hd免费看| 亚洲精品蜜夜内射| 亚洲国产精品成人综合色在线婷婷| 亚洲伊人久久精品影院| 国产午夜免费福利红片| 最近2019中文字幕mv免费看| 69视频免费在线观看| 最近的2019免费中文字幕| 国产亚洲精品2021自在线| 国产亚洲精aa在线看| 亚洲精品美女久久久久9999| 亚洲av永久无码精品秋霞电影影院 | 亚洲精品国产精品乱码视色 | 57pao国产成永久免费视频| 十八禁视频在线观看免费无码无遮挡骂过|