Java MySQL纵表转换成横表

1. 引言

在数据库中,数据通常以纵表(也称为关系数据库表)的形式存储。纵表是一种以行为单位存储数据的方式,每行代表一个实体,每列代表一个属性。然而,在某些情况下,我们可能需要将纵表转换成横表,横表是一种将多行数据合并为一行的方式存储数据。本文将介绍如何使用Java和MySQL将纵表转换成横表。

2. 纵表和横表的区别

在纵表中,每行代表一个实体,每列代表一个属性。例如,我们有一个存储学生信息的纵表,其中每行代表一个学生,每列代表学生的属性,如学号、姓名、年龄等。

学号 姓名 年龄
1001 张三 18
1002 李四 20
1003 王五 19

在横表中,每行代表一个实体,每个属性都是一个单独的列。例如,我们将学生信息的纵表转换成横表,如下所示。

学号 姓名_1001 年龄_1001 姓名_1002 年龄_1002 姓名_1003 年龄_1003
1001 张三 18
1002 李四 20
1003 王五 19

可以看到,横表将纵表的每个属性拆分为一个单独的列,并使用实体的唯一标识作为列名的一部分。

3. 纵表转换成横表的步骤

下面将介绍如何使用Java和MySQL将纵表转换成横表。

3.1 创建纵表

首先,我们需要在MySQL中创建一个纵表,用于存储学生信息。可以使用以下SQL语句创建一个名为students的表。

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

3.2 插入数据到纵表

接下来,我们需要向纵表中插入一些学生信息。可以使用以下SQL语句向students表中插入数据。

INSERT INTO students (id, name, age) VALUES
  (1001, '张三', 18),
  (1002, '李四', 20),
  (1003, '王五', 19);

3.3 创建横表

现在,我们需要创建一个横表,用于存储将纵表转换后的数据。可以使用以下SQL语句创建一个名为students_h的表。

CREATE TABLE students_h (id INT PRIMARY KEY);

3.4 转换纵表到横表

最后,我们需要编写Java代码,将纵表中的数据转换成横表,并将结果插入到横表中。以下是一个示例代码,使用JDBC连接MySQL数据库,并执行转换操作。

import java.sql.*;

public class TableConverter {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        
        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            String selectQuery = "SELECT id, name, age FROM students";
            try (Statement statement = connection.createStatement()) {
                try (ResultSet resultSet = statement.executeQuery(selectQuery)) {
                    while (resultSet.next()) {
                        int id = resultSet.getInt("id");
                        String name = resultSet.getString("name");
                        int age = resultSet.getInt("age");
                        
                        String insertQuery = "INSERT INTO students_h (id, name_" + id + ", age_" + id + ") VALUES (?, ?, ?)";
                        try (PreparedStatement preparedStatement = connection.prepareStatement(insertQuery)) {
                            preparedStatement.setInt(1, id);
                            preparedStatement.setString(2, name);
                            preparedStatement.setInt(