2012-07-16 200 views
1

在過去的幾年中,我已經完成了我所有的數據庫開發,主要是使用ActiveRecord。現在我被困在一個項目中使用Java,並且它感覺所以冗長和hamfisted,我想知道如果我做錯了事情。在數據庫中選擇或創建數據庫,使用Java

在一個ORM範例,如果我要插入到相關的表,我會這麼像

# Joe Bob got a new car 
p = Person.find_or_create_by_name("Joe Bob"); 
Car.new({:make=>"Toyota", :plate=>"ABC 123", :owner=>p}); 

在Java中,至少使用JDBC直接,我將不得不做的人手動查找,如果不存在則插入,然後創建Car條目。

當然,在現實生活中,它不僅僅是2張桌子,疼痛的規模也是指數級的。當然有更好的方法?

回答

2

更好的方法是學習SQL!您非常喜歡的ORM在幕後爲您編寫SQL。

所以你可以做一個快速幫助函數,試圖選擇記錄,如果它不存在,爲你創建它。

在MySQL中,您可以使用INSERT IGNORE .....,只有當行不存在時纔會插入該行。

這裏是SQL的一個特殊位你可能喜歡(MySQL只):

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 

這將嘗試插入記錄,如果它不存在,它返回像往常一樣AUTO_INCREMENT您檢索你的程序。

但是:如果它確實存在,那麼它會更新它 - (只有c被設置爲在這種情況下更新),但最酷的部分是它設置LAST_INSERT_ID()就像插入時一樣。

因此,無論哪種方式,你得到的ID字段。而且都在一點點的SQL中。

SQL是一門很好的語言 - 你應該學習它,而不是依賴orm的psudo語言。

+0

我知道SQL公平一點已經 - 我創建的視圖手工加入應用程序的表讀取它們,並有各種sprocs操縱數據出於其他原因 - 但我沒有聽說過'插入IGNORE'或'在重複鍵'呢。超級有用! – Coderer 2012-07-16 09:41:55

+0

@Coderer'INSERT IGNORE'和'ON DUPLICATE KEY'是MySQL唯一記住的。 – Ariel 2012-07-16 16:52:48

1

如果您正在使用JDBC,則需要查找自己並創建人員(如果它不存在)。如果您使用JDBC,沒有更好的方法。

但是,您可以使用Hibernate,它將幫助您減少自己編寫O-R映射並減少樣板。

正如你來自Ruby,如果你發現編寫所有的SQL查詢,JDBC樣板的痛苦,那麼更好的方法是使用ORM。我建議以下情況之一,

  1. 休眠
  2. JPA(如果你想改變ORM實現,那麼使用JPA)
3

可以使用ORM解決方案的Java - 有各種可用的解決方案。

鏈接值得看的:

話雖如此,我通常發現,對於複雜應用程序ORM經常會造成比它更值錢的麻煩(是的,這包括使用Activerecord的Ruby項目)。有時候,直接通過SQL直接獲取數據確實有意義,而不是試圖在面向對象的門面上強制執行。

0

Sormula包含active record package。如果不存在記錄,save method將更新現有記錄或插入。

查看網站上的active record example

另請參見項目中org.sormula.tests.active.SaveTest.java:

SormulaTestAR record = new SormulaTestAR(); 
record.attach(getActiveDatabase()); // record needs to know data source 
record.setId(8002); 
record.setType(8); 
record.setDescription("Save one AR 2"); 
record.save(); 
相關問題