/** * 工具类 */ 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; } }