医疗信息系统开发实验指导-实验03:操作非关系型数据库

259 阅读5分钟

一、实验目的

1、了解完整的非关系型数据库应用系统的基本构成。

3、掌握MongoDB的基本概念和特点

4、掌握使用Java语言操作MongoDB数据库

5、理解非关系型数据库的设计范式与实体关系

二、实验学时

2学时

三、实验类型

综合性

四、实验需求

1、硬件

每人配备计算机1台,建议优先使用个人计算机开展实验。

实验基于信息技术学院教学容器化云计算平台开展。

2、软件

安装IntelliJ IDEA Community。

MongoDB Community Server 8.0。

项目管理使用GitLab。

3、网络

本地主机能够访问互联网和实验中心网络。

4、工具

MongoDB Compass

Navicat Premium 12

五、实验任务

1、使用Java操作MongoDB数据库。

六、实验内容及步骤

1、安装MongoDB数据库

  1. 下载官方MongoDB数据库

图6-1-1下载官方MongoDB数据库

图6-1-2安装MongoDB数据库

图6-1-3选择自定义按照全部默认设置安装

  1. 检验MongoDB是否安装成功

在浏览器地址栏输入http://localhost:27017/回车显示"It looks like you are trying to access MongoDB over HTTP on the native driver port."

图6-1-4校验MongoDB是否安装并启动成功

图6-1-4校验MongoDB是否安装并启动成功

2、获取官方驱动

  1. 下载MongoDB数据库驱动

从官方maven库下载MongoDB数据库驱动

repo1.maven.org/maven2/org/…

repo1.maven.org/maven2/org/…

repo1.maven.org/maven2/org/…

repo1.maven.org/maven2/org/…非必要)

repo1.maven.org/maven2/org/…非必要)

  1. 导入驱动

图6-2-2-1复制驱动文件到lib目录

图6-2-2-2导入MongoDB驱动

3、创建MongoDB连接管理工具类

//MongoDBConnection.java
package mongodb;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;

public class MongoDBConnection {
    private static MongoClient mongoClient;
    private static MongoDatabase database;
    
    public static void connect() {
        try {
            // 连接MongoDB服务器
            String connectionString = "mongodb://localhost:27017";
            mongoClient = MongoClients.create(connectionString);
            
            // 获取数据库
            database = mongoClient.getDatabase("university");
            
            System.out.println("成功连接到MongoDB数据库");
        } catch (Exception e) {
            System.err.println("连接MongoDB失败: " + e.getMessage());
        }
    }
    
    public static MongoDatabase getDatabase() {
        return database;
    }
    
    public static void close() {
        if (mongoClient != null) {
            mongoClient.close();
            System.out.println("MongoDB连接已关闭");
        }
    }
    
    public static void main(String[] args) {
        connect();
        // 测试连接
        System.out.println("数据库名称: " + getDatabase().getName());
        close();
    }
}

4、CRUD(增删改查)操作

//CRUDOperations.java
package mongodb;

import org.bson.Document;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Updates.*;

import java.util.Arrays;

public class CRUDOperations {
    private MongoCollection<Document> collection;
    
    public CRUDOperations() {
        MongoDatabase database = MongoDBConnection.getDatabase();
        collection = database.getCollection("students");
    }
    
    // 插入文档
    public void insertDocument() {
        Document student1 = new Document("name", "张三")
                .append("age", 20)
                .append("major", "计算机科学")
                .append("courses", Arrays.asList("数据结构", "算法", "数据库"));
        
        Document student2 = new Document("name", "李四")
                .append("age", 22)
                .append("major", "软件工程")
                .append("courses", Arrays.asList("Java编程", "Web开发", "软件测试"));
        
        collection.insertMany(Arrays.asList(student1, student2));
        System.out.println("文档插入成功");
    }
    
    // 查询文档
    public void queryDocuments() {
        System.out.println("所有学生:");
        for (Document doc : collection.find()) {
            System.out.println(doc.toJson());
        }
        
        System.out.println("\n计算机科学专业的学生:");
        for (Document doc : collection.find(eq("major", "计算机科学"))) {
            System.out.println(doc.toJson());
        }
    }
    
    // 更新文档
    public void updateDocument() {
        UpdateResult result = collection.updateOne(
                eq("name", "张三"),
                set("age", 21)
        );
        System.out.println("更新了 " + result.getModifiedCount() + " 个文档");
    }
    
    // 删除文档
    public void deleteDocument() {
        DeleteResult result = collection.deleteOne(eq("name", "李四"));
        System.out.println("删除了 " + result.getDeletedCount() + " 个文档");
    }
    
    public static void main(String[] args) {
        MongoDBConnection.connect();
        
        CRUDOperations operations = new CRUDOperations();
        operations.insertDocument();
        operations.queryDocuments();
        operations.updateDocument();
        operations.queryDocuments();
        operations.deleteDocument();
        operations.queryDocuments();
        
        MongoDBConnection.close();
    }
}

5、 实现各种查询操作

//QueryOperations.java
package mongodb;

import org.bson.Document;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Projections.*;
import static com.mongodb.client.model.Sorts.*;

import java.util.Arrays;

public class QueryOperations {
    private MongoCollection<Document> collection;
    
    public QueryOperations() {
        MongoDatabase database = MongoDBConnection.getDatabase();
        collection = database.getCollection("students");
        // 初始化测试数据
        ensureTestData();
    }
    
