【问题标题】:Derby, SQL and CSV德比、SQL 和 CSV
【发布时间】:2014-05-08 03:52:13
【问题描述】:

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

因此,作为一个对数据库知之甚少甚至一无所知的人,不良条件使我陷入了一种我不知道该怎么做的任务的境地。

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

首先,我的任务要求我使用 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”,另一列用“alpha-static”、“beta-static”和“charlie-static”标记“name”。

我的情况要求我使用 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-commands 的工作原理有一个基本的、非常基本的了解,但我希望有一些使用我的数据库的示例。

回答时,请把我当成学龄前儿童来学习这些东西。我真的是新人。

【问题讨论】:

  • 与问题无关,您没有将这些EDITs 放在问题正文中 - 有一个名为“编辑摘要”的位置。
  • 哦。一定是忽略了这一点。请原谅。

标签: java sql csv derby


【解决方案1】:

这是一个例子。

在这种情况下,我创建了一个本地数据库/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;
    }
}

【讨论】:

  • 很好的答案,我必须说!真是好东西。但是我确实收到了一个错误,我想知道您是否可以更新您的答案,直到我设法让它工作,所以我可以给您一个漂亮的闪亮的“接受答案”。当我运行它时,我从第 29 行得到一个No suitable driver found for jdbc:derby:/tmp/test;create=true-error。我真的不明白我应该把它改成什么。如果这很重要,我的构建路径中确实有 derby。我也有点困惑 mySQLFile.sql 应该放在哪里,以便与您的示例一起使用?帮助我理解这一点,我将永远欠你的债,朋友!
  • 或者您的示例中不需要mySQLFile.sql?原谅我有点慢。如果你能帮我解决我的困境,啤酒就在我身上。
  • 驱动程序必须在类路径中。你可以在你的类输出文件夹中调用java -cp .;derby.jar TestApp。在我的示例中没有mySQLFile.sql。你可以在方法createAndFillDatabase中找到所有的SQL语句。
  • 我添加了Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); 这行似乎已经解决了。它现在打印出allData = {A=alpha-static, B=beta-static, C=charlie-static} oData = alpha-static noData = null 是不是应该这么说?我会进一步研究以确保我理解这究竟意味着什么(请随时教育我!),但毫无疑问,你赢得了我的“接受的答案”!
  • 输出只是一个例子,如何使用数据库。你可以删除它。 Class.forName("org.apache.derby.jdbc.EmbeddedDriver") 对于 JDBC 4(自 JDK 6 起)是不必要的。 Derby JDBC Driver 从版本 10.2.2.0 开始支持它。不过叫它没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2014-02-27
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2021-08-09
  • 2012-04-29
相关资源
最近更新 更多