12.23 NoSQL和关系数据库的操作比较

1.实验目的

1)理解四种数据库(MySQL、HBase、Redis和MongoDB)的概念以及不同点

2)熟练使用四种数据库操作常用的Shell命令;

3)熟悉四种数据库操作常用的Java API

2.实验平台

1操作系统:Linux(建议Ubuntu16.04Ubuntu18.04);

2Hadoop版本:3.1.3

3MySQL版本:5.6;

4HBase版本:2.2.2

5Redis版本5.0.5

6MongoDB版本4.0.16

7JDK版本:1.8

8Java IDEEclipse;

3.实验步骤

(一) MySQL数据库操作

学生表如14-7所示。

14-7 学生表Student

Name

English

Math

Computer

zhangsan

69

86

77

lisi

55

100

88

  1. 根据上面给出的Student,在MySQL数据库中完成如下操作:

1在MySQL中创建Student表,并录入数据

 

 

2SQL语句输出Student表中的所有记录;

 

 

3查询zhangsanComputer成绩

 

 

4修改lisiMath成绩改为95。

  

 

2.根据上面已经设计出的Student,使用MySQLJAVA客户端编程实现以下操作:

1)向Student表中添加如下所示的一条记录:

scofield

45

89

100

 

2获取scofieldEnglish成绩信息

 

 

package org.example;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class MySQLClient {

private static final String URL = "jdbc:mysql://192.168.200.129:3306/school";

private static final String USER = "root";

    private static final String PASSWORD = "1";

 

    public static void main(String[] args) {

        try {

            // 确保加载 MySQL JDBC 驱动

            Class.forName("com.mysql.cj.jdbc.Driver");

 

            // 连接到数据库

            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);

            System.out.println("成功连接到数据库!");

 

            // (1) Student 表中添加记录

            String insertSQL = "INSERT INTO Student (Name, English, Math, Computer) VALUES (?, ?, ?, ?)";

            try (PreparedStatement preparedStatement = connection.prepareStatement(insertSQL)) {

                preparedStatement.setString(1, "scofield");

                preparedStatement.setInt(2, 45);

                preparedStatement.setInt(3, 89);

                preparedStatement.setInt(4, 100);

                int rowsAffected = preparedStatement.executeUpdate();

                System.out.println("成功插入记录,受影响的行数: " + rowsAffected);

            }

 

            // (2) 获取 scofield English 成绩信息

            String selectSQL = "SELECT English FROM Student WHERE Name = ?";

            try (PreparedStatement preparedStatement = connection.prepareStatement(selectSQL)) {

                preparedStatement.setString(1, "scofield");

                ResultSet resultSet = preparedStatement.executeQuery();

                if (resultSet.next()) {

                    int englishScore = resultSet.getInt("English");

                    System.out.println("scofield English 成绩: " + englishScore);

                } else {

                    System.out.println("未找到 scofield 的记录。");

                }

            }

 

            // 关闭连接

            connection.close();

        } catch (ClassNotFoundException e) {

            System.err.println("MySQL JDBC Driver 未找到。请确保已添加 JDBC 驱动到项目中。");

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

 

 

(二)HBase数据库操作

学生表Student如表14-8所示。

14-8 学生表Student

     name

score

English

Math

Computer

zhangsan

69

86

77

lisi

55

100

88

  1. 根据上面给出的学生表Student的信息执行如下操作:

1Hbase Shell命令创建学生Student

 

 

2用scan命令浏览Student表的相关信息

 

 

3查询zhangsan的Computer成绩

 

 

4)修改lisi的Math成绩,95。

 

 

2.根据上面已经设计出的Student表用HBase API编程实现以下操作:

1)添加数据:English:45  Math:89 Computer:100

scofield

45

89

100

import org.apache.hadoop.hbase.client.Connection;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Table;

import org.apache.hadoop.hbase.util.Bytes;

 

public class HBaseExample {

    public static void main(String[] args) throws Exception {

        // 创建HBase连接

        Connection connection = ConnectionFactory.createConnection();

        Table table = connection.getTable(Bytes.toBytes("Student"));

 

        // 创建Put对象,指定行键

        Put put = new Put(Bytes.toBytes("scofield"));

        put.addColumn(Bytes.toBytes("English"), Bytes.toBytes("score"), Bytes.toBytes("45"));

        put.addColumn(Bytes.toBytes("Math"), Bytes.toBytes("score"), Bytes.toBytes("89"));

        put.addColumn(Bytes.toBytes("Computer"), Bytes.toBytes("score"), Bytes.toBytes("100"));

 

        // 将数据插入表中

        table.put(put);

 

        // 关闭连接

        table.close();

        connection.close();

    }

}

2获取scofieldEnglish成绩信息

import org.apache.hadoop.hbase.client.Connection;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.Table;

import org.apache.hadoop.hbase.util.Bytes;

 

public class HBaseExample {

