代码实现
代码
package org.example;
import com.opencsv.CSVReader;
import java.io.*;
import java.sql.*;
public class Main {
public static class DatabaseInitializer {
public static void main(String[] args) {
String csvFilePath1 = "data/room.csv";
String csvFilePath2 = "data/student.csv";
String dbUrl = "jdbc:mysql://localhost:3306/dslab1";
String username = "root";
String password = "45683968sqlHeRui";
try {
//建立数据库连接
Connection connection = DriverManager.getConnection(dbUrl, username, password);
// 创建room表
String createRoomTableSql = "CREATE TABLE room (" +
"kdno VARCHAR(10), " +
"kcno VARCHAR(10), " +
"ccno VARCHAR(10), " +
"kdname VARCHAR(100), " +
"exptime VARCHAR(50), " +
"papername VARCHAR(50)" +
")";
Statement createRoomTableStatement = connection.createStatement();
createRoomTableStatement.executeUpdate(createRoomTableSql);
createRoomTableStatement.close();
// 创建student表
String createStudentTableSql = "CREATE TABLE student (" +
"registno VARCHAR(10), " +
"name VARCHAR(100), " +
"kdno VARCHAR(10), " +
"kcno VARCHAR(10), " +
"ccno VARCHAR(10), " +
"seat VARCHAR(10)" +
")";
Statement createStudentTableStatement = connection.createStatement();
createStudentTableStatement.executeUpdate(createStudentTableSql);
createStudentTableStatement.close();
// 读取并插入room.csv的数据(修改kdname编码)
CSVReader roomReader = new CSVReader(new InputStreamReader(new FileInputStream(csvFilePath1), "GBK"));
String[] roomRow;
while ((roomRow = roomReader.readNext()) != null) {
String kdno = roomRow[0];
String kcno = roomRow[1];
String ccno = roomRow[2];
String kdname = roomRow[3];
String exptime = roomRow[4];
String papername = roomRow[5];
String roomInsertQuery = "INSERT INTO room (kdno, kcno, ccno, kdname, exptime, papername) " +
"VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement roomStatement = connection.prepareStatement(roomInsertQuery);
roomStatement.setString(1, kdno);
roomStatement.setString(2, kcno);
roomStatement.setString(3, ccno);
roomStatement.setString(4, kdname);
roomStatement.setString(5, exptime);
roomStatement.setString(6, papername);
roomStatement.executeUpdate();
roomStatement.close();
}
roomReader.close();
// 读取并插入student.csv的数据
CSVReader studentReader = new CSVReader(new FileReader(csvFilePath2));
String[] studentRow;
while ((studentRow = studentReader.readNext()) != null) {
String registno = studentRow[0];
String name = studentRow[1];
String kdno = studentRow[2];
String kcno = studentRow[3];
String ccno = studentRow[4];
String seat = studentRow[5];
String studentInsertQuery = "INSERT INTO student (registno, name, kdno, kcno, ccno, seat) " +
"VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement studentStatement = connection.prepareStatement(studentInsertQuery);
studentStatement.setString(1, registno);
studentStatement.setString(2, name);
studentStatement.setString(3, kdno);
studentStatement.setString(4, kcno);
studentStatement.setString(5, ccno);
studentStatement.setString(6, seat);
studentStatement.executeUpdate();
studentStatement.close();
}
studentReader.close();
// 关闭数据库连接
connection.close();
System.out.println("Success");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行结果
room
student
运行说明
-
建立数据库连接,使用
DriverManager.getConnection()
方法传入数据库URL、用户名和密码来获取连接对象。 -
通过
Statement
对象执行CREATE TABLE
语句创建room
表和student
表。 -
读取
room.csv
文件的数据:使用CSVReader
对象逐行读取数据,将每行数据插入到room
表中,通过PreparedStatement
对象执行INSERT INTO
语句,并将数据绑定到预处理语句中的参数上。读取student.csv
文件,同理。需要注意的是,room
表中的kdname
要使用GBK
编码,否则会以乱码形式出现。 -
程序关闭数据库连接,打印
Success
表示操作成功。
思考题
如果外部数据(原始数据表)数据不完整(例如某个不应该为空的字段缺失数据)或不一致(例如本应有外键关系的数据并没有保持引用完整性),有哪些方法可以处理?你能总结出哪些处理原始数据的原则?
- 外部数据(原始数据表)数据不完整或不一致时:
- 数据清洗:对原始数据进行清洗,去除不完整或不一致的数据。可以通过删除缺失数据的行或填充缺失数据来处理不完整的数据。对于不一致的数据,可以进行数据转换或规范化,以确保数据的一致性。
- 数据补全:对于缺失的数据,可以通过其他数据源进行补全。例如,可以通过 均值,中位数与众数 、 线性回归 、 建模预测 、从其他数据表中获取相关数据 等方法来填充缺失的字段。
- 引用完整性维护:对于缺失外键关系的数据,可以通过引入外键约束来确保引用完整性。这样可以防止插入不一致的数据,并在删除或更新主表数据时进行级联操作。
- 处理原始数据的原则:
- 确保数据的完整性、准确性和一致性。
- 数据应该符合预期的格式、规范和约束。
- 对于不完整或不一致的数据,进行清洗和修复。
- 对于存在外键关系的数据,确保引用完整性,避免数据的不一致性。
- 在处理原始数据之前和之后,进行数据验证和检查,以确保数据的正确性和一致性。
- 记录数据处理的过程和方法,以便日后的审查和追溯。