/** * 工具类 */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; }}
一些测试遇到的问题
/** * */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(){ Setcollections=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 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 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 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 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 list=find(collection,fields,null,1,2); assertNotNull(list); for(int i=0;i 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 find(DBCollection collection,String[] fields,DBObject condition,Integer pageNumber,Integer nPerPage){ List result=new ArrayList (); 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; } }