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