2014-03-28 67 views
2

請記住,這是一個相當新手的問題,所以請耐心等待我。德比,SQL和CSV

因此,作爲一個對數據庫知之甚少的人,不良的條件已經導致我進入一個我不知道如何去做的任務的情況。

在我需要的時候,我來找你們/加爾斯。

首先,我的任務需要我使用Apache Derby與Eclipse一起實現所需的目標。

我給了一個位於res/myCSVFile.csv的單個數據庫。

CSV擴展名的文本文件看起來像這樣:

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

不顯得太危險了吧?

我知道我可以建立一個很好的HashMap我的CSV文件是這樣的:

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「。

我的情況要求我使用Derby來操縱上述數據作爲SQL數據庫。知道一個CSV文件看起來沒有像SQL文件,我知道有一些轉換涉及。

我不知道Java是否可以(或應該)以某種方式爲我做到這一點,但我認爲不是。

現在,我推測SQL變種我CSV文件看起來是這樣的:

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

現在,我該如何在動作中獲得德比?

假設我的SQL數據庫是正確的,因爲我上面已經猜到了,我該如何查詢語句?

例如,我會如何將「A」映射到「alpha-static」?我可以用簡單的HashMap來做到這一點嗎?我很想看看,如果可能的話。

我對SQL-指令的工作原理有一個基本的,非常基本的理解,但我會喜歡使用我的數據庫的一些示例。

回答時,只要把我當成一個學齡前兒童來學習這些東西。我真的很新。

+1

不會質疑相關的,你沒有把這些'EDIT's在問題機構 - 還有他們的一個地方叫編輯總結。 –

+0

哦。一定忽略了這一點。赦免。 – ViRALiC

回答

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; 
    } 
} 
+0

很好的答案,我必須說!真的很好的東西。但是我確實收到一個錯誤,而且我確實想知道是否可以更新您的答案,直到我能夠正常工作爲止,因此我可以向您發送閃亮的「接受答案」。當我運行它時,我得到了一個'沒有找到合適的驅動程序,用於第29行的jdbc:derby:/ tmp/test; create = true'-錯誤。我真的不明白我應該更改它。如果有問題,我的建設路線上確實有德比。我對於'mySQLFile.sql'應該放在哪裏也有點困惑,爲了在你的例子中起作用?幫助我理解這一點,我將永遠在你的債務,朋友! – ViRALiC

+0

或者在你的例子中不需要'mySQLFile.sql'?原諒我有點慢。如果你設法幫助我解決我的困境,啤酒就在我身上。 – ViRALiC

+1

驅動程序必須位於類路徑中。您可以在類輸出文件夾中調用'java -cp。; derby.jar TestApp'。在我的例子中沒有'mySQLFile.sql'。你可以在'createAndFillDatabase'方法中找到所有SQL staements。 – drkunibar