如果对你有帮助,点个赞吧
实验四:NoSQL和关系数据库的操作比较
一、实验目的
理解四种数据库(MySQL、HBase、Redis和MongoDB)的概念以及不同点;
熟练使用四种数据库操作常用的Shell命令;
熟悉四种数据库操作常用的Java API。
二、实验平台
操作系统:Linux(Ubuntu18.04);
Hadoop版本:3.1.3;
MySQL版本:Ver14.14 Distrib 5.7.32-0ubuntu0.18.04.1;
HBase版本:2.2.1;
Redis版本:6.0.9;
MongoDB版本:3.6.3;
JDK版本:openjdk-1.8;
Java IDE:Eclipse;
三、实验步骤
(一) MySQL数据库操作
学生表Student
Name English Math Computer
zhangsan 69 86 77
lisi 55 100 88
新建一个项目mysqltest,然后再建mysql包,在包中新建java类Test1
去菜鸟教程中:https://www.runoob.com/java/java-mysql-connect.html
下载mysql的jar包并导入:
JAVA代码:
package mysqltest;
import java.sql.*;
public class Test1 {
static final String DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB = "jdbc:mysql://localhost:3306/bigdata?serverTimezone=UTC"; // 数据库
static final String USER = "root";
static final String PASSWD = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try { // 加载驱动程序
Class.forName(DRIVER);
System.out.println("正在连接数据库..."); // 打开一个连接
conn = DriverManager.getConnection(DB, USER, PASSWD); // 执行一个查询
stmt = conn.createStatement();
String sql = "insert into student values('scofield',45,89,100)";
stmt.executeUpdate(sql);
System.out.println("插入成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (stmt != null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
运行成功
在mysql中验证结果,如图数据成功添加:
(2)获取scofield的English成绩信息
新建java文件Test2
JAVA代码:
package mysqltest;
import java.sql.*;
public class Test2 {
static final String DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB = "jdbc:mysql://localhost:3306/bigdata?serverTimezone=UTC"; // 数据库
static final String USER = "root";
static final String PASSWD = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try { // 加载驱动程序
Class.forName(DRIVER);
System.out.println("正在连接数据库..."); // 打开一个连接
conn = DriverManager.getConnection(DB, USER, PASSWD);// 执行一个查询
stmt = conn.createStatement();
String sql = "select name,English from student where name='scofield' ";
rs = stmt.executeQuery(sql); //执行语句,获得结果
System.out.println("name" + " " + "English");
while (rs.next()) {
System.out.printf("%-10s%-10d",rs.getString(1),rs.getInt(2));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null)
try {
rs.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
if (stmt != null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
运行成功,获取到scofield的English成绩信息:
(二)HBase数据库操作
学生表Student
name score
English Math Computer
zhangsan 69 86 77
lisi 55 100 88
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
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;
public class Test6 {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static void main(String[] args) {
try {
insertRow("student3", "scofield", "score", "English", "45");
insertRow("student3", "scofield", "score", "Math", "89");
insertRow("student3", "scofield", "score", "Computer", "100");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void insertRow(String tableName, String key, String colFamily, String col, String val)
throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(key.getBytes());
put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
table.put(put);
System.out.println("插入成功");
table.close();
close();
}
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
public static void close() {
try {
if (admin != null) {
admin.close();
}
if (null != connection) {
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果
hbase shell查看
(2)获取scofield的English成绩信息。
代码:
package bigdata_test4;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
public class Test7 {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static void main(String[] args) {
try {
getData("student3", "scofield", "score", "English");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void getData(String tableName, String rowKey, String colFamily, String col) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(), col.getBytes());
Result result = table.get(get);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
System.out.println("RowName:" + new String(CellUtil.cloneRow(cell)) + " ");
System.out.println("Timetamp:" + cell.getTimestamp() + " ");
System.out.println("column Family:" + new String(CellUtil.cloneFamily(cell)) + " ");
System.out.println("row Name:" + new String(CellUtil.cloneQualifier(cell)) + " ");
System.out.println("value:" + new String(CellUtil.cloneValue(cell)) + " ");
}
table.close();
close();
}
public static void init() {
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");
try {
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void close() {
try {
if (admin != null) {
admin.close();
}
if (null != connection) {
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果
(三)Redis数据库操作
开启Redis服务器
新打开一个终端作为客户端
Student键值对如下:
zhangsan:{
English: 69
Math: 86
Computer: 77
}
lisi:{
English: 55
Math: 100
Computer: 88
}
package redistest;
import java.util.Map;
import redis.clients.jedis.*;
public class Test {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
jedis.hset("student.scofield", "English", "45");
jedis.hset("student.scofield", "Math", "89");
jedis.hset("student.scofield", "Computer", "100");
Map<String, String>value = jedis.hgetAll("student.scofield");
System.out.println("信息添加成功:");
System.out.println("student.scofield:");
for (Map.Entry<String, String>entry : value.entrySet()) {//遍历
//Map.Entry是Map中的一个接口,
//表示一个一个映射项,有key,value
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
运行成功:
在shell中验证结果:hgetall student.scofield
(2)获取scofield的English成绩信息
新建java文件Test2
JAVA代码:
import redis.clients.jedis.Jedis;
public class Test2 {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
String value = jedis.hget("student.scofield", "English");
System.out.println("查询成功");
System.out.println("scofield's English score: " + value);
}
}
运行成功,获取到scofield的English成绩信息:
(四)MongoDB数据库操作
启动和关闭mongodb命令如下:
1. sudo service mongodb start
2. sudo service mongodb stop
输入mongo进入shell
show dbs 显示当前所有的数据,现在没有数据内容
接下来就可以开始做实验题目了
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 student 创建数据库名字, student就是数据库名字
输入给出的Student文档中的数据
最后输入命令db.student.insert(stus) 将以上数据插入student数据库
(2)用find()方法输出两个学生的信息;
(3)用find()方法查询zhangsan的所有成绩(只显示score列);
(4)修改lisi的Math成绩,改为95。
命令:db.student.update({“name”:“lisi”}, {"$set":{“score.Math”:95}} )
然后,再输入命令db.student.find().pretty() 来查看lisi的Math成绩是否成功修改为95
可见,命令执行成功,成功将lisi的数学成绩修改为95
2.根据上面已经设计出的Student集合,用MongoDB的Java客户端编程,实现如下操作:
(1)添加数据:English:45 Math:89 Computer:100
与上述数据对应的文档形式如下:
{
“name”: “scofield”,
“score”: {
“English”: 45,
“Math”: 89,
“Computer”: 100
}
}
新建一个项目mongotest,新建java类Test1
JAVA代码:
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.*;
public class Test1 {
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient("localhost", 27017);//客户端
MongoDatabase mongoDatabase = mongoClient.getDatabase("student");//数据库
MongoCollection<Document>collection = mongoDatabase.getCollection("student");//获取集合
//实例化一个文档,内嵌一个子文档
Document document = new Document("name", "scofield").append("score",
new Document("English", 45).append("Math", 89).append("Computer", 100));
List<Document>documents = new ArrayList<Document>();
documents.add(document);
collection.insertMany(documents);// 插入集合
System.out.println("插入成功");
}
}
运行结果:
在shell中验证结果
(2)获取scofield的所有成绩信息(只显示score列)
新建java文件Test2
JAVA代码:
package mongotest;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.*;
public class Test2 {
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase mongoDatabase = mongoClient.getDatabase("student");
MongoCollection<Document>collection = mongoDatabase.getCollection("student");// 获取集合
// 查找,name=scofield, 只显示 score
MongoCursor<Document>cursor = collection.find(new Document("name", "scofield"))
.projection(new Document("score", 1).append("_id", 0)).iterator();
System.out.println("查询成功,如下:");
while (cursor.hasNext())
System.out.println(cursor.next().toJson());//格式化为 JSON 数据格式
}
}
运行结果:
总结
本次实验四类数据库的安装运行均在linux中完成,深谙linux指令安装的方便快捷。这次实验相对于前几次实验较为简单,也几乎没有出错。对关系型数据库和非关系型数据库的区别有进一步的理解,非关系型数据库是一种数据结构化存储方法的集合,可以是文档或者键值对等。博客:
数据库名称 简介
1.MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
2.Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 非关系型数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
3.MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。