2010-12-13 67 views
1

我構建的代碼使用Spring和Java從標準數據對象訪問數據庫。爲了簡單起見,我的本地安裝程序使用MySQL安裝。我已經能夠使用我的代碼執行插入操作,但我無法從選擇操作中獲取數據...使用Java/Spring的MySql的結果集是空的,它不應該是

我在MySql中有一個表。數據庫被稱爲jonathan,該表稱爲Project,並在其中包含一個id列。

最初有一行,但我現在在表中插入了三行,這些行已經使用我的java/spring-code插入。

我已經單獨列出了我的問題,並在此處壓縮了特定問題的測試,我已經刪除了任何where子句以確保沒有涉及參數映射問題。我調試了代碼以確保我確實收到了一個數據源。

public class TestDb extends MappingSqlQuery { 
    public TestDb() { 
     super(StorageFactory.getDataSource(), "Select id from jonathan.Project"); 
    } 
    @Override 
    protected Object mapRow(ResultSet arg0, int arg1) throws SQLException { 
     System.out.println(arg1+" rows"); 
     for(int i=0;i<arg1;i++) { 
      System.out.println(i+": "+arg0.getString(i)); 
     } 
     return null; 
    } 
} 

當我測試這個

public static void main(String[] args) { 
    TestDb t = new TestDb(); 
    t.execute(); 
    System.out.println("Test done"); 
} 

我得到

0 rows 
Test done 

我嘗試了多種不同的外殼上表名也。


解決方案: 我證實,我可以只使用JDBC選擇數據,所以這個問題是我如何訪問的結果。

我發現以下工作:

public class TestDb extends MappingSqlQuery { 
    public TestDb() { 
     super(StorageFactory.getDataSource(), "Select id from jonathan.project"); 
    } 
    @Override 
    protected Object mapRow(ResultSet arg0, int arg1) throws SQLException { 
     System.out.println(arg1 + " rows?"); 
     boolean b=arg0.first(); 
     while (b) { 
      System.out.println(arg0.getInt(1)); 
      b=arg0.next(); 
     } 
     return null; 
    } 
} 

打印表示 0行?

100000 
100001 
100002 
Test done 

我仍然不知道什麼ARG1應該給我,因爲據我可以告訴它總是說0。我希望它保持選定的行數。 另外,對於結果集的文件說

一個結果光標最初 位於第一行之前;首先調用 的方法接下來使 當前行的第一行;第二次調用 使當前行的第二行爲 ,依此類推。

給我的想法我可以通過整個ResultSet next(),但如果我先做()然後next()它似乎工作得很好。

+0

我編輯了我的答案帖子。 – LaGrandMere 2010-12-13 10:33:36

回答

1

編輯

你可以嘗試mapRow的開頭:

if (!this.isCompiled()) System.out.println("Compilation needed !"); 

那麼也請您嘗試mapRow的開頭:

if (!arg0.first()) System.out.println("Empty RS !"); 
else System.out.println("RS contains lines!"); 

如果你有「RS包含行」文本,然後在循環中執行i<=arg1而不是i<arg1。 其他地方,我會嘗試找到其他的東西來幫助你:)

+1

閱讀問題:*我確定我與正確的數據庫有聯繫,因爲如果我在查詢中編輯表格名稱來說Projec,我會得到一個[Exception] *。 – BalusC 2010-12-13 03:18:41

+0

@BalusC好吧,那天晚上2點半,我誤讀了,對不起。我會有一個真正的樣子,一旦覺醒:) – LaGrandMere 2010-12-13 08:31:24

+0

@BalusC編輯我的第一篇文章,試圖找到一個解決方案,謝謝你讓我知道我一直在誤讀:) – LaGrandMere 2010-12-13 10:34:12

1

MappingSqlQuery旨在用於將每一行轉換爲一個對象並返回一個列表,其中包含列表中的所有對象。 因此,對ResultSet中的每一行調用mapRow一次。但是,當您手動迭代遊標時,您會在第一次調用mapRow時結束ResultSet,這就是爲什麼arg1不會遞增的原因。 通常情況下,你會有春季呼叫你的實施mapRow 3次和arg1將0到2.

我知道這個答案是太晚了,你可能已經解決了這個年前,但我希望它可以幫助某人否則與同樣的問題:-)

0

first()然後next()是錯的,你只需要next()

first()如果您有一個FORWARD_ONLY ResultSet,甚至可能會失敗。

在結果集的正確方法循環是:

while (arg0.next()) 
{ 
    // call arg0.getXXX() here 
} 

但是使用Spring,你不需要這個。 mapRow()將被調用ResultSet中的每一行,Spring將爲你做循環(基於next())。

我仍然不知道什麼ARG1應該給我

嗯,這有助於read the JavaDocs

參數:
    RS - Resul t設定我們通過
   的rowNum工作 - 行數(0),我們都正在

那麼你的方法應該是這樣的:

@Override 
protected Object mapRow(ResultSet arg0, int arg1) throws SQLException { 
    System.out.println("At row #" + arg1); 
    System.out.println(i+": "+arg0.getString(1)); // get column 1 from the result set 
    return null; 
} 

隨着你只選擇收益單列,在mapRow()方法內不需要循環(在列上)

相關問題