


Java implementiert Mongodb, generische Kapselung, Hinzufügung, Löschung, Abfrage, Änderung, bedingte Abfrage und andere Vorgänge
Dieser Artikel implementiert eine allgemeine generische Kapselungsimplementierungsklasse, die ein bestimmtes Sammlungsobjekt erfordert, ähnlich der Tabelle, die Java in MySQL entspricht. Die Idee besteht darin, alle Nicht-Null-Felder des angegebenen Objekts zu analysieren und in einem zu speichern BasicDBObject, hier Stellen Sie sicher, dass das Java-Objekt denselben Namen wie das Dokumentfeld in Mongodb hat, denn um Universalität zu erreichen, verwendet der Code standardmäßig das Abfragefeld des Java-Objekts als BasicDBObject.
Kerncode 1: Hiermit werden Java-Objekte in Abfragebedingungen konvertiert.
/** * 通过反射获取非空字段信息 * @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; }
Kerncode 2: Hiermit wird das abgefragte Dokument in ein Java-Objekt konvertiert. Dabei sind die Felder des Standard-Java-Objekts mit den Feldern des Datenbankdokuments identisch Erhalten Sie alle Felder des benutzerdefinierten Objekts und führen Sie dann die Zuweisung aus. Ich habe die Typen int und long während des Zuweisungsprozesses separat beurteilt, da sie beim Einfügen in Mongodb normalerweise als Double gespeichert werden, was zu einem Transformationsfehler führt.
/** * 将结果转化为自定义对象 * @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; } }
Aufrufmethode: Konvertieren Sie zuerst die Abfrageparameter. Bei der Abfrage wird die ID verwendet, um die positive und negative Reihenfolge zu bestimmen, daher muss in der Standarddatenbank ein ID-Identifikationsfeld vorhanden sein.
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; }
Die hier übergebene BaseQuery lautet wie folgt: Die darin enthaltene Abfrage ist ein Java-Objekt, das abgefragt werden muss, und start&rows wird zum Paging verwendet. Hier wird das Lombok-Plugin verwendet, das viele Gettter&Setter- und andere Codes vereinfacht.
@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(); } } }
Abfragemethode für Testbedingungen: Die hier verwendeten Entitäten lauten wie folgt:
@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); } }
Da die hier verwendeten Abfragebedingungen leer sind, werden alle Elemente in der Datenbank abgeglichen:
Testen Sie nun die Daten mit der Berechtigung 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); } }
Ausgabe:
Diese bedingte Abfragemethode ist eine Beispiel: Andere Löschungen, Ergänzungen und Änderungen basieren auf diesem Prinzip:
1. public queryByCondition(BaseQuery
query,boolean up)
2.public Integer queryCoditionCount(BaseQuery
query)
3.public boolean insertOne(Q record)
4.public boolean insertList(List
Datensätze)
5.public boolean deleteById(Integer id)
6.public boolean deleteByIds(List
7. public void updateById(Q record)
Geben Sie den gesamten Code ein:
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")); Listaddrs = 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(BaseQueryquery) { Q record = query.getQuery(); BasicDBObject cond = getCondition(record); return (int) thisCollection().countDocuments(cond); } publicboolean 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; } } publicboolean insertList(Listrecords) { try { Listlist = 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 */ publicvoid 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 */ privateboolean changeIds(Listrecords) { 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(); } }
Verwandte Artikel:
Java-Operation mongodb: grundlegendes Hinzufügen, Löschen, Änderung und Abfrage
MongoDB (6) Java-Operation Mongodb Hinzufügen, Löschen, Ändern und Abfragen
Ähnliche Videos:
Black Horse Cloud Classroom mongodb praktisches Video-Tutorial
Das obige ist der detaillierte Inhalt vonJava implementiert Mongodb, generische Kapselung, Hinzufügung, Löschung, Abfrage, Änderung, bedingte Abfrage und andere Vorgänge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

In diesem Artikel wird die Integration der funktionalen Programmierung in Java unter Verwendung von Lambda -Ausdrücken, Streams -API, Methodenreferenzen und optional untersucht. Es zeigt Vorteile wie eine verbesserte Lesbarkeit der Code und die Wartbarkeit durch SUKTIVE UND VERUSNAHMETALITÄT

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

In diesem Artikel werden die NIO-API von Java für nicht blockierende E/A erläutert, wobei Selektoren und Kanäle verwendet werden, um mehrere Verbindungen effizient mit einem einzelnen Thread zu verarbeiten. Es beschreibt den Prozess, die Vorteile (Skalierbarkeit, Leistung) und mögliche Fallstricke (Komplexität,

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

In diesem Artikel wird die Socket-API von Java für die Netzwerkkommunikation beschrieben, die das Setup des Client-Servers, die Datenbearbeitung und entscheidende Überlegungen wie Ressourcenverwaltung, Fehlerbehandlung und Sicherheit abdeckt. Es untersucht auch die Leistungsoptimierungstechniken, ich
