java - Derby 、SQL 和 CSV

标签 java sql csv derby

请记住,这是一个非常新手的问题,所以请耐心等待。

因此,作为一个对数据库知之甚少或一无所知的人,不利的条件使我陷入了这样一种境地,即我要执行一项我对如何做知之甚少的任务。

在我需要的时候,我来找你们。

首先,我的任务要求我使用 Apache Derby 与 Eclipse 一起实现预期目标。

我得到了一个位于 res/myCSVFile.csv 的数据库。

带有 CSV 扩展名的文本文件如下所示:

letter,name
A,alpha-static
B,beta-static
C,charlie-static

看起来不太危险,对吧?

我知道我可以从我的 CSV 文件中构建一个不错的 HashMap,如下所示:

Map<String, myFileType> myHashMap = new HashMap<>();
try(CSVReader rdr = new CSVReader(new FileReader("res/myCSVFile.csv"), ',','"',1)){
    for(String[] row : rdr.readAll()){
        File imagefile = new File(row[1]);
        myHashMap.put(row[0], new myFileType(imagefile, Integer.parseInt(row[2])));
    }
}

我知道 CSV 用逗号分隔列,所以我假设我在这个文件中看到的是两列,一列标记为“字母”,值为“A”、“B”和“C”在它下面,另一个标有“name”的标签下面有“alpha-static”、“beta-static”和“charlie-static”。

我的情况要求我使用 Derby 将上述数据作为 SQL 数据库进行操作。完全清楚 CSV 文件看起来不像 SQL 文件,我知道其中涉及一些转换。

我不知道 Java 是否可以(或应该)以某种方式为我做这件事,但我认为不会。

现在,我假设我的 CSV 文件的 SQL 变体看起来像这样:

DROP TABLE possibleSqlTable;
CREATE TABLE possibleSqlTable(
  letter VARCHAR(1) NOT NULL PRIMARY KEY
, name VARCHAR(14)
);
INSERT INTO possibleSqlTable(letter,name) VALUES ('A','alpha-static');
INSERT INTO possibleSqlTable(letter,name) VALUES ('B','beta-static');
INSERT INTO possibleSqlTable(letter,name) VALUES ('C','charlie-static');

这只是我在黑暗中对这个 SQL 数据库的外观的猜测(如果我错了请纠正我)。假设保存为 res/possibleSqlDatabase.sql

现在,如何让 Derby 参与进来?

假设我的 SQL 数据库如我上面所猜测的那样正确,我该如何查询语句?

例如,我如何将“A”映射到“alpha-static”?我可以用一个简单的 HashMap 来做到这一点吗?如果可能的话,我很想看看怎么做。

我确实对 SQL 命令的工作原理有一个基本的、非常基本的理解,但我希望使用我的数据库的一些示例。

回答时,请把我当成学龄前 child 来学习这些东西。我真的很新。

最佳答案

这是一个例子。

在本例中,我创建了一个本地数据库 /tmp/test注意:如果要使用Derby 作为服务,您必须更改getConnection() 中的URL 并自行启动数据库。您还可以在同一位置更改数据库的文件名。

该示例可以使用 getData() 读取整个数据或使用 getOneName(String) 读取单个值。

在构造函数中,我们创建并填充数据库(如有必要)、读取整个数据、读取单个字母和读取一个不存在的字母。

希望对你有帮助

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;


public class TestApp {


    public static void main(String[] args) throws SQLException {
        TestApp myTestApp = new TestApp();
    }

    public TestApp() throws SQLException {
        this.createAndFillDatabase();
        Map<String, String> allData = this.getData();
        String oneData = this.getOneName("A");
        String noData = this.getOneName("D");
        System.out.println("allData = " + allData);
        System.out.println("oData   = " + oneData);
        System.out.println("noData  = " + noData);
    }

    private Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc:derby:/tmp/test;create=true");
    }

    private void createAndFillDatabase() throws SQLException {
        try (Connection conn = getConnection()) {
            ResultSet tables = conn.getMetaData().getTables(null, null, "POSSIBLESQLTABLE", null);
            if (!tables.next()) {
                // create table
                Statement stmt = conn.createStatement();
                stmt.execute("CREATE TABLE possibleSqlTable(\n"
                        + "  letter VARCHAR(1) NOT NULL PRIMARY KEY\n"
                        + ", name VARCHAR(14)\n"
                        + ")");
                // insert data
                String[][] data = {{"A", "alpha-static"}, {"B", "beta-static"}, {"C", "charlie-static"}};
                PreparedStatement pstmt = conn.prepareStatement("INSERT INTO possibleSqlTable(letter,name) VALUES (?,?)");
                for (String[] row : data) {
                    pstmt.setString(1, row[0]);
                    pstmt.setString(2, row[1]);
                    pstmt.execute();
                }
                conn.commit();
            }
        }
    }

    private Map<String, String> getData() throws SQLException {
        Map<String, String> result = new HashMap<>();
        try (Connection conn = getConnection()) {
            Statement stmt = conn.createStatement();
            ResultSet results = stmt.executeQuery("select * from possibleSqlTable");
            while (results.next()) {
                result.put(results.getString("letter"), results.getString("name"));
            }
        }
        return result;
    }

    private String getOneName(String letter) throws SQLException {
        String result = null;
        try (Connection conn = getConnection()) {
            PreparedStatement pstmt = conn.prepareStatement("select * from possibleSqlTable where letter = ?");
            pstmt.setString(1, letter);
            ResultSet results = pstmt.executeQuery();
            while (results.next()) {
                result = results.getString("name");
            }
        }
        return result;
    }
}

关于java - Derby 、SQL 和 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22717005/

相关文章:

java - java中的动态数组

java - 我的主类的表达式开始非法

sql - 无法从链接服务器 :--NETSUITE 的 OLE DB 提供程序 "[MSDASQL].LONG_DESCRIPTION"获取列 "MSDASQL"的当前行值

mysql,是否可以有多行分组依据?

python - 基于其他列中的值的 Pandas 列

java - 有没有办法获取 DOM 中节点的索引?

java - 如何解决 ClassNotFoundException?

sql - 按来源统计每次购买前 30 天的访问量

mysql - 如果存在则更新否则插入 csv 数据 MySQL

python - 加载 CNN 模型并预测 CSV 文件