在上一篇教程中,我們學習了如何使用Mongodb 的JAVA API對Mongodb進行相關的數據庫操作,在本文中,將學習使用Spring for Mongodb去簡化對Mongodb的操作。
安裝Spring for Mongodb
Spring項目為方便對Mongodb的操作,建立了spring-data的子項目,地址在:
http://www.springsource.org/spring-data/mongodb,目前版本是1.0.0M2階段,已支持對Mongodb的一系列基本操作。我們先從http://www.springsource.org/spring-data/mongodb中下載相關的包:spring-data-document-1.0.0.M2.zip,下載解壓后,將解壓后的四個JAR文件放到工程路徑的lib庫中,本文中還將使用Spring 3.0.4的版本,請讀者自行下載配置。
Spring Mongodb的配置
目前,可以有兩種方式對Spring mongodb進行配置。第一種是使用Spring 3中的注解,另外一種是使用傳統的XML配置。下面分別進行講解:
使用Spring 3中的注解
首先在配置類中,要繼承AbstractMongoConfiguration類,代碼如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.document.mongodb.MongoTemplate;
import org.springframework.data.document.mongodb.config.AbstractMongoConfiguration;
import com.mongodb.Mongo;
/**
* Spring MongoDB configuration file
*
*/
@Configuration
public class SpringMongoConfig extends AbstractMongoConfiguration {
@Override
public @Bean Mongo mongo() throws Exception {
return new Mongo("localhost");
}
@Override
public @Bean MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(mongo(),"yourdb","yourCollection");
}
}
這里,引入了MongoTemplate模版類,並且使用對連接數據庫的地址,數據庫名和collection進行了初始化。
在調用Spring Mongodb配置時,只需要在需要使用的類中調用AnnotationConfigApplicationContext,傳入剛才配置好的SpringMongoConfig類即可。如下代碼所示:
ctx = new AnnotationConfigApplicationContext(SpringMongoConfig. class);
MongoOperations
mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate");
當獲得了mongoOperation對象的實例后,即可進行對mongodb的相關操作。
使用XML配置文件
使用XML配置文件的方法如下:
< 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" >
<!-- Default bean name is 'mongo' -->
< 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 ="yourdb" />
< constructor-arg name ="defaultCollectionName" value ="yourCollection" />
</ bean >
<!-- To translate any MongoExceptions thrown in @Repository annotated classes -->
< context:annotation-config />
</ beans >
注意這里引用相關的命名空間xmlns:mongo="http://www.springframework.org/schema/data/mongo"
,並且在名為mongoTemplate中注入相關的數據庫地址,數據庫名即可,使用方法如下:
使用Spring Mongodb實現增刪改查操作
下面通過實例講解如何使用Spring Mongodb實現增刪改查操作,假設我們現在有一個實
體類user如下:
public class User {
private String id;
private String firstname;
private String lastname;
private int age;
// getter and setter methods
}
接下來,我們看具體的操作代碼,如下,這里假設要將user類保存到名為userprofile的數據集中。
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
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;
import com.mkyong.config.SpringMongoConfig;
import com.mkyong.user.User;
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig. class);
MongoOperations mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate");
User user = new User("1001", "yong", "mook kim", 30);
// 保存
mongoOperation.save("userprofile",user);
// 查找
User savedUser = mongoOperation.findOne("userprofile",
new Query(Criteria.where("id").is("1001")),
User. class);
System.out.println("savedUser : " + savedUser);
// 更新
mongoOperation.updateFirst("userprofile",
new Query(Criteria.where("firstname").is("yong")),
Update.update("lastname", "new lastname"));
User updatedUser = mongoOperation.findOne("userprofile",
new Query(Criteria.where("id").is("1001")),
User. class);
System.out.println("updatedUser : " + updatedUser);
// 刪除
mongoOperation.remove("userprofile",
new Query(Criteria.where("id").is("1001")),
User. class);
// 顯示當前列表
List<User> listUser =
mongoOperation.getCollection("userprofile", User. class);
System.out.println("Number of user = " + listUser.size());
}
}
輸出結果如下:
updatedUser : User [id=1001, firstname=yong, lastname= new lastname, age=30]
Number of user = 0
Spring mongodb插入數據
下面詳細講解如何使用spring mongodb插入數據。在spring mongodb中,插入數據到
mongodb有如下幾種方法:
// 將user對象保存到"user"這個collection中
mongoOperation.save(user);
// 將user對象保存到"new collection"這個collection中
mongoOperation.save("new collection",user);
// 將user對象保存到"user"這個collection中
mongoOperation.insert(user);
// 將user對象保存到"new collection"這個collection中
mongoOperation.insert("new collection", user);
// 將user的對象列表(List)保存到"user"collection中去
mongoOperation.insertList(userInList);
// 將user的對象列表(List)保存到"new collection"collection中去
mongoOperation.insertList("new collection", userInList);
要注意的是,Spring mongodb中,當沒有指定collection時,就會把對象保存到以對象命名的collection中。比如上例中的mongoOperation.insert(user),由於沒指定collection的名稱,所以會把user對象保存到user這個新建立的collection中。
另外請注意其中的save和insert的區別。它們的區別為:
1)save意思是,當記錄不存在時插入,或者是當記錄已存在是更新,實際上就是saveorupdate的意思。
2) insert的意思是:當記錄不存在時插入,而如果記錄存在時則忽略,繼續插入。
下面舉例子說明:
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.document.mongodb.MongoOperations;
import org.springframework.data.document.mongodb.query.Criteria;
import org.springframework.data.document.mongodb.query.Query;
import com.mkyong.config.SpringMongoConfig;
import com.mkyong.user.User;
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(
SpringMongoConfig. class);
MongoOperations mongoOperation = (MongoOperations) ctx
.getBean("mongoTemplate");
// 新增一個user對象,並把它放到"ABC"這個collection中
System.out.println("Case 1...");
User userA = new User("1111", "user", "A", 99);
mongoOperation.save("ABC", userA);
// 查找剛插入的user對象
User userA1 = mongoOperation.findOne("ABC",
new Query(Criteria.where("id").is("1111")), User. class);
System.out.println(userA1);
// 插入新的user,放到userB這個collection中去
System.out.println("Case 2...");
User userB = new User("2222", "user", "B", 99);
mongoOperation.save(userB);
// 查找
User userB1 = mongoOperation.findOne(
new Query(Criteria.where("id").is("2222")), User. class);
System.out.println(userB1);
// 插入對象列表,放到arraylist中
System.out.println("Case 3...");
User userC = new User("3333", "user", "C", 99);
User userD = new User("4444", "user", "D", 99);
User userE = new User("5555", "user", "E", 99);
List<User> userList = new ArrayList<User>();
userList.add(userC);
userList.add(userD);
userList.add(userE);
mongoOperation.insertList("ABC-List", userList);
List<User> users = mongoOperation.find("ABC-List", new Query(Criteria
.where("firstname").is("user")), User. class);
for (User temp : users) {
System.out.println(temp);
}
}
}
輸出結果如下:
User [id=1111, firstname=user, lastname=A, age=99]
Case 2...
User [id=2222, firstname=user, lastname=B, age=99]
Case 3...
User [id=3333, firstname=user, lastname=C, age=99]
User [id=4444, firstname=user, lastname=D, age=99]
User [id=5555, firstname=user, lastname=E, age=99]
更新Document
在mongodb中,可以使用save,updateFirst(),updateMulti()方法來進行更新,下面
是相關的例子
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(
SpringMongoConfig. class);
MongoOperations mongoOperation = (MongoOperations) ctx
.getBean("mongoTemplate");
User user = new User("1000", "user-first", "user-last", 17);
System.out.println("Case 1...by save()");
mongoOperation.save(user);
User userPrint1 = mongoOperation.findOne( new Query(Criteria.where("id").is("1000")), User. class);
System.out.println(userPrint1);
// 修改user對象的lastname
user.setLastname("new last name");
// 更新user對象
mongoOperation.save(user);
User userPrint2 = mongoOperation.findOne( new Query(Criteria.where("id")
.is("1000")), User. class);
System.out.println(userPrint2);
// Case 2 ... update firstname field, $set
System.out.println("Case 2...by updateFirst() - $set");
// 將id為1000的user對象的firstname屬性的值更新為”new firstname”
mongoOperation.updateFirst("user",
new Query(Criteria.where("_id").is("1000")),
Update.update("firstname", "new first name"));
User userPrint3 = mongoOperation.findOne( new Query(Criteria.where("id")
.is("1000")), User. class);
System.out.println(userPrint3);
// 對id為1000的user的age加上10
System.out.println("Case 3...by updateFirst() - $inc");
Update updateAge = new Update();
updateAge.inc("age", 10);
mongoOperation.updateFirst("user",
new Query(Criteria.where("_id").is("1000")), updateAge);
User userPrint4 = mongoOperation.findOne( new Query(Criteria
.where("_id").is("1000")), User. class);
System.out.println(userPrint4);
}
}
結果為:
User [id=1000, firstname=user-first, lastname=user-last, age=17]
User [id=1000, firstname=user-first, lastname= new last name, age=17]
Case 2...by updateFirst() - $set
User [id=1000, firstname= new first name, lastname= new last name, age=17]
Case 3...by updateFirst() - $inc
User [id=1000, firstname= new first name, lastname= new last name, age=27]
此外,還支持使用updateMulti,updateMulti是將所有的對象進行更新,比如:
new Query(Criteria.where("firstname").is("yong")),
Update.update("age", 40));
表示將所有firstname為yong的user對象的age屬性全部更新為40。
查詢Document
在spring mongodb中,可以使用findOne(),find()和getCollection()去查詢mongodb,常見的用法如下:
// 找到第一個id=1001的user對象
User user = mongoOperation.findOne("test", new Query(Criteria
.where("id").is("1001")), User. class);
// 從test集合中獲得所有id<=1000並且age=21的user對象
List<User> users = mongoOperation.find("test", new Query(Criteria
.where("id").lte("2001").and("age").is(21)), User. class);
// 從test 集合中獲得所有的user對象列表
List<User> users = mongoOperation.getCollection("test", User. class);
刪除document
在spring mongodb中, 刪除document使用remove方法,示例如下:
User user = new User("...");
// 刪除user集合中的user對象
mongoOperation.remove(user);
// 刪除test集合下的id=2的user對象
mongoOperation.remove("test", new Query(Criteria
.where("id").is("2")));
// 刪除test集合下的,id=3的user對象,最后並且返回這個被刪除的對象
User deletedUser = mongoOperation.findAndRemove("test",
new Query(Criteria.where("id").is("3")), User. class);