请记住,这是一个非常新手的问题,所以请耐心等待。
因此,作为一个对数据库知之甚少或一无所知的人,不利的条件使我陷入了这样一种境地,即我要执行一项我对如何做知之甚少的任务。
在我需要的时候,我来找你们。
首先,我的任务要求我使用 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/