ホームページ  >  記事  >  Java  >  Java は、mongodb、汎用カプセル化、追加、削除、クエリ、変更、条件付きクエリ、その他の操作を実装します。

Java は、mongodb、汎用カプセル化、追加、削除、クエリ、変更、条件付きクエリ、その他の操作を実装します。

php是最好的语言
php是最好的语言オリジナル
2018-07-30 13:47:343466ブラウズ

この記事は、mysql の Java に対応するテーブルに似た、特定のコレクション オブジェクトを必要とする一般的なカプセル化実装クラスを実装します。そのアイデアは、特定のオブジェクトの空でないフィールドをすべて解析し、BasicDBObject に保存することです。これは、Java オブジェクトが mongodb のドキュメント フィールドと同じ名前であることを確認する必要があります。これは、汎用性を実現するために、コードではデフォルトで Java オブジェクトのフィールドが BasicDBObject のクエリ フィールドとして使用されるためです。

コアコード 1: これは、Java オブジェクトをクエリ条件に変換します。

/**
     * 通过反射获取非空字段信息
     * @param record
     * @param <Q>
     * @return
     */
    private <Q> BasicDBObject getCondition(Q record) {
        BasicDBObject cond = new BasicDBObject();
        Class clazz = record.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object value = field.get(record);
                if (value != null)
                    cond.put(field.getName(), value);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return cond;
    }

コア コード 2: これは、クエリされたドキュメントを Java オブジェクトに変換します。ここで、デフォルトの Java オブジェクトのフィールドは、ユーザーのすべてのフィールドを動的に取得するためにも使用されます。 mongodbに挿入する場合、通常はdoubleとして格納されるため、変換エラーが発生するため、代入プロセス中にint型とlong型を別々に判断しました。

/**
     * 将结果转化为自定义对象
     * @param document
     * @param target
     * @param <Q>
     * @return
     */
    private <Q> Q parseToObject(Document document, Class<Q> target) {
        try {
            Q result = target.newInstance();
            Field[] fields = target.getDeclaredFields();
            for (Field f : fields) {
                f.setAccessible(true);
                Object value = document.get(f.getName());
                if (value == null)
                    continue;
                else if (f.getType() == Integer.class)
                    f.set(result, ((Number) value).intValue());
                else if (f.getType() == Long.class)
                    f.set(result, ((Number) value).longValue());
                else
                    f.set(result, document.get(f.getName(), f.getType()));
            }
            return result;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return null;
        } catch (InstantiationException e) {
            e.printStackTrace();
            return null;
        }
    }

メソッドの呼び出し: まずクエリパラメータを変換します。クエリを実行するとき、正と負の順序は ID によって決定されるため、デフォルトのデータベースには ID の識別フィールドが必要です。

public <Q> List<Q> queryByCondition(BaseQuery<Q> query,boolean up) {
        Q record = query.getQuery();
        BasicDBObject cond = getCondition(record);
        FindIterable<Document> findIterable;
        if (query.getStart() != null && query.getRows() != null)
            findIterable = thisCollection().find(cond)
                    .sort(new BasicDBObject("id", up ? 1 : -1))
                    .skip((query.getStart() - 1) * query.getRows())
                    .limit(query.getRows());
        else
            findIterable = thisCollection().find(cond)
                    .sort(new BasicDBObject("id", up ? 1 : -1));
        MongoCursor<Document> iterator = findIterable.iterator();
        List<Q> result = new ArrayList<>();
        while (iterator.hasNext()) {
            Document document = iterator.next();
            result.add((Q) parseToObject(document, record.getClass()));
        }
        iterator.close();
        return result;
    }

ここで渡される BaseQuery は次のとおりです。内部のクエリはクエリが必要な Java オブジェクトであり、start&rows はページングに使用されます。ここでは lombok プラグインが使用されており、getter&setter やその他のコードの多くが簡素化されます。

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Data
@Accessors(chain = true)
public class BaseQuery<Q> {
    private Integer start;
    private Integer rows;
    private Q query;

