通过阅读MongoDB  3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射.

  1.定义抽象类:AbstractMongoSession

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); }

2. 实现类MongoSession

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);
}
}

  7.DaoImpl

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);
} }

8. 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());
}
}

  

通过java反射实现简单的关于MongoDB的对象关系映射(ORM).的更多相关文章

  1. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  2. [19/05/08-星期三] JDBC(Java DataBase Connectivity)_ORM(Object Relationship Mapping, 对象关系映射)

    一.概念 基本思想: – 表结构跟类对应: 表中字段和类的属性对应:表中记录和对象对应: – 让javabean的属性名和类型尽量和数据库保持一致! – 一条记录对应一个对象.将这些查询到的对象放到容 ...

  3. Java 自定义注解实现ORM对象关系映射

    一,ORM概念 ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关 ...

  4. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. java反射机制简单实例

    目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...

  7. Java反射机制简单使用

    1.Java反射相关类所在package: java.lang.reflect.* 2.开始使用Reflection: 使用reflect相关类,遵循三个步骤: a.获取想要操作类的 java.lan ...

  8. Java反射机制 —— 简单了解

    一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  9. java反射机制简单介绍

    1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...

随机推荐

  1. Android开发-API指南-<supports-gl-texture>

    <supports-gl-texture> 英文原文:http://developer.android.com/guide/topics/manifest/supports-gl-text ...

  2. Wordpress SEO对策(译)

    原文link http://netaone.com/wp/wordpress-seo-plugin/ 统一管理SEO对策的设定能够统一管理SEO相关设定的插件:All in One SEO Pack. ...

  3. Centos7 Openstack - (第一节)基本环境配置

    Centos7 install Openstack - (第一节)基本环境配置 我的blog地址:http://www.cnblogs.com/caoguo 根据openstack官方文档配置 官方文 ...

  4. SDUT 3347 数据结构实验之数组三:快速转置

    数据结构实验之数组三:快速转置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 转置运算是一 ...

  5. DB2日常维护——REORG TABLE命令优化数据库性能

    一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误重复发生. 由于DB2使用CBO作为数据库的优化器,数据库对象的状 ...

  6. OSGI.NET 插件无法启动之情景一

    关于osgi.net 的使用网上也有不少的资料,最近在使用osgi.net  开发插件的时候,遇到了这样的bug,造成插件甚至整个项目都无法启动,异常的具体消息如下: Could not find a ...

  7. button的type属性

    今天为看懂一段js代码纠结了很久,搞不明白数据是如何实现post,因为button没有规定属性,其次对submit事件没太搞明白.忽然想起默认属性这个概念,豁然开朗,啊~ 1.请始终为按钮规定 typ ...

  8. html中button的type属性

         接触web开发不久,今天遇到了一个问题,点击button按钮,浏览器没有反应,尝试了自己可以想到的所有办法,还是无果.只得请教他人,才发现是button的type属性搞得怪,原来:     ...

  9. OpenJudge 核电站

    描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 输入 只 ...

  10. linux程序调试常用命令

    1 调用跟踪 跟踪系统调用 strace ls –l 跟踪库调用  ltrace 2 lsof(list open file) 查看程序命令打开了哪些文件  lsof –p PID; lsof –c ...