Spring Data MongoDB 一:入門篇(環境搭建、簡單的CRUD操作)
一.簡介
Spring Data MongoDB 專案提供與MongoDB文件資料庫的整合。Spring Data MongoDB POJO的關鍵功能區域為中心的模型與MongoDB的DBCollection輕鬆地編寫一個儲存庫互動資料訪問。
二.Spring Data MongoDB的配置以及下載對應的Jar
1.安裝MongoDb資料庫,我們在上一篇就已經介紹過了,這邊就不在介紹了,MongoDB 入門(安裝與配置)
2.下載spring的spring-data的子專案兩個jar,分別是spring-data-commons和spring-data-mongodb
我這邊下載是兩個jar分別是:
spring-data-commons-1.7.2.RELEASE.jar
spring-data-mongodb-1.4.2.RELEASE.jar
3.下載mongoDb的java驅動jar包
這邊有很多版本,下載自己對應得版本,我下載是:
mongo-java-driver-2.9.3.jar
4.用Java測試一下MongoDB是否能正常連線
執行能獲取test資料庫下的集合,說明能正常連線資料庫public class TestMongodb { @Test public void testMongodb() { try{ // 連線到 mongodb 服務 Mongo mongo = new Mongo("127.0.0.1", 27017); //根據mongodb資料庫的名稱獲取mongodb物件 , 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(); }
5.Spring的配置檔案
1)applicationContext-mongo.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-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/context http://www.springframework.org/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: 每個主機答應的連線數(每個主機的連線池大小),當連線池被用光時,會被阻塞住 max-wait-time: 被阻塞執行緒從連線池獲取連線的最長等待時間(ms) connect-timeout:在建立(開啟)套接字連線時的超時時間(ms) socket-timeout:套接字超時時間;該值會被傳遞給Socket.setSoTimeout(int) slave-ok:指明是否答應驅動從次要節點或者奴隸節點讀取資料 --> <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> <!-- 設定使用的資料庫 名--> <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
說明:
我們可以上官方網檢視文件http://docs.spring.io/spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors,這裡面有說明怎麼配置
三.Spring 實現MongoDB的CRUD操作
1.實現一個基礎介面,是比較通用的 MongoBase.java類
public interface MongoBase<T> {
//新增
public void insert(T object,String collectionName);
//根據條件查詢
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);
//建立集合
public void createCollection(String collectionName);
//根據條件刪除
public void remove(Map<String,Object> params,String collectionName);
}
2.實現一個實體類,我這邊實現了User類
@Document註解,表示這個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.實現UserDao類,就是實現User自己操作資料庫的介面,這個UserDao也繼承了MongoBase介面,我們這邊UserDao沒實現其他額外的介面
public interface UserDao extends MongoBase<User>{
}
4.實現UserDaoImpl具體類,這邊是實際操作資料庫
@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);
}
說明:
我們可以上官方網檢視文件http://docs.spring.io/spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors
mongoTemplate.upsert
這邊update裡面提供了很多功能,可以根據條件進行修改,Criteria這個類也提供了where 、and、lt等,我們在查詢年齡大於30的查出來,mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class,collectionName);Criteria還很多
如圖所示:
4.實現測試類
我們這邊為了節省時間,就沒寫服務類,我們直接呼叫dao就可以了,實現了TestUser.java類
1)新增並根據條件查詢列表
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()
{
//新增一百個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());
}
執行一下,我們能正常查詢年齡大於50的
2)根據ID進行修改
@Test
public 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)根據ID刪除對應的資料
@Test
public 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);
}