    public static void main(String[] args) throws Exception {

        // 创建HBase连接

        Connection connection = ConnectionFactory.createConnection();

        Table table = connection.getTable(Bytes.toBytes("Student"));

 

        // 创建Get对象,指定行键

        Get get = new Get(Bytes.toBytes("scofield"));

        Result result = table.get(get);

 

        // 获取English成绩

        byte[] englishScore = result.getValue(Bytes.toBytes("English"), Bytes.toBytes("score"));

        System.out.println("scofieldEnglish成绩: " + Bytes.toString(englishScore));

 

        // 关闭连接

        table.close();

        connection.close();

    }

}

(三)Redis数据库操作

Student键值对如下:

zhangsan:

English: 69

Math: 86

Computer: 77

lisi:

English: 55

Math: 100

Computer: 88

 

1. 根据上面给出的键值对,完成如下操作:

1Redis的哈希结构设计出学生表Student键值可以用student.zhangsan和student.lisi来表示两个键值属于同一个表);   

 

 

2hgetall命令分别输出zhangsanlisi的成绩信息

 

 

3hget命令查询zhangsan的Computer成绩

 

 

4)修改lisi的Math成绩,95

 

 

2.根据上面已经设计出的学生表Student,RedisJAVA客户端编程(jedis),实现如下操作:

1)添加数据:English:45  Math:89 Computer:100

该数据对应的键值对形式如下:

scofield:

English: 45

Math: 89

Computer: 100

import redis.clients.jedis.Jedis;

 

public class RedisExample {

    public static void main(String[] args) {

        // 创建Jedis连接

        Jedis jedis = new Jedis("localhost");

 

        // 添加scofield的成绩

        jedis.hset("student:scofield", "English", "45");

        jedis.hset("student:scofield", "Math", "89");

        jedis.hset("student:scofield", "Computer", "100");

 

        // 关闭连接

        jedis.close();

    }

}

2获取scofieldEnglish成绩信息

import redis.clients.jedis.Jedis;

 

public class RedisExample {

    public static void main(String[] args) {

        // 创建Jedis连接

        Jedis jedis = new Jedis("localhost");

 

        // 获取scofieldEnglish成绩

        String englishScore = jedis.hget("student:scofield", "English");

        System.out.println("scofieldEnglish成绩: " + englishScore);

 

        // 关闭连接

        jedis.close();

    }

}

(四)MongoDB数据库操作

Student文档如下:

{

“name”: “zhangsan”,

“score”: {

“English”: 69,

“Math”: 86,

“Computer”: 77

}

}

{

“name”: “lisi”,

“score”: {

“English”: 55,

“Math”: 100,

“Computer”: 88

}

}

 

1.根据上面给出的文档,完成如下操作:

1MongoDB Shell设计出student集合

use dbstudent;

db.student.insertMany([

    {

        "name": "zhangsan",

        "score": {

            "English": 69,

            "Math": 86,

            "Computer": 77

        }

    },

    {

        "name": "lisi",

        "score": {

            "English": 55,

            "Math": 100,

            "Computer": 88

        }

    }

]);

2find()方法输出两个学生的信息

db.student.find().pretty();

(2)find()方法查询zhangsan所有成绩(只显示score)

db.student.find({ "name": "zhangsan" }, { "score": 1, "_id": 0 });

4)修改lisi的Math成绩,95

db.student.updateOne(

    { "name": "lisi" },

    { $set: { "score.Math": 95 } }

);

2.根据上面已经设计出的Student集合,用MongoDBJava客户端编程,实现如下操作:

1添加数据:English:45 Math:89  Computer:100

与上述数据对应的文档形式如下:

{

“name”: “scofield”,

“score”: {

“English”: 45,

“Math”: 89,

“Computer”: 100

}

}

   import com.mongodb.MongoClient;

import com.mongodb.client.MongoCollection;

import com.mongodb.client.MongoDatabase;

import org.bson.Document;

 

public class MongoDBExample {

    public static void main(String[] args) {

        // 创建MongoDB客户端

        MongoClient mongoClient = new MongoClient("localhost", 27017);

        MongoDatabase database = mongoClient.getDatabase("your_database_name");

        MongoCollection<Document> collection = database.getCollection("student");

 

        // 创建scofield的文档

        Document scofield = new Document("name", "scofield")

                .append("score", new Document("English", 45)

                        .append("Math", 89)

                        .append("Computer", 100));

 

        // 插入文档

        collection.insertOne(scofield);

 

        // 关闭客户端

        mongoClient.close();

    }

}

2)获取scofield所有成绩成绩信息(只显示score)

import com.mongodb.MongoClient;

import com.mongodb.client.MongoCollection;

import com.mongodb.client.MongoDatabase;

import org.bson.Document;

import org.bson.conversions.Bson;

 

import static com.mongodb.client.model.Projections.excludeId;

import static com.mongodb.client.model.Projections.include;

 

public class MongoDBExample {

    public static void main(String[] args) {

        // 创建MongoDB客户端

        MongoClient mongoClient = new MongoClient("localhost", 27017);

        MongoDatabase database = mongoClient.getDatabase("your_database_name");

        MongoCollection<Document> collection = database.getCollection("student");

 

        // 查询scofield的成绩

        Document scofieldScore = collection.find(new Document("name", "scofield"))

                .projection(include("score"))

                .first();

 

        System.out.println("scofield的成绩: " + scofieldScore);

 

        // 关闭客户端

        mongoClient.close();

    }

}

posted @     阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示