10
回答
使用 Spring Data & MongoDB
普惠云计算,云服务器降破底价,30元/月起>>>   
这篇文章包含以下三个方面内容:
  1. 在 Windows 下安装 MongoDB
  2. MongoDB Java 示例
  3. Spring Data & MongoDB.

首先,安装 MongoDB

从官方网站上下载最新的 MongoDB ,地址:MongoDB website.

解压到任一目录,例如:“D:\mongodb-win32-x86_64-1.8.3“.

MongoDB 并不会自动创建数据目录,我们需要手工创建,例如:“D:\mongodb-data“.

mongod.exe 是用来启动 Mongodb 的命令,使用下面的命令行参数来启动:

D:\mongodb-win32-x86_64-1.8.3\bin>mongod --dbpath "D:\mymongodb-data" 

程序运行后会有一些输出信息,告诉你 MongoDB 已经启动并启用了 Web 管理端口 28017.

你可以通过这个 URL 地址来访问 Web 管理端口:http://your-ipaddress:28017.

命令行方式访问 MongoDB 的方法是:D:\mongodb-win32-x86_64-1.8.3\bin>mongo

如果你可以看到 Web 管理界面,并且可以通过 mongo.exe 连接到服务器,那么说明安装已经成功。

紧接着,我们编写简单的 Java 示例程序

需要用到的环境

  1. MongoDB 1.8.3
  2. MongoDB-Java-Driver 2.6.5
  3. JDK 1.6

代码如下:

package edu.seua.mongo;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
import com.mongodb.MongoException;

/**
 * Java MongoDB Example
 * 
 */
public class MongoApp {

    public static void main(String[] args) {

	try {
	    // connect to mongoDB
	    Mongo mongo = new Mongo("localhost", 27017);

	    // if database doesn't exists, mongoDB will create it
	    DB db = mongo.getDB("mydb");

	    // Get collection from MongoDB, database named "mydb"
	    // if collection doesn't exists, mongoDB will create it
	    DBCollection collection = db.getCollection("myCollection");

	    // create a document to store attributes
	    BasicDBObject document = new BasicDBObject();
	    document.put("id", 100);
	    document.put("name", "simple name");
	    document.put("message", "simple message");
	    

	    // save it into collection named "myCollection"
	    collection.insert(document);

	    // search query
	    BasicDBObject searchQuery = new BasicDBObject();
	    searchQuery.put("id", 100);

	    DBCursor cursor = collection.find(searchQuery);

	    // loop over the cursor and display the result
	    while (cursor.hasNext()) {
		System.out.println(cursor.next());
	    }

	} catch (UnknownHostException e) {
	    e.printStackTrace();
	} catch (MongoException e) {
	    e.printStackTrace();
	}
    }
}

输出结构:

{ 
   "_id" : { "$oid" : "4e5936ca602fbf0c50e0c9d0"} , 
   "id" : 100 , "name" : "simple name" , "message" : "simple message"
}

最后是 Spring Data & MongoDB

    很复杂,需要下面这么多的 jar 包:

  1. MongoDB 1.8.3
  2. JDK 1.6
  3. mongo-2.6.5.jar
  4. org.springframework.context-3.0.5.RELEASE.jar
  5. org.springframework.core-3.0.5.RELEASE.jar
  6. org.springframework.beans-3.0.5.RELEASE.jar
  7. commons-logging-1.1.1.jar
  8. org.springframework.asm-3.0.5.RELEASE.jar
  9. spring-data-mongodb-1.0.0.M2.jar
  10. slf4j-api-1.6.1.jar
  11. slf4j-jdk14-1.6.1.jar
  12. spring-dao-2.0.8.jar
  13. spring-expression-3.1.0.M2.jar
  14. spring-data-commons-core-1.1.0.M1.jar
  15. spring-tx-3.1.0.M1.jar
  16. spring-data-document-core-1.0.0.M2.jar

配置文件(mongo-config.xml):

<?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">
 
	<mongo:mongo host="localhost" port="27017" />
 
	<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
		<constructor-arg ref="mongo" />
		<constructor-arg name="databaseName" value="myNewdb" />
		<constructor-arg name="defaultCollectionName" value="myNewCollection" />
	</bean>
 
	<!-- To translate any MongoExceptions thrown in @Repository annotated classes -->
	<context:annotation-config />
 
</beans>

Employee DTO:

package edu.seua.mongo;

public class Employee {

    private String id;
    private String firstname;
    private String lastname;
    private int age;

    public Employee() {
    }

    public Employee(String id, String firstname, String lastname, int age) {
	super();
	this.id = id;
	this.firstname = firstname;
	this.lastname = lastname;
	this.age = age;
    }

    public String getId() {
	return id;
    }

    public void setId(String id) {
	this.id = id;
    }

    public String getFirstname() {
	return firstname;
    }

    public void setFirstname(String firstname) {
	this.firstname = firstname;
    }

    public String getLastname() {
	return lastname;
    }

    public void setLastname(String lastname) {
	this.lastname = lastname;
    }

    public int getAge() {
	return age;
    }

    public void setAge(int age) {
	this.age = age;
    }

    @Override
    public String toString() {
	return "Employee [age=" + age + ", firstname=" + firstname + ", id="
		+ id + ", lastname=" + lastname + "]";
    }

}

