1.实验目的
(1)理解四种数据库(MySQL、HBase、Redis和MongoDB)的概念以及不同点;
(2)熟练使用四种数据库操作常用的Shell命令;
(3)熟悉四种数据库操作常用的Java API。
2.实验平台
(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);
(2)Hadoop版本:3.1.3;
(3)MySQL版本:5.6;
(4)HBase版本:2.2.2;
(5)Redis版本:5.0.5;
(6)MongoDB版本:4.0.16;
(7)JDK版本:1.8;
(8)Java IDE:Eclipse;
3.实验步骤
(一) MySQL数据库操作
学生表如14-7所示。
表14-7 学生表Student
Name |
English |
Math |
Computer |
zhangsan |
69 |
86 |
77 |
lisi |
55 |
100 |
88 |
- 根据上面给出的Student表,在MySQL数据库中完成如下操作:
(1)在MySQL中创建Student表,并录入数据
(2)用SQL语句输出Student表中的所有记录;
(3)查询zhangsan的Computer成绩;
(4)修改lisi的Math成绩,改为95。
2.根据上面已经设计出的Student表,使用MySQL的JAVA客户端编程实现以下操作:
(1)向Student表中添加如下所示的一条记录:
scofield |
45 |
89 |
100 |
(2)获取scofield的English成绩信息
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 |
- 根据上面给出的学生表Student的信息,执行如下操作:
(1)用Hbase 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)获取scofield的English成绩信息。
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("scofield的English成绩: " + Bytes.toString(englishScore));
// 关闭连接
table.close();
connection.close();
}
}
(三)Redis数据库操作
Student键值对如下:
zhangsan:{ English: 69 Math: 86 Computer: 77 } lisi:{ English: 55 Math: 100 Computer: 88 } |
1. 根据上面给出的键值对,完成如下操作:
(1)用Redis的哈希结构设计出学生表Student(键值可以用student.zhangsan和student.lisi来表示两个键值属于同一个表);
(2)用hgetall命令分别输出zhangsan和lisi的成绩信息;
(3)用hget命令查询zhangsan的Computer成绩;
(4)修改lisi的Math成绩,改为95。
2.根据上面已经设计出的学生表Student,用Redis的JAVA客户端编程(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)获取scofield的English成绩信息
import redis.clients.jedis.Jedis;
public class RedisExample {
public static void main(String[] args) {
// 创建Jedis连接
Jedis jedis = new Jedis("localhost");
// 获取scofield的English成绩
String englishScore = jedis.hget("student:scofield", "English");
System.out.println("scofield的English成绩: " + englishScore);
// 关闭连接
jedis.close();
}
}
(四)MongoDB数据库操作
Student文档如下:
{ “name”: “zhangsan”, “score”: { “English”: 69, “Math”: 86, “Computer”: 77 } } { “name”: “lisi”, “score”: { “English”: 55, “Math”: 100, “Computer”: 88 } } |
1.根据上面给出的文档,完成如下操作:
(1)用MongoDB 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
}
}
]);
(2)用find()方法输出两个学生的信息;
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集合,用MongoDB的Java客户端编程,实现如下操作:
(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();
}
}