Spring整合MongoDB

一、Maven依賴以及Properties文件中添加MongDB的配置

        <dependency>  
            <groupId>org.mongodb</groupId>  
            <artifactId>mongo-java-driver</artifactId>  
        </dependency> 
        
        <dependency>  
            <groupId>org.springframework.data</groupId>  
            <artifactId>spring-data-mongodb</artifactId>  
        </dependency>

 

#mongodb setting
mongo.replicaSet=XXXXX:27017
mongo.port=27017
mongo.username=XXXXX
mongo.password=XXXX
mongo.authdbname=XXXX
mongo.dbname=XXXXXX
mongo.connectionsPerHost=100
mongo.threadsAllowedToBlockForConnectionMultiplier=50
mongo.connectTimeout=30000
mongo.socketTimeout=30000
mongo.writeConcern=0

二、Spring配置文件中添加MongDB的配置

    <mongo:mongo-client id="mongo"
      replica-set="${mongo.replicaSet}"
      credentials="${mongo.username}:${mongo.password}@${mongo.authdbname}">
      <mongo:client-options connections-per-host="${mongo.connectionsPerHost}"
       threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
       connect-timeout="${mongo.connectTimeout}"
       socket-timeout="${mongo.socketTimeout}"
        write-concern="SAFE" />
     </mongo:mongo-client>
     
    <!-- mongo的工廠,通過它來取得mongo實例,dbname爲mongodb的數據庫名,沒有的話會自動創建 -->
    <mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongo" />
     
    <!-- 讀寫分離級別配置  -->
    <!-- 首選主節點,大多情況下讀操作在主節點,如果主節點不可用,如故障轉移,讀操作在從節點。 -->
    <bean id="primaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.PrimaryPreferredReadPreference"></bean>
    <!-- 最鄰近節點,讀操作在最鄰近的成員,可能是主節點或者從節點。  -->
    <bean id="nearestReadPreference" class="com.mongodb.TaggableReadPreference.NearestReadPreference"></bean>
    <!-- 從節點,讀操作只在從節點, 如果從節點不可用,報錯或者拋出異常。存在的問題是secondary節點的數據會比primary節點數據舊。  -->
    <bean id="secondaryReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryReadPreference"></bean>
    <!-- 優先從secondary節點進行讀取操作,secondary節點不可用時從主節點讀取數據  -->
    <bean id="secondaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryPreferredReadPreference"></bean>
     
    <!-- mongodb的主要操作對象,所有對mongodb的增刪改查的操作都是通過它完成 -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
        <property name="readPreference" ref="secondaryPreferredReadPreference" />
    </bean>
     
    <!-- 映射轉換器,掃描back-package目錄下的文件,根據註釋,把它們作爲mongodb的一個collection的映射 -->
    <mongo:mapping-converter base-package="com.XXXXXX.dao.mongo.model" />
     
    <!-- mongodb bean的倉庫目錄,會自動掃描擴展了MongoRepository接口的接口進行注入 -->
    <mongo:repositories base-package="com.XXXXXX.dao.mongo" />

三、採用MongoRepository接口的方式

public interface ClassifyBaseDao extends MongoRepository<ClassifyBase, ObjectId> {

    @SuppressWarnings("unchecked")
    public ClassifyBase insert(ClassifyBase classifyBase);

    @Query("{key : ?0, class_1 : ?1, class_2 : ?2, class_3 : ?3, class_4 : ?4}")
    public ClassifyBase findOne(String key, String class1, String class2, String class3, String class4);

}

@Document(collection = "ClassifyBase")
@TypeAlias("ClassifyBase")
@Data
public class ClassifyBase {

    @Id
    private String id;

    @Field("key")
    private String key;

    @Field("classified_angle")
    private String classifiedAngle;

    @Field("class_1")
    private String class1;

    @Field("class_2")
    private String class2;

    @Field("class_3")
    private String class3;

    @Field("class_4")
    private String class4;

    @Field("create_time")
    private Date createTime;
    
    
    @Field("target_category_id")
    private String tid;
    
    @Field("target_category_name")
    private String tname;    
    
    @Field("category_id")
    private String categoryId;
    
    @Field("category_name")
    private String cname;
    
    @Field("app_id")
    private Integer appId;
    
    @Field("app_name")
    private String appName;
    
    @Field("app_category_id")
    private String appCategoryId;
    
    @Field("app_category_name")
    private String appCategoryName;
    

}

 

MongoRepository中定義了一些增刪改查的方法,並且它PagingAndSortingRepository接口

@NoRepositoryBean
public interface MongoRepository<T, ID extends Serializable>
        extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

    /*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#save(java.lang.Iterable)
     */
    @Override
    <S extends T> List<S> save(Iterable<S> entites);

    /*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#findAll()
     */
    @Override
    List<T> findAll();

    /*
     * (non-Javadoc)
     * @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort)
     */
    @Override
    List<T> findAll(Sort sort);

    /**
     * Inserts the given entity. Assumes the instance to be new to be able to apply insertion optimizations. Use
     * the returned instance for further operations as the save operation might have changed the entity instance
     * completely. Prefer using {@link #save(Object)} instead to avoid the usage of store-specific API.
     *
     * @param entity must not be {@literal null}.
     * @return the saved entity
     * @since 1.7
     */
    <S extends T> S insert(S entity);

    /**
     * Inserts the given entities. Assumes the given entities to have not been persisted yet and thus will optimize the
     * insert over a call to {@link #save(Iterable)}. Prefer using {@link #save(Iterable)} to avoid the usage of store
     * specific API.
     *
     * @param entities must not be {@literal null}.
     * @return the saved entities
     * @since 1.7
     */
    <S extends T> List<S> insert(Iterable<S> entities);

    /* 
     * (non-Javadoc)
     * @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example)
     */
    @Override
    <S extends T> List<S> findAll(Example<S> example);

    /* 
     * (non-Javadoc)
     * @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example, org.springframework.data.domain.Sort)
     */
    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
}

 

@NoRepositoryBean
public abstract interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID>
{
  public abstract Iterable<T> findAll(Sort paramSort);
  
  public abstract Page<T> findAll(Pageable paramPageable);
}

PagingAndSortingRepository定義了分頁的抽象方法,這裏的參數Pageable paramPageable是接口需要自己定義實現類

 

四、以上接口定義好之後就可以來使用了。

 

備註:

mongdb官方安裝教程  https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

參考博客

https://blog.csdn.net/qq_35534453/article/details/67639620

https://blog.csdn.net/canot/article/details/51571343

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章