詳解Spring整合MongoDB

jopen 10年前發布 | 118K 次閱讀 MongoDB NoSQL數據庫

先列舉幾個網站:操作MongoDB庫的語句

                           官方的Spring整合MongoDB的英文網站

主要參考也就是這兩個網站。

這個官方教程網站,由于都是英文的,我跟大多數不喜歡英文的人一樣,都看不下去。但是確實從這個網站學到的是最全面和專業的。

先看一下Spring對MongoDB的配置文件mongo.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="

<context:component-scan base-package="com.cher7.mongo" />

<!--replicaSetMongo 為配置多個mongos或         配置多個relicasetmongo,但是所配置的必須為同一類型--> <mongo:mongo id="replicaSetMongo" replica-set="${mongodb.host}">  <!-- 每個IP的連接數--> <mongo:options connections-per-host="100" threads-allowed-to-block-for-connection-multiplier="50" auto-connect-retry="true"/>

</mongo:mongo>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongo" ref="replicaSetMongo" />
    <!--mongo的數據庫名稱-->
    <constructor-arg name="databaseName" value="${mongodb.dataname}" />
</bean>

<beans profile="test">
    <context:property-placeholder location="classpath:config/mongodb.properties"/>
</beans>

</beans></pre>

mongodb.properties代碼為:

#mongodb.host=192.168.65.4:10000,192.168.65.5:10000 #此處均為mongos
mongodb.dataname=cher7

很多同學用Spring封裝的MongoDB包時都會對多個MongoDB的負載均衡疑惑,Spring到底是如何做負載均衡呢?由于本文中心不是解析此問題,只做稍微解釋:Spring啟動了多個線程,每個線程的工作為ping一下要連接的Mongo庫,取連接時間最短的Mongo為客戶端提供服務。有興趣的同學可以自己查看一下源碼,此處不再詳述。

繼續上述。mongo.xml文件中對外提供了mongoTemplate對象,該對象即可對Mongo庫進行增刪改查各項操作。

本人對此作了小小封裝:

package com.cher7.mongo;

import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set;

import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query;

import com.cher7.util.Reflections;

