tio-boot 使用 mongo-java-driver 操作 mongodb

在这个示例中,创建了一个使用 MongoDB 的简单 Java Web 应用程序。这个应用程序包括了数据库依赖配置、数据库操作工具类、配置类、控制器类以及实际的 HTTP 请求处理。下面我将详细解释每一部分的作用和逻辑。

  1. MongoDB Java Driver 依赖 MongoDB Java Driver,这是一个为 Java 应用程序提供的 MongoDB 官方驱动程序。
<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.1.0</version>
</dependency>
  1. MongoDb 工具类
  • 这个类作为 MongoDB 的客户端和数据库对象的容器。它提供静态方法来存取这些对象,确保你的应用程序可以在需要时连接到数据库。
  • getDatabase(String databaseName): 连接到指定名称的数据库。
  • getDatabase(): 获取已经配置好的数据库实例。
  • setClient(MongoClient mongoClient): 设置 MongoDB 的客户端实例。
  • setDatabase(MongoDatabase mongoDatabase): 设置 MongoDB 的数据库实例。
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;

public class MongoDb {

  private static MongoClient mongoClient;
  private static MongoDatabase mongoDatabase;

  public static MongoDatabase getDatabase(String databaseName) {
    // 连接到数据库
    MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
    return mongoDatabase;
  }

  public static MongoDatabase getDatabase() {
    return mongoDatabase;
  }

  public static void setClient(MongoClient mongoClient) {
    MongoDb.mongoClient = mongoClient;
  }

  public static void setDatabase(MongoDatabase mongoDatabase) {
    MongoDb.mongoDatabase = mongoDatabase;
  }
}
  1. MongoClientConfiguration 配置类 配置文件 app.properties
mongodb.host=192.168.3.9
mongodb.port=27017
mongodb.authSource=admin
mongodb.username=admin
mongodb.password=Litong@123
mongodb.database=penhub
  • 这个类是你应用程序的配置类,它负责设置和初始化 MongoDB 客户端。
  • 它创建了数据库的地址和凭证,并用这些信息初始化了 MongoClient。
  • 然后它使用 MongoClient 来连接到数据库,并将这个连接保存在 MongoDb 工具类中,以便全局使用。
  • 最后,它向TioBootServer添加了一个销毁方法,以确保在应用程序关闭时 MongoClient 也会被正确关闭。
package com.enoleap.manglang.pen.api.server.config;

import java.util.ArrayList;
import java.util.List;

import com.litongjava.jfinal.aop.annotation.AConfiguration;
import com.litongjava.jfinal.aop.annotation.AInitialization;
import com.litongjava.tio.boot.server.TioBootServer;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;

@AConfiguration
public class MongoClientConfiguration {

@AInitialization
public void config() {

    // String mongodbHost = "192.168.3.9";
    // int mongodbPort = 27017;
    // String mongodbAuthSource = "admin";
    // String mongodbUsername = "admin";
    // String mongodbPassword = "Litong@123";

    String mongodbHost = EnvUtils.getStr("mongodb.host");
    int mongodbPort = EnvUtils.getInt("mongodb.port");
    String mongodbAuthSource = EnvUtils.get("mongodb.authSource");
    String mongodbUsername = EnvUtils.get("mongodb.username");
    String mongodbPassword = EnvUtils.get("mongodb.password");
    String mongodbDatabase = EnvUtils.get("mongodb.database");

    List<ServerAddress> adds = new ArrayList<>();
    // ServerAddress()两个参数分别为 服务器地址 和 端口
    ServerAddress serverAddress = new ServerAddress(mongodbHost, mongodbPort);
    adds.add(serverAddress);
    List<MongoCredential> credentials = new ArrayList<>();

    // MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
    MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(mongodbUsername, mongodbAuthSource,
        mongodbPassword.toCharArray());
    credentials.add(mongoCredential);

    // 通过连接认证获取MongoDB连接
    MongoClient mongoClient = new MongoClient(adds, credentials);

    // 连接到数据库
    MongoDatabase mongoDatabase = mongoClient.getDatabase(mongodbDatabase);

    // 保持client and database;
    MongoDb.setClient(mongoClient);
    MongoDb.setDatabase(mongoDatabase);

    // 添加addDestroyMethod
    TioBootServer.addDestroyMethod(mongoClient::close);

  }
}
  1. MongdbController 控制器类
  • 这个类处理实际的 HTTP 请求,并利用 MongoDb 工具类与 MongoDB 数据库进行交互。
  • add(): 添加一个新的文档到 user 集合中。
  • list(): 检索 user 集合中的所有文档。
  • listDevices(): 从另一个数据库 penhubdevices 集合中检索所有文档。
package com.litongjava.tio.web.hello.controller;

import java.util.ArrayList;
import java.util.List;

import org.bson.Document;

import com.litongjava.tio.http.server.annotation.RequestPath;
import com.litongjava.tio.web.hello.config.MongoDb;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;

@RequestPath("/mongodb")
public class MongdbController {

  public String add() {
    // 获取数据库连接对象
    MongoDatabase database = MongoDb.getDatabase();
    // 获取集合
    MongoCollection<Document> collection = database.getCollection("user");
    // 要插入的数据
    Document document = new Document("name", "张三").append("sex", "男").append("age", 18);
    // 插入如下
    collection.insertOne(document);
    return "success";
  }

  public List<Document> list() {
    MongoDatabase database = MongoDb.getDatabase();
    MongoCollection<Document> collection = database.getCollection("user");
    // 查找集合中的所有文档,并遍历
    FindIterable<Document> iterable = collection.find();
    MongoCursor<Document> cursor = iterable.iterator();
    List<Document> lists = new ArrayList<>();
    while (cursor.hasNext()) {
      Document doucment = cursor.next();
      lists.add(doucment);
    }
    return lists;
  }

  public List<Document> listDevices(){
    MongoDatabase database = MongoDb.getDatabase("penhub");
    MongoCollection<Document> collection = database.getCollection("devices");
    // 查找集合中的所有文档,并遍历
    FindIterable<Document> iterable = collection.find();
    MongoCursor<Document> cursor = iterable.iterator();
    List<Document> lists = new ArrayList<>();
    while (cursor.hasNext()) {
      Document doucment = cursor.next();
      lists.add(doucment);
    }
    return lists;
  }
}
  1. 测试访问
  • 这部分给出了如何通过 HTTP 请求调用你的服务的示例。
  • 请求 http://localhost/mongodb/add 会在数据库中添加一个新的用户。
  • 请求 http://localhost/mongodb/list 会列出所有用户。
  • 请求 http://localhost/mongodb/listDevices 会从另一个集合中列出所有设备。

在整个流程中,你的应用程序通过 MongoClientConfiguration 类配置和初始化 MongoDB 连接,MongoDb 类作为连接的持有者,并在需要时提供连接。控制器 MongdbController 则处理来自客户端的请求,并使用 MongoDb 类与数据库进行交互。 http://localhost/mongodb/list 接口返回的数据

[
  {
    "_id":
    {
      "counter": 2147426,
      "date": "2024-01-21 15:52:04",
      "machineIdentifier": 13249596,
      "processIdentifier": 14600,
      "time": 1705888324000,
      "timeSecond": 1705888324,
      "timestamp": 1705888324
    },
    "name": "张三",
    "sex": "男",
    "age": 18
  }
]