完整示例代码:

package edu.seua.mongo;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.document.mongodb.MongoOperations;
import org.springframework.data.document.mongodb.query.Criteria;
import org.springframework.data.document.mongodb.query.Query;
import org.springframework.data.document.mongodb.query.Update;

/**
 * Java Spring Data & MongoDB Example
 * 
 */
public class SpringDataMongoApp {

    public static void main(String[] args) {

	ApplicationContext ctx = new ClassPathXmlApplicationContext("edu/seua/mongo/mongo-config.xml");

	MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");

	Employee employee = new Employee("100", "firstName", "lastName", 23);

	// save
	mongoOperation.save("employees", employee);

	// find
	Employee savedEmployee = mongoOperation.findOne("employees", new Query(Criteria.where(
		"id").is("100")), Employee.class);

	System.out.println("Saved Employee: " + savedEmployee);

	// update
	mongoOperation.updateFirst("employees", new Query(Criteria.where(
		"firstname").is("firstName")), Update.update("lastname",
		"new lastName"));

	// find
	Employee updatedEmployee = mongoOperation.findOne("employees", new Query(
		Criteria.where("id").is("100")), Employee.class);

	System.out.println("Updated Employee: " + updatedEmployee);

	// delete
	mongoOperation.remove("employees", new Query(Criteria.where("id").is(
		"100")), Employee.class);

	// List
	List<Employee> listEmployee = mongoOperation.getCollection("employees", Employee.class);
	System.out.println("size of employees = " + listEmployee.size());

    }
}

输出信息:

Saved Employee: Employee [age=23, firstname=firstName, id=100, lastname=lastName]
Updated Employee: Employee [age=23, firstname=firstName, id=100, lastname=new lastName]
size of employees = 0

完整例子下载:SpringDataMongoDB.zip

举报
红薯
发帖于6年前 10回/14K+阅
共有10个评论 最后回答: 3年前
实在是不敢苟同这个SpringData的做法,花拳绣腿无疑。为了上层的统一这个代价太大了,中间植入的适配代码潜在bug以及调试的噩梦,,

喜欢 http://www.datanucleus.org/ (以前的JPOX)的方案,直接使用JPA API,后端使用 NOSQL。。。

Hibernate 4 也在做这样的工作,有一个新的 Grid 项目,支持NOSQL,不过刚刚起步,目前只支持JBoss自家的东东,其他的摆在RoadMap里面。

我們用的是IBM公司的Domino服務器,數據庫是Lotus Notes,基於文檔的數據庫。我看到最上面的一段代碼,感覺跟我們寫的代碼極其相近。我們用的是getAllDocumentsByKey方法查詢,只能以表的第一列作為鍵來查詢。find()方法應該可以以任何鍵來查詢吧?以下是我代碼:

package sunhing.PDDMS.moveDDMS;
import lotus.domino.*;
public class MoveDDMS {
	public static void main(String[] args) {
		try {
			Session session = NotesFactory.createSession(
					"lotusdev.fedon.com:63148", "UrserName", "Password");
			Database db = session.getDatabase("ServerName", "FilePath");

			Document document = db.createDocument();
			document.replaceItemValue("Form", "myCollection");
			document.replaceItemValue("id", 100);
			document.replaceItemValue("name", "simple name");
			document.replaceItemValue("message", "simple message");
			document.save(true);

			DocumentCollection docs = db.getView("myCollection")
					.getAllDocumentsByKey(100);

			Document doc = docs.getFirstDocument();
			while (doc != null) {
				System.out.println(doc.getUniversalID());
				doc = db.getView("myCollection").getNextDocument(doc);
			}

		} catch (NotesException e) {
			e.printStackTrace();
		}
	}
}

--- 共有 2 条评论 ---
喜之郎@hantsy : 没抛弃,在lotus客户端还是用lotusScript。我写的只是一个独立于lotus客户端的,与Domino服务器交互的客户端java程序。 6年前 回复
hantsy以前公司用过 Lotus, 不过另外一波人开了,都是 lotusscript ...现在那东西完全抛弃了吗? 6年前 回复

不知道spring3分成多个jar包的意义有多大,有多少人用spring只用他的ioc的?稍微想用些其它功能就得加其它包,还不如一开始一锅全加上,日后省心。

这么个分法,感觉拿来吓人的,越搞越乱,还是最初一个2M的spring.jar最优美。

少见多怪,那不是分包,是 Spring下的子项目(当然现在 Spring 下的子项目一大把),Spring Data JPA (Spring Data 下又包括其他几个子项目)在没进入 Spring 之前我都用过。

引用来自“大东哥”的答案

高下立判啊,spring怎么越整越乱。
人家国外使用的技术都比较先进,加   JAR 包之类的问题根本就不是问题。
@ 红薯 Mongodb 更新一条记录是更新字段还是整条?
--- 共有 1 条评论 ---
lulubackmongodb 是基于文档的数据库 一个文档相当于关系数据库的一行记录,mongodb 更新查询 都是针对文档的 4年前 回复

spring-data-mongodb-1.0.0.M2.jar
这些包只在官网上找到源码,其他也没找jar包,怎么从源码生成jar呢?

顶部