    private void ensureTestData() {
        if (collection.countDocuments() == 0) {
            collection.insertMany(Arrays.asList(
                new Document("name", "王思明").append("age", 19).append("major", "计算机科学").append("gpa", 3.5),
                new Document("name", "赵建国").append("age", 21).append("major", "软件工程").append("gpa", 3.8),
                new Document("name", "钱志强").append("age", 20).append("major", "计算机科学").append("gpa", 3.2),
                new Document("name", "孙越").append("age", 22).append("major", "数据科学").append("gpa", 3.9)
            ));
        }
    }
    
    // 条件查询
    public void conditionalQuery() {
        System.out.println("年龄大于20的学生:");
        for (Document doc : collection.find(gt("age", 20))) {
            System.out.println(doc.toJson());
        }
        
        System.out.println("\n计算机科学专业且GPA大于3.0的学生:");
        for (Document doc : collection.find(and(eq("major", "计算机科学"), gt("gpa", 3.0)))) {
            System.out.println(doc.toJson());
        }
    }
    
    // 投影查询(指定返回字段)
    public void projectionQuery() {
        System.out.println("只返回姓名和专业:");
        for (Document doc : collection.find().projection(fields(include("name", "major"), excludeId()))) {
            System.out.println(doc.toJson());
        }
    }
    
    // 排序查询
    public void sortQuery() {
        System.out.println("按年龄降序排列:");
        for (Document doc : collection.find().sort(descending("age"))) {
            System.out.println(doc.toJson());
        }
    }
    
    // 分页查询
    public void paginationQuery() {
        System.out.println("第一页,每页2条记录:");
        for (Document doc : collection.find().skip(0).limit(2)) {
            System.out.println(doc.toJson());
        }
        
        System.out.println("\n第二页,每页2条记录:");
        for (Document doc : collection.find().skip(2).limit(2)) {
            System.out.println(doc.toJson());
        }
    }
    
    public static void main(String[] args) {
        MongoDBConnection.connect();
        
        QueryOperations operations = new QueryOperations();
        operations.conditionalQuery();
        operations.projectionQuery();
        operations.sortQuery();
        operations.paginationQuery();
        
        MongoDBConnection.close();
    }
}

6、聚合操作

//AggregationExample.java
package com.university.mongodb;

import org.bson.Document;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCursor;

import static com.mongodb.client.model.Aggregates.*;
import static com.mongodb.client.model.Accumulators.*;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Sorts.descending;

import java.util.Arrays;

public class AggregationExample {
    private MongoCollection<Document> collection;
    
    public AggregationExample() {
        MongoDatabase database = MongoDBConnection.getDatabase();
        collection = database.getCollection("students");
        // 确保有测试数据
        ensureTestData();
    }
    
    private void ensureTestData() {
        if (collection.countDocuments() == 0) {
            collection.insertMany(Arrays.asList(
                new Document("name", "王思明").append("age", 19).append("major", "计算机科学").append("gpa", 3.5),
                new Document("name", "赵建国").append("age", 21).append("major", "软件工程").append("gpa", 3.8),
                new Document("name", "钱志强").append("age", 20).append("major", "计算机科学").append("gpa", 3.2),
                new Document("name", "孙越").append("age", 22).append("major", "数据科学").append("gpa", 3.9),
                new Document("name", "周怀玉").append("age", 21).append("major", "软件工程").append("gpa", 3.6)
            ));
        }
    }
    
    // 按专业分组计算平均GPA
    public void groupByMajor() {
        System.out.println("各专业的平均GPA:");
        
        MongoCursor<Document> cursor = collection.aggregate(
            Arrays.asList(
                group("$major", avg("avgGpa", "$gpa"))
            )
        ).iterator();
        
        while (cursor.hasNext()) {
            System.out.println(cursor.next().toJson());
        }
    }
    
    // 多阶段聚合:筛选+分组+排序
    public void multiStageAggregation() {
        System.out.println("\nGPA大于3.5的学生按专业分组并统计人数,按人数降序排列:");
        
        MongoCursor<Document> cursor = collection.aggregate(
            Arrays.asList(
                match(gt("gpa", 3.5)),
                group("$major", sum("count", 1)),
                sort(descending("count"))
            )
        ).iterator();
        
        while (cursor.hasNext()) {
            System.out.println(cursor.next().toJson());
        }
    }
    
    public static void main(String[] args) {
        MongoDBConnection.connect();
        
        AggregationExample example = new AggregationExample();
        example.groupByMajor();
        example.multiStageAggregation();
        
        MongoDBConnection.close();
    }
}

7、使用数据库管理工具检索数据

  1. 使用MongoDB自带的MongoDB Compass检索数据

图6-7-1-1使用MongoDB Compass检索数据

  1. 使用Navicat Premium检索数据

图6-7-1-2创建数据库连接

图6-7-1-3检索MongoDB数据

七、实验考核

1、本课程实验考核方案

本课程实验考核采用【实验智能评】【实验随堂查】方式开展,根据不同的实验内容选择不同的考核方式。

【实验智能评】:实验完成后提交GitLab,通过自动化代码评审工具进行评分。

【实验随堂查】:在实验课上通过现场演示的方式向实验指导教师进行汇报,并完成现场问答交流。

2、本实验考核要求

本实验考核方式:实验智能评

实验1-3作为本课程第1次实验考核。

考核要求:

(1)学生通过GitLab提交实验成果:{此部分说明需要提交的内容}。

(2)由GitLab根据成果和交流情况综合评分。