zoukankan      html  css  js  c++  java
  • 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).

        通过阅读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());
    	}
    }
    

      

  • 相关阅读:
    linux 终端相关
    「CF10D」LCIS
    「SP1043」GSS1
    「NOI2009」二叉查找树
    「CF650E」Clockwork Bomb
    「UVA10559」Blocks
    「LuoguP3979」遥远的国度
    「SDOI2015」寻宝游戏
    「CF741D」Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
    「CF600E」Lomsat gelral
  • 原文地址:https://www.cnblogs.com/maybo/p/5182439.html
Copyright © 2011-2022 走看看