一.簡介
Spring Data MongoDB 項(xiàng)目提供與MongoDB文檔數(shù)據(jù)庫的集成。Spring Data MongoDB POJO的關(guān)鍵功能區(qū)域?yàn)橹行牡哪P团cMongoDB的DBCollection輕松地編寫一個(gè)存儲(chǔ)庫交互數(shù)據(jù)訪問。
二.Spring Data MongoDB的配置以及下載對(duì)應(yīng)的Jar
- public class TestMongodb {
- @Test
- public void testMongodb()
- {
- try{
- // 連接到 mongodb 服務(wù)
- Mongo mongo = new Mongo("127.0.0.1", 27017);
- //根據(jù)mongodb數(shù)據(jù)庫的名稱獲取mongodb對(duì)象 ,
- DB db = mongo.getDB( "test" );
- Set<String> collectionNames = db.getCollectionNames();
- // 打印出test中的集合
- for (String name : collectionNames) {
- System.out.println("collectionName==="+name);
- }
-
- }catch(Exception e){
- e.printStackTrace();
- }
運(yùn)行能獲取test數(shù)據(jù)庫下的集合,說明能正常連接數(shù)據(jù)庫

5.Spring的配置文件
1)applicationContext-mongo.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www./schema/beans"
- xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:aop="http://www./schema/aop"
- xmlns:tx="http://www./schema/tx" xmlns:util="http://www./schema/util"
- xmlns:context="http://www./schema/context" xmlns:mongo="http://www./schema/data/mongo"
- xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans-3.0.xsd
- http://www./schema/aop http://www./schema/aop/spring-aop-3.0.xsd
- http://www./schema/tx http://www./schema/tx/spring-tx-3.0.xsd
- http://www./schema/util http://www./schema/util/spring-util-3.0.xsd
- http://www./schema/data/mongo http://www./schema/data/mongo/spring-mongo-1.0.xsd
- http://www./schema/context http://www./schema/context/spring-context-3.0.xsd">
- <context:component-scan base-package="com.mongo" />
- <!-- 獲取配置資源 -->
- <context:property-placeholder location="classpath:jdbc.properties" />
-
- <bean class="cn.mongo.util.SpringContextUtil"></bean>
-
- <mongo:mongo id="mongo" replica-set="${mongo.replicaSet}">
- <!--
- connections-per-host: 每個(gè)主機(jī)答應(yīng)的連接數(shù)(每個(gè)主機(jī)的連接池大?。?dāng)連接池被用光時(shí),會(huì)被阻塞住
- max-wait-time: 被阻塞線程從連接池獲取連接的最長等待時(shí)間(ms)
- connect-timeout:在建立(打開)套接字連接時(shí)的超時(shí)時(shí)間(ms)
- socket-timeout:套接字超時(shí)時(shí)間;該值會(huì)被傳遞給Socket.setSoTimeout(int)
- slave-ok:指明是否答應(yīng)驅(qū)動(dòng)從次要節(jié)點(diǎn)或者奴隸節(jié)點(diǎn)讀取數(shù)據(jù)
- -->
- <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="${mongo.writeNumber}"
- write-timeout="${mongo.riteTimeout}"
- write-fsync="${mongo.writeFsync}"/>
- </mongo:mongo>
- <!-- 設(shè)置使用的數(shù)據(jù)庫 名-->
- <mongo:db-factory dbname="test" mongo-ref="mongo"/>
- <!-- mongodb的模板 -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
- </bean>
- </beans>
2)jdbc.properties
- mongo.replicaSet=127.0.0.1:27017
- mongo.connectionsPerHost=8
- mongo.threadsAllowedToBlockForConnectionMultiplier=4
- mongo.connectTimeout=1000
- mongo.maxWaitTime=1500
- mongo.autoConnectRetry=true
- mongo.socketKeepAlive=true
- mongo.socketTimeout=1500
- mongo.slaveOk=true
- mongo.writeNumber=1
- mongo.riteTimeout=0
- mongo.writeFsync=true
說明:
我們可以上官方網(wǎng)查看文檔http://docs./spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors,這里面有說明怎么配置

