詳解Spring整合MongoDB
先列舉幾個網站:操作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