/   @ClassName: BaseMongoManager   @Description:   @author zc   @date 2014-5-8 下午3:50:22     / public class BaseMongoManager<E> { / 日志對象 */ protected static final Logger logger = Logger .getLogger(BaseMongoManager.class); @Autowired private MongoTemplate mongoTemplate;

public void setMongoTemplate(MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
}

/**
 * Entity的類型
 */
protected Class<E> entityClass;

public BaseMongoManager() {
    this.entityClass = Reflections.getSuperClassGenricType(getClass());
}

/**
 * 
 * @Title: findAll
 * @Description: 查詢表格所有的數據
 * @return List<E> 當前實體對應的表格的所有數據。
 */
public List<E> findAll() {
    return this.findAll(null);
}

/**
 * @Title: findAll
 * @Description: 查詢表格所有的數據
 * @param clazz
 *            該表所對應的實體
 * @param collcetionName
 *            表格名稱
 * @return List<E>
 */
public List<E> findAll(String collcetionName) {

    if (StringUtils.isBlank(collcetionName)) {
        collcetionName = mongoTemplate.getCollectionName(Reflections
                .getSuperClassGenricType(getClass()));
        if (StringUtils.isBlank(collcetionName)) {
            collcetionName = this.entityClass.getSimpleName().toLowerCase();
        }
        logger.info("findAll's param collcetionName is null,so it default is "
                + collcetionName);
    }
    return mongoTemplate.findAll(entityClass, collcetionName);
}

/**
 * 
 * @Title: findCount
 * @Description:查詢當前實體對應表格的所有數據的條數
 * @return long 總條數
 * @throws
 */
public long findCount() {
    long count = 0;
    count = mongoTemplate.count(new Query(), entityClass);
    return count;
}

/***
 * 
 * @Title: insert
 * @Description: 入庫
 * @param e
 *            實體數據
 * @param collectionName
 *            表名
 */
public void insert(E e, String collectionName) {
    mongoTemplate.insert(e, collectionName);
}

/**
 * 
 * @Title: insert
 * @Description: 入庫
 * @param e
 *            實體數據
 */
public void insert(E e) {
    mongoTemplate.insert(e);
}

/**
 * 生產查詢語句
 * 
 * @Title: createCriteria
 * @Description: 根據不同條件生產SQL
 * @param gtMap
 * @param ltMap
 * @param eqMap
 * @param gteMap
 * @param lteMap
 * @param regexMap
 * @param inMap
 * @param neMap
 * @return Criteria 查詢的語句
 * @throws
 */
@SuppressWarnings("rawtypes")
public Criteria createCriteria(Map<String, Object> gtMap,
        Map<String, Object> ltMap, Map<String, Object> eqMap,
        Map<String, Object> gteMap, Map<String, Object> lteMap,
        Map<String, String> regexMap, Map<String, Collection> inMap,
        Map<String, Object> neMap) {
    Criteria c = new Criteria();
    List<Criteria> listC= new ArrayList<Criteria>();
    Set<String> _set = null;
    if (gtMap != null && gtMap.size() > 0) {
        _set = gtMap.keySet();
        for (String _s : _set) {
            listC.add( Criteria.where(_s).gt(gtMap.get(_s)));
        }
    }
    if (ltMap != null && ltMap.size() > 0) {
        _set = ltMap.keySet();
        for (String _s : _set) {
            listC.add(  Criteria.where(_s).lt(ltMap.get(_s)));
        }
    }
    if (eqMap != null && eqMap.size() > 0) {
        _set = eqMap.keySet();
        for (String _s : _set) {
            listC.add(  Criteria.where(_s).is(eqMap.get(_s)));
        }
    }
    if (gteMap != null && gteMap.size() > 0) {
        _set = gteMap.keySet();
        for (String _s : _set) {
            listC.add( Criteria.where(_s).gte(gteMap.get(_s)));
        }
    }
    if (lteMap != null && lteMap.size() > 0) {
        _set = lteMap.keySet();
        for (String _s : _set) {
            listC.add(  Criteria.where(_s).lte(lteMap.get(_s)));
        }
    }

    if (regexMap != null && regexMap.size() > 0) {
        _set = regexMap.keySet();
        for (String _s : _set) {
            listC.add(  Criteria.where(_s).regex(regexMap.get(_s)));
        }
    }

    if (inMap != null && inMap.size() > 0) {
        _set = inMap.keySet();
        for (String _s : _set) {
            listC.add(  Criteria.where(_s).in(inMap.get(_s)));
        }
    }
    if (neMap != null && neMap.size() > 0) {
        _set = neMap.keySet();
        for (String _s : _set) {
            listC.add( Criteria.where(_s).ne(neMap.get(_s)));
        }
    }
    if(listC.size() > 0){
        Criteria [] cs = new Criteria[listC.size()];
        c.andOperator(listC.toArray(cs));
    }
    return c;
}

public Criteria createCriteria(Map<String, Object> eqMap) {
    return this.createCriteria(null, null, eqMap, null, null, null, null,
            null);
}

public Criteria createCriteria(Map<String, Object> eqMap,
        Map<String, Object> neMap) {
    return this.createCriteria(null, null, eqMap, null, null, null, null,
            neMap);
}

/**
 * 
 * @Title: findCount
 * @Description: 根據各種條件查詢總數
 * @param gtMap
 * @param ltMap
 * @param eqMap
 * @param gteMap
 * @param lteMap
 * @param regexMap
 * @param inMap
 * @param neMap
 * @return long 總數
 * @throws
 */
@SuppressWarnings("rawtypes")
public long findCount(Map<String, Object> gtMap, Map<String, Object> ltMap,
        Map<String, Object> eqMap, Map<String, Object> gteMap,
        Map<String, Object> lteMap, Map<String, String> regexMap,
        Map<String, Collection> inMap, Map<String, Object> neMap) {
    long count = 0;
    Criteria c = this.createCriteria(gtMap, ltMap, eqMap, gteMap, lteMap,
            regexMap, inMap, neMap);
    Query query = null;
    if (c == null) {
        query = new Query();
    } else {
        query = new Query(c);
    }
    count = mongoTemplate.count(query, entityClass);
    return count;
}
/***
 * 
* @Title: findCount
* @Description: 根據創建的條件查詢總數
* @param  queryC
* @return long    返回類型
* @throws
 */
public long findCount(Criteria queryC){
    Query query = new Query(queryC);
    return mongoTemplate.count(query, entityClass);
}

/**
 * 
 * @Title: findCount
 * @Description: 根據多個種條件 or 的方式查詢
 * @param orList
 *            or的查詢條件的集合
 * @return long
 * @throws
 */
public long findCount(Criteria... orList) {
    long count = 0;
    Criteria c = new Criteria();
    Query query = null;
    if (orList != null && orList.length > 0) {
        c.orOperator(orList);
    }
    query = new Query(c);

    count = mongoTemplate.count(query, entityClass);
    return count;
}

@SuppressWarnings("rawtypes")
public long findCount(Map<String, Object> gtMap, Map<String, Object> ltMap,
        Map<String, Object> eqMap, Map<String, String> regexMap,
        Map<String, Collection> inMap) {
    return this.findCount(gtMap, ltMap, eqMap, null, null, regexMap, inMap,
            null);
}

public long findCountByContainRegex(Map<String, Object> gtMap,
        Map<String, Object> ltMap, Map<String, Object> eqMap,
        Map<String, String> regexMap) {
    return this.findCount(gtMap, ltMap, eqMap, regexMap, null);
}


/**
 * 
 * @Title: findListByPage
 * @Description: 根據分頁+條件獲取對應的實體集合
 * @param eqMap
 * @param gtMap
 * @param ltMap
 * @param gteMap
 * @param lteMap
 * @param regexMap
 * @param inMap
 * @param orders
 *            排序集合
 * @param pageIndex
 *            頁碼
 * @param pageSize
 *            每頁條數
 * @return List<E> 實體集合
 * @throws
 */
@SuppressWarnings("rawtypes")
public List<E> findListByPage(Map<String, Object> eqMap,
        Map<String, Object> gtMap, Map<String, Object> ltMap,
        Map<String, Object> gteMap, Map<String, Object> lteMap,
        Map<String, String> regexMap, Map<String, Collection> inMap,
        Map<String, Object> neMap, List<Order> orders, int pageIndex,
        int pageSize) {
    List<E> list = null;
    Criteria c = this.createCriteria(gtMap, ltMap, eqMap, gteMap, lteMap,
            regexMap, inMap, neMap);
    Sort sort = null;
    if (orders != null && orders.size() > 0) {
        sort = new Sort(orders);
    }
    Query query = null;
    if (c == null) {
        query = new Query();
    } else {
        query = new Query(c);
    }
    if (sort != null) {
        query = query.with(sort);
    }
    if (pageSize > 0) {
        query.skip((pageIndex - 1) * pageSize);
        query.limit(pageSize);
    }
    list = mongoTemplate.find(query, entityClass);

    return list;
}
/**
 * @Title: findOneObject
 * @Description: 符合條件的某一條數據
 * @param eqMap
 * @param gtMap
 * @param ltMap
 * @param gteMap
 * @param lteMap
 * @param regexMap
 * @param inMap
 * @return E 返回該數據對應的實體
 */
@SuppressWarnings("rawtypes")
public E findObject(Map<String, Object> eqMap, Map<String, Object> gtMap,
        Map<String, Object> ltMap, Map<String, Object> gteMap,
        Map<String, Object> lteMap, Map<String, String> regexMap,
        Map<String, Collection> inMap) {
    E e = null;
    List<E> list = this.findList(eqMap, gtMap, ltMap, gteMap, lteMap,
            regexMap, inMap, null, null);
    if (list != null && list.size() > 0) {
        e = list.get(0);
    }
    return e;
}

/**
 * 
 * @Title: findList
 * @Description: 多個查詢條件or方式組合查詢
 * @param orList
 * @return List<E>
 * @throws
 */
public List<E> findList(Criteria... orList) {
    return this.findListByPage(null, 0, 0, orList);
}

/**
 * 
 * @Title: findListByOrder
 * @Description: 多個查詢條件or方式組合查詢
 * @param orList
 * @param orders
 * @return List<E>
 * @throws
 */
public List<E> findListByOrder(List<Order> orders, Criteria... orList) {
    return this.findListByPage(orders, 0, 0, orList);
}
/**
 * 
* @Title: findListByPage
* @Description: 根據查詢條件直接查詢
* @param  c
* @param  orders
* @param  pageIndex
* @param  pageSize
* @return List<E>    
* @throws
 */
public List<E> findListByPage(Criteria c, List<Order> orders, int pageIndex,
        int pageSize){
    Query query = new Query(c);
    Sort sort = null;
    if (orders != null && orders.size() > 0) {
        sort = new Sort(orders);
    }
    if (sort != null) {
        query = query.with(sort);
    }
    if (pageSize > 0) {
        query.skip((pageIndex - 1) * pageSize);
        query.limit(pageSize);
    }
    return mongoTemplate.find(query, entityClass);
}
public List<E> findListByOrder(Criteria c, List<Order> orders){
    return this.findListByPage(c, orders, 0, 0);
}
public List<E> findList(Criteria c){
    return this.findListByPage(c, null, 0, 0);
}
/**
 * 
* @Title: findObject
* @Description: 根據查詢條件查詢某一個object
* @param  c
* @return E    
* @throws
 */
public E findObject(Criteria c){
    List<E> list = this.findList(c);
    if(list!=null && list.size()>0){
        return list.get(0);
    }
    return null;
}
/**
 * 
 * @Title: findListByPage
 * @Description: 多個查詢條件or方式組合查詢
 * @param orList
 *            or的查詢條件的集合
 * @param orders排序規則
 * @param pageIndex
 *            第幾頁
 * @param pageSize每頁多少條
 * @return List<E> 符合條件的集合
 * @throws
 */
public List<E> findListByPage(List<Order> orders, int pageIndex,
        int pageSize, Criteria... orList) {
    List<E> list = null;
    Criteria c = new Criteria();
    Query query = null;
    if (orList != null && orList.length > 0) {
        c.orOperator(orList);
    }
    query = new Query(c);
    Sort sort = null;
    if (orders != null && orders.size() > 0) {
        sort = new Sort(orders);
        query = query.with(sort);
    }
    if (pageSize > 0) {
        query.skip((pageIndex - 1) * pageSize);
        query.limit(pageSize);
    }
    list = mongoTemplate.find(query, entityClass);
    return list;
}

@SuppressWarnings("rawtypes")
public List<E> findListNotContainOrder(Map<String, Object> eqMap,
        Map<String, Object> gtMap, Map<String, Object> ltMap,
        Map<String, Object> gteMap, Map<String, Object> lteMap,
        Map<String, String> regexMap, Map<String, Collection> inMap,
        Map<String, Object> neMap) {
    return this.findList(eqMap, gtMap, ltMap, gteMap, lteMap, regexMap,
            inMap, neMap, null);
}

}</pre>來自:http://www.cher7.com/?id=1244

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!