三.Spring 實(shí)現(xiàn)MongoDB的CRUD操作
1.實(shí)現(xiàn)一個(gè)基礎(chǔ)接口,是比較通用的 MongoBase.java類
- public interface MongoBase<T> {
- //添加
- public void insert(T object,String collectionName);
- //根據(jù)條件查找
- public T findOne(Map<String,Object> params,String collectionName);
- //查找所有
- public List<T> findAll(Map<String,Object> params,String collectionName);
- //修改
- public void update(Map<String,Object> params,String collectionName);
- //創(chuàng)建集合
- public void createCollection(String collectionName);
- //根據(jù)條件刪除
- public void remove(Map<String,Object> params,String collectionName);
-
- }
2.實(shí)現(xiàn)一個(gè)實(shí)體類,我這邊實(shí)現(xiàn)了User類
@Document注解,表示這個(gè)POJO最終要持久化為MongoDB中的document
- @Document
- public class User implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String id;
- private String name;
- private int age;
- private String password;
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
-
-
-
- }
3.實(shí)現(xiàn)UserDao類,就是實(shí)現(xiàn)User自己操作數(shù)據(jù)庫的接口,這個(gè)UserDao也繼承了MongoBase接口,我們這邊UserDao沒實(shí)現(xiàn)其他額外的接口
- public interface UserDao extends MongoBase<User>{
-
- }
4.實(shí)現(xiàn)UserDaoImpl具體類,這邊是實(shí)際操作數(shù)據(jù)庫
- @Repository("userDaoImpl")
- public class UserDaoImpl implements UserDao {
-
- @Resource
- private MongoTemplate mongoTemplate;
-
- @Override
- public void insert(User object,String collectionName) {
- mongoTemplate.insert(object, collectionName);
- }
-
- @Override
- public User findOne(Map<String,Object> params,String collectionName) {
- return mongoTemplate.findOne(new Query(Criteria.where("id").is(params.get("id"))), User.class,collectionName);
- }
-
- @Override
- public List<User> findAll(Map<String,Object> params,String collectionName) {
- List<User> result = mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class,collectionName);
- return result;
- }
-
- @Override
- public void update(Map<String,Object> params,String collectionName) {
- mongoTemplate.upsert(new Query(Criteria.where("id").is(params.get("id"))), new Update().set("name", params.get("name")), User.class,collectionName);
- }
-
- @Override
- public void createCollection(String name) {
- mongoTemplate.createCollection(name);
- }
-
-
- @Override
- public void remove(Map<String, Object> params,String collectionName) {
- mongoTemplate.remove(new Query(Criteria.where("id").is(params.get("id"))),User.class,collectionName);
- }
說明:
我們可以上官方網(wǎng)查看文檔http://docs./spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors
mongoTemplate.upsert

這邊update里面提供了很多功能,可以根據(jù)條件進(jìn)行修改,Criteria這個(gè)類也提供了where 、and、lt等,我們?cè)诓樵兡挲g大于30的查出來,mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class,collectionName);Criteria還很多
如圖所示:
4.實(shí)現(xiàn)測(cè)試類
我們這邊為了節(jié)省時(shí)間,就沒寫服務(wù)類,我們直接調(diào)用dao就可以了,實(shí)現(xiàn)了TestUser.java類
1)添加并根據(jù)條件查找列表
- public class TestUser {
-
- private static UserDao userDaoImpl;
- private static ClassPathXmlApplicationContext app;
- private static String collectionName;
- @BeforeClass
- public static void initSpring() {
- try {
- app = new ClassPathXmlApplicationContext(new String[] { "classpath:applicationContext-mongo.xml",
- "classpath:spring-dispatcher.xml" });
- userDaoImpl = (UserDao) app.getBean("userDaoImpl");
- collectionName ="users";
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- @Test
- public void testAdd()
- {
-
- //添加一百個(gè)user
- for(int i=0;i<100;i++){
- User user =new User();
- user.setId(""+i);
- user.setAge(i);
- user.setName("zcy"+i);
- user.setPassword("zcy"+i);
- userDaoImpl.insert(user,collectionName);
- }
- Map<String,Object> params=new HashMap<String,Object>();
- params.put("maxAge", 50);
- List<User> list=userDaoImpl.findAll(params,collectionName);
- System.out.println("user.count()=="+list.size());
- }
運(yùn)行一下,我們能正常查找年齡大于50的

2)根據(jù)ID進(jìn)行修改
- @Test
- ublic void testUdate(){
- Map<String,Object> params=new HashMap<String,Object>();
- params.put("id", "1");
- User user=userDaoImpl.findOne(params, collectionName);
- System.out.println("user.name==="+user.getName());
- System.out.println("=============update==================");
- params.put("name", "hello");
- userDaoImpl.update(params, collectionName);
- user=userDaoImpl.findOne(params, collectionName);
- System.out.println("user.name==="+user.getName());

3)根據(jù)ID刪除對(duì)應(yīng)的數(shù)據(jù)
- @Test
- ublic void testRemove(){
- Map<String,Object> params=new HashMap<String,Object>();
- params.put("id", "2");
- userDaoImpl.remove(params, collectionName);
- User user=userDaoImpl.findOne(params, collectionName);
- System.out.println("user=="+user);

|