http://www.cnblogs.com/maybo/p/5182439.html
import java.util.List;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
/*
* 创建一个会话实现对mongoDB的原子操作
*
* @author:maybo
*
* @date:2016-2-1
*/
public abstract class AbstractMongoSession {
private MongoDatabase db;
private Class<?> clazz;
private MongoCollection<Document> collection;
public MongoCollection<Document> getCollection() {
return this.collection;
}
public Class<?> getClazz() {
return clazz;
}
public void setDb(MongoDatabase db) {
this.db = db;
}
public MongoDatabase getDb() {
return db;
}
protected MongoCollection<Document> Collection(Class<?> clazz) {
this.clazz = clazz;
Table table = (Table) clazz.getAnnotation(Table.class);
String col = null;
if (null != table && null != table.name()) {
col = table.name();
} else {
col = clazz.getName();
}
this.collection = db.getCollection(col);
return this.collection;
}
/*
* 保存
*
* @param:实体
*
* @return:void
*/
public abstract void save(Object obj);
public abstract void saveMany(List<Object> obj);
// 删除数据
public abstract long delete(Object obj) throws Exception;
public abstract long delete(Bson bson) throws Exception;
// 删除数据
public abstract long deleteMany(List<Object> objs);
public abstract long deleteMany(Bson bson);
// 修改数据
public abstract long upate(Bson bson, Object obj);
public abstract long update(Object obj);
public abstract long upateMany(Bson bson, Object obj);
public abstract long upateMany(Bson bson, List<Object> objs);
public abstract long upateMany(List<Object> objs);
// 查询数据
public abstract Object find(Object obj);
// 获取所有的数据
public abstract List<Object> finds();
// 条件查询数据
public abstract List<Object> query(Bson bson);
public abstract Object queryOne(Bson bson);
public abstract List<Object> query(Bson bson, Bson sort);
public abstract Object queryOne(Bson bson, Bson sort);
public abstract List<Object> query(Bson bson, Bson sort, int limit);
public abstract List<Object> query(Bson bson, Bson sort, int limit, int skip);
public abstract List<Object> query(Bson bson, Bson sort, Bson filter);
public abstract Object queryOne(Bson bson, Bson sort, Bson Filter);
public abstract long count();
public abstract long count(Bson bson);
}
import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; public class MongoSession extends AbstractMongoSession { public MongoSession(Class<?> clazz, MongoDatabase db) { this.setDb(db); this.Collection(clazz); } /* * (non-Javadoc) * * @see AbstractMongoSession#save(java.lang.Object) */ @Override public void save(Object obj) { try { this.getCollection().insertOne(BsonUtil.toBson(obj)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public long delete(Object obj) throws Exception { try { DeleteResult result = this.getCollection().deleteOne( BsonUtil.toBson(obj)); long count = result.getDeletedCount(); return count; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } @Override public void saveMany(List<Object> obj) { try { this.getCollection().insertMany(BsonUtil.toBsons(obj)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public long delete(Bson bson) throws Exception { DeleteResult deleteResult = this.getCollection().deleteOne(bson); return deleteResult.getDeletedCount(); } @Override public long deleteMany(List<Object> objs) { List<Document> documents; int count = 0; try { documents = BsonUtil.toBsons(objs); for (int i = 0; null != documents && i < documents.size(); i++) { DeleteResult deleteResult = this.getCollection().deleteOne( documents.get(i)); count += deleteResult.getDeletedCount(); } return count; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return count; } @Override public long deleteMany(Bson bson) { DeleteResult deleteResult = this.getCollection().deleteMany(bson); return deleteResult.getDeletedCount(); } @Override public long upate(Bson bson, Object obj) { try { UpdateResult result = this.getCollection().updateOne(bson, new Document("$set", BsonUtil.toBson(obj))); return result.getMatchedCount(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } @Override public long update(Object obj) { Document document; try { document = BsonUtil.toBson(obj); UpdateResult updateResult = this.getCollection().updateOne( Filters.eq("_id", document.get("_id")), new Document("$set", document)); return updateResult.getMatchedCount(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } @Override public long upateMany(Bson bson, Object obj) { try { UpdateResult updateResult = this.getCollection().updateMany(bson, new Document("$set", BsonUtil.toBson(obj))); return updateResult.getMatchedCount(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } @Override public long upateMany(Bson bson, List<Object> obj) { for (int i = 0; null != obj && i < obj.size(); i++) { try { UpdateResult result = this.getCollection().updateMany(bson, new Document("$set", BsonUtil.toBson(obj))); return result.getMatchedCount(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return 0; } @Override public long upateMany(List<Object> objs) { long count = 0; for (int i = 0; null != objs && i < objs.size(); i++) { try { UpdateResult result = this.getCollection().updateMany( Filters.eq("_id", BsonUtil.toBson(objs.get(i)).get("_id")), new Document("$set", BsonUtil.toBson(objs.get(i)))); count += result.getMatchedCount(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return count; } @Override public Object find(Object obj) { try { Document document = this.getCollection() .find(Filters.eq("_id", BsonUtil.toBson(obj).get("_id"))) .first(); return BsonUtil.toBean(document, this.getClazz()); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public List<Object> finds() { FindIterable<Document> doIterable = this.getCollection().find(); MongoCursor<Document> cursor = doIterable.iterator(); List<Object> objects = new ArrayList<Object>(); while (cursor.hasNext()) { Document document = cursor.next(); try { objects.add(BsonUtil.toBean(document, this.getClazz())); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return objects; } @Override public List<Object> query(Bson bson) { FindIterable<Document> doIterable = this.getCollection().find(bson); MongoCursor<Document> cursor = doIterable.iterator(); List<Object> objects = new ArrayList<Object>(); while (cursor.hasNext()) { Document document = cursor.next(); try { objects.add(BsonUtil.toBean(document, this.getClazz())); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return objects; } @Override public Object queryOne(Bson bson) { Document document = this.getCollection().find(bson).first(); try { return BsonUtil.toBean(document, this.getClazz()); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public List<Object> query(Bson bson, Bson sort) { FindIterable<Document> doIterable = this.getCollection().find(bson) .sort(sort); MongoCursor<Document> cursor = doIterable.iterator(); List<Object> objects = new ArrayList<Object>(); while (cursor.hasNext()) { Document document = cursor.next(); try { objects.add(BsonUtil.toBean(document, this.getClazz())); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return objects; } @Override public Object queryOne(Bson bson, Bson sort) { Document document = this.getCollection().find(bson).sort(sort).first(); try { return BsonUtil.toBean(document, this.getClazz()); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public List<Object> query(Bson bson, Bson sort, int limit) { FindIterable<Document> doIterable = this.getCollection().find(bson) .sort(sort); if (limit > 0) { doIterable = doIterable.limit(limit); } MongoCursor<Document> cursor = doIterable.iterator(); List<Object> objects = new ArrayList<Object>(); while (cursor.hasNext()) { Document document = cursor.next(); try { objects.add(BsonUtil.toBean(document, this.getClazz())); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return objects; } @Override public List<Object> query(Bson bson, Bson sort, int limit, int skip) { FindIterable<Document> doIterable = this.getCollection().find(bson) .sort(sort); if (limit > 0) { doIterable = doIterable.limit(limit); } if (skip > 0) { doIterable = doIterable.skip(skip); } MongoCursor<Document> cursor = doIterable.iterator(); List<Object> objects = new ArrayList<Object>(); while (cursor.hasNext()) { Document document = cursor.next(); try { objects.add(BsonUtil.toBean(document, this.getClazz())); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return objects; } @Override public List<Object> query(Bson bson, Bson sort, Bson filter) { FindIterable<Document> doIterable = this.getCollection().find(bson) .sort(sort).filter(filter); MongoCursor<Document> cursor = doIterable.iterator(); List<Object> objects = new ArrayList<Object>(); while (cursor.hasNext()) { Document document = cursor.next(); try { objects.add(BsonUtil.toBean(document, this.getClazz())); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return objects; } @Override public Object queryOne(Bson bson, Bson sort, Bson Filter) { Document document = this.getCollection().find(bson).sort(sort) .filter(Filter).first(); try { return BsonUtil.toBean(document, this.getClazz()); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public long count() { return this.getCollection().count(); } @Override public long count(Bson bson) { // TODO Auto-generated method stub return this.getCollection().count(bson); } }
3. 帮助类:实现Document到Object 以及Object到Document的转换.使用反射技术和注解.import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.List; import org.bson.Document; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; /* * 将mongo的文档转化为对象将对象转化为mongo文档 * @author:maybo * @data:2016-2-1 */ public class BsonUtil { public static <T> List<T> toBeans(List<Document> documents, Class<T> clazz) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { List<T> list = new ArrayList<T>(); for (int i = 0; null != documents && i < documents.size(); i++) { list.add(toBean(documents.get(i), clazz)); } return list; } /* * 将Bson 转化为对象 * * @param:Bson文档 * * @param:类pojo * * @param:返回对象 */ public static <T> T toBean(Document document, Class<T> clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { T obj = clazz.newInstance();// 声明一个对象 Field[] fields = clazz.getDeclaredFields();// 获取所有属性 Method[] methods = clazz.getMethods();// 获取所有的方法 /* * 查找所有的属性,并通过属性名和数据库字段名通过相等映射 */ for (int i = 0; i < fields.length; i++) { String fieldName = fields[i].getName(); Column column = fields[i].getAnnotation(Column.class); Object bson = null; if (null != column && null != column.name()) { bson = document.get(column.name()); } else if ("id".equals(fieldName)) { bson = document.get("_id"); } else { bson = document.get(fieldName); } if (null == bson) { continue; } else if (bson instanceof Document) {// 如果字段是文档了递归调用 bson = toBean((Document) bson, fields[i].getType()); } else if (bson instanceof MongoCollection) {// 如果字段是文档集了调用colTOList方法 bson = colToList(bson, fields[i]); } for (int j = 0; j < methods.length; j++) {// 为对象赋值 String metdName = methods[j].getName(); if (equalFieldAndSet(fieldName, metdName)) { methods[j].invoke(obj, bson); break; } } } return obj; } public static List<Document> toBsons(List<Object> objs) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchFieldException { List<Document> documents = new ArrayList<Document>(); for (int i = 0; null != objs && i < objs.size(); i++) { documents.add(toBson(objs.get(i))); } return documents; } /* * 将对象转化为Bson文档 * * @param:对象 * * @param:类型 * * @return:文档 */ public static Document toBson(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchFieldException { if (null == obj) { return null; } Class<? extends Object> clazz = obj.getClass(); Document document = new Document(); Method[] methods = clazz.getDeclaredMethods(); Field[] fields = clazz.getDeclaredFields(); for (int i = 0; null != fields && i < fields.length; i++) { Column column = fields[i].getAnnotation(Column.class);// 获取列注解内容 NotColumn notColumn = fields[i].getAnnotation(NotColumn.class);// 获取否列 String key = null;// 对应的文档键值 if (null != column && null != column.name()) {// 存在列映射取值 key = column.name(); } else if (null != notColumn) {// 不是列的情况 continue; } else { key = fields[i].getName();// 默认情况通过属性名映射 if ("id".equals(key)) {// 替换id为_id key = "_id"; } } String fieldName = fields[i].getName(); /* * 获取对象属性值并映射到Document中 */ for (int j = 0; null != methods && j < methods.length; j++) { String methdName = methods[j].getName(); if (null != fieldName && equalFieldAndGet(fieldName, methdName)) { Object val = methods[j].invoke(obj);// 得到值 if (null == val) { continue; } if (isJavaClass(methods[j].getReturnType())) { if (methods[j].getReturnType().getName() .equals("java.util.List")) {// 列表处理 @SuppressWarnings("unchecked") List<Object> list = (List<Object>) val; List<Document> documents = new ArrayList<Document>(); for (Object obj1 : list) { documents.add(toBson(obj1)); } document.append(key, documents); } else {// 其它对象处理,基本类型 document.append(key, val); } } else {// 自定义类型 document.append(key, toBson(val)); } } } } return document; } /* * 是否是自定义类型】 * * false:是自定义 */ private static boolean isJavaClass(Class<?> clz) { return clz != null && clz.getClassLoader() == null; } /* * 将文档集转化为列表 * * @param:文档集 * * @param:属性类型 * * @return:返回列表 */ private static List<Object> colToList(Object bson, Field field) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { ParameterizedType pt = (ParameterizedType) field.getGenericType();// 获取列表的类型 List<Object> objs = new ArrayList<Object>(); @SuppressWarnings("unchecked") MongoCollection<Document> cols = (MongoCollection<Document>) bson; MongoCursor<Document> cursor = cols.find().iterator(); while (cursor.hasNext()) { Document child = cursor.next(); @SuppressWarnings("rawtypes") Class clz = (Class) pt.getActualTypeArguments()[0];// 获取元素类型 @SuppressWarnings("unchecked") Object obj = toBean(child, clz); System.out.println(child); objs.add(obj); } return objs; } /* * 比较setter方法和属性相等 */ private static boolean equalFieldAndSet(String field, String name) { if (name.toLowerCase().matches("set" + field.toLowerCase())) { return true; } else { return false; } } /* * 比较getter方法和属性相等 */ private static boolean equalFieldAndGet(String field, String name) { if (name.toLowerCase().matches("get" + field.toLowerCase())) { return true; } else { return false; } } }
4.用到的注解Column ,NotColumn,Table
Column:
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
@Target
(ElementType.FIELD)
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
Column {
public
String name();
public
String text()
default
"这是一个属性映射"
;
}
N otColumn:
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
@Target
(ElementType.FIELD)
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
NotColumn {
public
String text()
default
"不是属性字段"
;
}
Table:
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
@Target
(ElementType.TYPE)
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
Table {
public
String name();
public
String text()
default
"表格映射"
;
}
5. MongoObject
import
java.util.ArrayList;
import
java.util.List;
import
com.mongodb.MongoClient;
import
com.mongodb.MongoClientOptions;
import
com.mongodb.ReadPreference;
import
com.mongodb.ServerAddress;
import
com.mongodb.WriteConcern;
public
class
MongoObject {
private
List<String> hostPorts;
private
int
port=
27017
;
private
String host=
"127.0.0.1"
;
private
int
connectionsPerHost=
5
;
// 每个主机的连接数
private
int
threadsAllowedToBlockForConnectionMultiplier=
30
;
// 线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out
// // to get
// db”错误。
private
long
maxWaitTime=
5000
;
// 最大等待连接的线程阻塞时间
private
long
connectTimeout=
5000
;
// 连接超时的毫秒。0是默认和无限
private
long
socketTimeout=
5000
;
// socket超时。0是默认和无限
private
boolean
autoConnectRetry=
false
;
// 这个控制是否在一个连接时,系统会自动
public
void
setHostPorts(List<String> hostPorts) {
this
.hostPorts = hostPorts;
}
public
MongoObject() {
// TODO Auto-generated constructor stub
}
public
int
getPort() {
return
port;
}
public
void
setPort(
int
port) {
this
.port = port;
}
public
String getHost() {
return
host;
}
public
void
setHost(String host) {
this
.host = host;
}
public
int
getConnectionsPerHost() {
return
connectionsPerHost;
}
public
void
setConnectionsPerHost(
int
connectionsPerHost) {
this
.connectionsPerHost = connectionsPerHost;
}
public
int
getThreadsAllowedToBlockForConnectionMultiplier() {
return
threadsAllowedToBlockForConnectionMultiplier;
}
public
void
setThreadsAllowedToBlockForConnectionMultiplier(
int
threadsAllowedToBlockForConnectionMultiplier) {
this
.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
}
public
long
getMaxWaitTime() {
return
maxWaitTime;
}
public
void
setMaxWaitTime(
long
maxWaitTime) {
this
.maxWaitTime = maxWaitTime;
}
public
long
getConnectTimeout() {
return
connectTimeout;
}
public
void
setConnectTimeout(
long
connectTimeout) {
this
.connectTimeout = connectTimeout;
}
public
long
getSocketTimeout() {
return
socketTimeout;
}
public
void
setSocketTimeout(
long
socketTimeout) {
this
.socketTimeout = socketTimeout;
}
public
boolean
isAutoConnectRetry() {
return
autoConnectRetry;
}
public
void
setAutoConnectRetry(
boolean
autoConnectRetry) {
this
.autoConnectRetry = autoConnectRetry;
}
public
MongoClient run() {
if
(
null
!= hostPorts) {
if
(
null
!= host && port >
0
) {
hostPorts.add(host +
":"
+ port);
}
}
else
{
hostPorts =
new
ArrayList<String>();
if
(
null
!= host && port >
0
) {
hostPorts.add(host +
":"
+ port);
}
else
{
return
null
;
}
}
List<ServerAddress> addresses =
new
ArrayList<ServerAddress>();
for
(String hostPort : hostPorts) {
String[] spits = hostPort.split(
":"
);
ServerAddress address =
new
ServerAddress(spits[
0
],
Integer.valueOf(spits[
1
]));
addresses.add(address);
}
MongoClient client =
new
MongoClient(addresses, getConfOptions());
return
client;
}
@SuppressWarnings
(
"deprecation"
)
private
MongoClientOptions getConfOptions() {
return
new
MongoClientOptions.Builder()
.socketKeepAlive(
true
)
// 是否保持长链接
.connectTimeout((
int
)
this
.connectTimeout)
// 链接超时时间
.socketTimeout((
int
)
this
.socketTimeout)
// read数据超时时间
.readPreference(ReadPreference.primary())
// 最近优先策略
.connectionsPerHost(
this
.connectionsPerHost)
// 每个地址最大请求数
.maxWaitTime((
int
)
this
.maxWaitTime)
// 长链接的最大等待时间
.threadsAllowedToBlockForConnectionMultiplier(
this
.threadsAllowedToBlockForConnectionMultiplier)
// 一个socket最大的等待请求数
.writeConcern(WriteConcern.NORMAL).build();
}
}
6. MongoDB用于生产数据库对象
import
com.mongodb.client.MongoDatabase;
public
class
MongoDB{
private
String db;
private
MongoObject client;
public
void
setClient(MongoObject client) {
this
.client = client;
}
public
void
setDb(String db) {
this
.db = db;
}
public
MongoDB(MongoObject client,String db){
this
.client=client;
this
.db=db;
}
public
MongoDatabase excute(){
return
client.run().getDatabase(db);
}
}
import java.util.List; public class DaoImpl implements Dao{ private MongoTemplate template; private MongoSession session; private String className; public void setClassName(String className) { this.className = className; } public MongoSession getSession() { return session; } public DaoImpl(){} public DaoImpl(MongoTemplate template,String className){ this.template = template; this.className=className; try { this.session=template.session(Class.forName(className)); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void setTemplate(MongoTemplate template) { this.template = template; try { this.session=template.session(Class.forName(className)); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void save(Object obj) { this.session.save(obj); } @Override public void delete(Object obj) { try { this.session.delete(obj); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void update(Object obj) { this.session.update(obj); } @Override public Object find(Object obj) { // TODO Auto-generated method stub return this.session.find(obj); } @Override public List<Object> finds() { // TODO Auto-generated method stub return this.session.finds(); } @Override public long total() { // TODO Auto-generated method stub return this.session.count(); } @Override public List<Object> finds(int index, int offset) { // TODO Auto-generated method stub return this.session.query(null, null, offset, index); } }
10.Test 类
public
class
MongoDBTest {
private
static
MongoTemplate template1;
private
static
MongoTemplate template2;
private
static
MongoTemplate template3;
private
static
Dao dao1;
private
static
Dao dao2;
private
static
Dao dao3;
static
{
MongoObject mongoObject =
new
MongoObject();
mongoObject.setPort(
12345
);
MongoDB demo1 =
new
MongoDB(mongoObject,
"demo1"
);
MongoDB demo2 =
new
MongoDB(mongoObject,
"demo2"
);
MongoDB demo3 =
new
MongoDB(mongoObject,
"demo3"
);
template1 =
new
MongoTemplate(demo1);
template2 =
new
MongoTemplate(demo2);
template3 =
new
MongoTemplate(demo3);
dao1 =
new
DaoImpl(template1,
"MidStu"
);
dao2 =
new
DaoImpl(template2,
"MidStu"
);
dao3 =
new
DaoImpl(template3,
"MidStu"
);
}
@Test
public
void
save() {
MidStu midStu =
new
MidStu();
midStu.setHabit(
"zuqiu"
);
midStu.setId(
"saflfgsddsf35"
);
dao1.save(midStu);
MidStu midStuFind =
new
MidStu();
midStuFind.setId(
"saflfgsddsf35"
);
System.out.println(dao1.find(midStuFind).toString());
dao2.save(midStu);
System.out.println(dao2.find(midStuFind).toString());
dao3.save(midStu);
System.out.println(dao3.find(midStuFind).toString());
}
}