/** * 工具類 */ package com.topsoft.websites.sun.db; import java.net.UnknownHostException; import java.util.logging.Logger; import com.mongodb.DB; import com.mongodb.MongoClient; import com.mongodb.ServerAddress; /** * @author sunyameng *2014-2-26下午2:50:29 */ public class DBClient { private Logger logger=Logger.getLogger(DBClient.class.getName()); private static DBClient instance=new DBClient(); private MongoClient mongoClient; private DB db; private DBClient(){} public DB getDB(String ip,Integer port,String dbName,String user,String pwd){ if(port==null) port=27017; try { mongoClient = new MongoClient(new ServerAddress(ip, port)); db = mongoClient.getDB(dbName); boolean auth = db.authenticate(user, pwd.toCharArray()); if(auth){ logger.info("user or password is wrong."); close(); return null; } } catch (UnknownHostException e) { logger.info("Cann't find host "+e.getCause().toString()); close(); } return db; } public void close(){ if(mongoClient!=null) mongoClient.close(); } public static DBClient getInstance(){ return instance; } }
一些測試遇到的問題
java
/** * */ package com.topsoft.websites.sun.test; import static com.mongodb.util.MyAsserts.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; import java.util.Set; import com.mongodb.*; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import com.topsoft.websites.sun.db.DBClient; /** * @author sunyameng *2014-2-26下午3:08:46 */ @RunWith(JUnit4.class) public class DBClientTest { private static DBClient dbClient; private static DB db; @BeforeClass public static void setUpBeforeClass() { dbClient=DBClient.getInstance(); db=dbClient.getDB("127.0.0.1",27017,"topsites", "admin", ""); } @AfterClass public static void tearDownAfterClass(){ dbClient.close(); } @Test public void testGetDB() { assertNotNull(db); } /* * get a list of collections */ @Test @Ignore public void getListCollections(){ Set<String> collections=db.getCollectionNames(); assertNotNull(collections); for(String s:collections){ System.out.println(s); } } @Test public void testFind(){ DBCollection coll=db.getCollection("site"); DBObject query = new BasicDBObject("s_name", "河南拓普"); List<DBObject> list=coll.find(query).toArray(); assertTrue(list.size()>0); DBObject obj=list.get(0); System.out.println(obj); } @Test public void testSave(){ DBCollection coll=db.getCollection("site"); DBObject query = new BasicDBObject("name", "tom").append("age",20); coll.save(query); } private BasicDBObject copy(DBObject dbObject){ if(dbObject==null) return null; return new BasicDBObject((BasicDBObject)dbObject); } @Test @Ignore public void testFindAndInsert(){ DBCollection coll=db.getCollection("site"); DBObject query = new BasicDBObject("name", "tom"); //查找的記錄包含_id字段,在保存或插入的時候應該複製一份dbobject,不然會報can't save partial object錯誤 List<DBObject> list=coll.find(query).toArray(); DBObject obj=list.get(0); //複製一份 BasicDBObject copyObj=copy(obj); copyObj.put("name", "amorn"); System.out.println(copyObj); boolean result=true; try{ //save方法和insert方法的區別:若是已經存在一個_id和要保存的同樣,則更新它; //若是不存在,則插入一條;而insert方法則會insert方法則會插入一條新的紀錄,前提是插入的記錄中不包含_id coll.save(copyObj); }catch (Exception e){ result=false; e.printStackTrace(); } assertTrue(result); } @Test public void testFindAndUpdate(){ DBCollection coll=db.getCollection("site"); DBObject query = new BasicDBObject("name", "tom"); List<DBObject> list=coll.find(query).toArray(); DBObject obj=list.get(0); //複製一份 BasicDBObject copyObj=copy(obj); copyObj.put("name", "mh370"); boolean result=true; try{ //upsert參數設置爲true,表示若是不存在則插入一條,若是存在直接更新;multi設置爲true,表示更新多行 //此處的更新會重寫該條記錄,即擦除以前的紀錄,_id保持不變 //此處更新不能使用多行更新,會報錯multi update only works with $ operators coll.update(query, copyObj); //第二種更新方式,就是更新指定字段,此種方法能夠使用多行更新,此處只作一個實例 //BasicDBObject updateObj=new BasicDBObject("$set",new BasicDBObject("name","mh370")); //coll.update(query, updateObj,true,true); }catch (Exception e){ result=false; e.printStackTrace(); } assertTrue(result); } @Test @Ignore public void testCursor(){ DBCollection coll=db.getCollection("site"); DBCursor cursor=coll.find(); assertNotNull(cursor); try{ while(cursor.hasNext()){ System.out.println(cursor.next()); } }finally{ cursor.close(); } } @Test @Ignore public void testPageQuery(){ List<DBObject> list=getDBObject(2, 5); assertEquals(5,list.size()); for(DBObject obj:list){ System.out.println(obj.toString()); } } @Test @Ignore public void testProjection(){ DBCollection coll=db.getCollection("demo"); BasicDBObject field=new BasicDBObject("name",1).append("age", 1).append("_id", 0); DBCursor cursor=coll.find(null,field); assertNotNull(cursor); while(cursor.hasNext()){ System.out.println(cursor.next().toString()); } } @Test @Ignore public void testCondition(){ String collectionName="site"; String[] fields=new String[]{"code","parentcode","name"}; DBObject condition=new BasicDBObject(); condition.put("name", "河南工商行政管理局"); DBCollection collection=db.getCollection(collectionName); List<DBObject> list=find(collection,fields,null,1,2); assertNotNull(list); for(int i=0;i<list.size();i++){ DBObject obj=list.get(i); System.out.println(obj); } } private List<DBObject> getDBObject(int pageNumber,int nPerPage){ DBCollection coll=db.getCollection("employee"); DBCursor cursor=coll.find().skip((pageNumber-1)*nPerPage).limit(nPerPage); return cursor.toArray(); } public List<DBObject> find(DBCollection collection,String[] fields,DBObject condition,Integer pageNumber,Integer nPerPage){ List<DBObject> result=new ArrayList<DBObject>(); BasicDBObject field=new BasicDBObject("_id",0); for(String f:fields){ field.append(f, 1); } if(pageNumber==null||nPerPage==null){ result=collection.find(condition,field).toArray(); }else{ result=collection.find(condition,field).skip((pageNumber-1)*nPerPage).limit(nPerPage).toArray(); } return result; } }