    public BaseQuery(Class clazz) {
        try {
            this.query = (Q) clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

テスト条件クエリメソッド: ここで使用されるエンティティは次のとおりです:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User_info {
    private Integer id;

    private String name;

    private Integer age;

    private Integer role;
}
public static void main(String[] args) {
        User_info record = new User_info();
        BaseQuery<User_info> query = new BaseQuery<>();
        query.setQuery(record);

        BaseMongoDao dao = new BaseMongoDao("test");
        List<User_info> result = dao.queryByCondition(query, true);
        for (User_info user : result) {
            System.out.println(user);
        }
    }

ここで使用されるクエリ条件は空であるため、データベース内のすべてのアイテムが一致します:

Java は、mongodb、汎用カプセル化、追加、削除、クエリ、変更、条件付きクエリ、その他の操作を実装します。

次に、アクセス許可を設定してデータをテストします。 1 :

public static void main(String[] args) {
        User_info record = new User_info();
        record.setRole(1);
        BaseQuery<User_info> query = new BaseQuery<>();
        query.setQuery(record);

        BaseMongoDao dao = new BaseMongoDao("test");
        List<User_info> result = dao.queryByCondition(query, true);
        for (User_info user : result) {
            System.out.println(user);
        }
    }

Output:

Java は、mongodb、汎用カプセル化、追加、削除、クエリ、変更、条件付きクエリ、その他の操作を実装します。

他の削除、追加、変更はすべてこの原則に基づいています。

1.public ; queryByCondition(BaseQuery クエリ,boolean up)

2.public Integer queryCoditionCount(BaseQuery クエリ)

3.public insertOne(Q レコード)

; レコード)

5.public boolean deleteById(Integer id)

6.public boolean deleteByIds(List id)

7.public void updateById( Qレコード)

コードをすべて入れてください:

package cn.wzy.dao;

import com.mongodb.*;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.cn.wzy.query.BaseQuery;
import org.cn.wzy.util.PropertiesUtil;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * Create by Wzy
 * on 2018/7/28 18:15
 * 不短不长八字刚好
 */
public class BaseMongoDao {

    private static final MongoClient mongoClient;

    private static final MongoDatabase mongo;

    static {
        MongoClientOptions options = MongoClientOptions.builder()
                .connectionsPerHost(150)
                .maxWaitTime(2000)
                .socketTimeout(2000)
                .maxConnectionLifeTime(5000)
                .connectTimeout(5000).build();
        ServerAddress serverAddress = new ServerAddress(PropertiesUtil.StringValue("mongo.host"),
                PropertiesUtil.IntegerValue("mongo.port"));
        List addrs = new ArrayList<>();
        addrs.add(serverAddress);
        MongoCredential credential = MongoCredential.createScramSha1Credential(
                PropertiesUtil.StringValue("mongo.user")
                , PropertiesUtil.StringValue("mongo.db")
                , PropertiesUtil.StringValue("mongo.pwd").toCharArray());
        mongoClient = new MongoClient(addrs, credential, options);
        mongo = mongoClient.getDatabase(PropertiesUtil.StringValue("mongo.db"));
    }

    public BaseMongoDao(String colName) {
        this.colName = colName;
    }

    private String colName;

    private MongoCollection thisCollection() {
        return mongo.getCollection(colName);
    }


    public <Q> List<Q> queryByCondition(BaseQuery<Q> query,boolean up) {
        Q record = query.getQuery();
        BasicDBObject cond = getCondition(record);
        FindIterable<Document> findIterable;
        if (query.getStart() != null && query.getRows() != null)
            findIterable = thisCollection().find(cond)
                    .sort(new BasicDBObject("id", up ? 1 : -1))
                    .skip((query.getStart() - 1) * query.getRows())
                    .limit(query.getRows());
        else
            findIterable = thisCollection().find(cond)
                    .sort(new BasicDBObject("id", up ? 1 : -1));
        MongoCursor<Document> iterator = findIterable.iterator();
        List<Q> result = new ArrayList<>();
        while (iterator.hasNext()) {
            Document document = iterator.next();
            result.add((Q) parseToObject(document, record.getClass()));
        }
        iterator.close();
        return result;
    }

    public  Integer queryCoditionCount(BaseQuery query) {
        Q record = query.getQuery();
        BasicDBObject cond = getCondition(record);
        return (int) thisCollection().countDocuments(cond);
    }

    public  boolean insertOne(Q record) {
        BasicDBObject cond = getCondition(record);
        try {
            int top = getTop();
            cond.put("id",++top);
            thisCollection().insertOne(new Document(cond));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public  boolean insertList(List records) {
        try {
            List list = new ArrayList<>(records.size());
            if (!changeIds(records))
                return false;
            for (Q record : records) {
                list.add(new Document(getCondition(record)));
            }
            thisCollection().insertMany(list);
            return true;
        }catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public boolean deleteById(Integer id) {
        try {
            if (id == null)
                return false;
            thisCollection().deleteOne(new BasicDBObject("id",id));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public  boolean deleteByIds(List ids) {
        BasicDBObject cond = new BasicDBObject("id",new BasicDBObject("$in",ids.toArray()));
        try {
            thisCollection().deleteMany(cond);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 只通过id更改,查询就只是搜索id
     * @param record
     * @param 
     */
    public  void updateById(Q record) {
        BasicDBObject cond = getCondition(record);
        BasicDBObject update = new BasicDBObject("$set",cond);
        BasicDBObject query = new BasicDBObject("id",cond.get("id"));
        thisCollection().updateOne(query,update);
    }

    /**
     * 通过反射获取非空字段信息
     * @param record
     * @param <Q>
     * @return
     */
    private <Q> BasicDBObject getCondition(Q record) {
        BasicDBObject cond = new BasicDBObject();
        Class clazz = record.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object value = field.get(record);
                if (value != null)
                    cond.put(field.getName(), value);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return cond;
    }

    /**
     * 将结果转化为自定义对象
     * @param document
     * @param target
     * @param <Q>
     * @return
     */
    private <Q> Q parseToObject(Document document, Class<Q> target) {
        try {
            Q result = target.newInstance();
            Field[] fields = target.getDeclaredFields();
            for (Field f : fields) {
                f.setAccessible(true);
                Object value = document.get(f.getName());
                if (value == null)
                    continue;
                else if (f.getType() == Integer.class)
                    f.set(result, ((Number) value).intValue());
                else if (f.getType() == Long.class)
                    f.set(result, ((Number) value).longValue());
                else
                    f.set(result, document.get(f.getName(), f.getType()));
            }
            return result;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return null;
        } catch (InstantiationException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 使id自增
     * @param records
     * @param 
     * @return
     */
    private  boolean changeIds(List records) {
        if (records == null || records.size() == 0)
            return false;
        Class clazz = records.get(0).getClass();
        try {
            Field id = clazz.getDeclaredField("id");
            id.setAccessible(true);
            int top = getTop();
            for (Q record: records) {
                id.set(record,++top);
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
            return false;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 查找顶针
     * @return
     */
    private int getTop() {
        return ((Number) thisCollection().find().sort(new BasicDBObject("id",-1)).first().get("id")).intValue();
    }

}

関連記事:

java操作 mongodb: 基本的な追加、削除、変更、確認

MongoDB (6) java操作 mongodb 追加、削除、変更、確認

関連動画:

Heima Yun Classroom mongodb 実践ビデオチュートリアル

以上がJava は、mongodb、汎用カプセル化、追加、削除、クエリ、変更、条件付きクエリ、その他の操作を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。