2013-03-17 39 views
1

我使用的是Spring JDBC,我不知道什麼是最好的:連接所有的表,以便我可以獲取我想要填充的對象或做多個選擇查詢的所有關聯?如何處理在Spring中連接表時需要連接多個表來獲取對象的所有數據?一次加入所有表或多個查詢?

+0

取決於您的表格有多大,以及您之後的列。 – Makoto 2013-03-17 20:30:32

+0

它從10行到2000行不等。 – LuckyLuke 2013-03-17 20:37:21

回答

1

一般來說,最好連接儘可能多的表格,因爲您會從對象中引用這些表格。您帶回的列數不會太多,以致於無法爲您的其他數據多次調用數據庫。

唯一真正的例外是,如果你想從多對一的關聯數據。因此,例如,如果您選擇Car並加入Wheel s,那麼您將爲每輛車取回四行,這並不是真正的問題。但是,如果您加入WheelsSeats,您將獲得16排汽車的4個座位。這種加入創造了笛卡兒的產品,所以在這種情況下,第二個獲得座位的詢問可能是必要的,除非你只會選擇幾輛汽車。

爲了解決使用Spring JDBC加入時重寫映射代碼的問題,考慮打破RowMapper。免責聲明:我主要使用Hibernate,並不熟悉Spring的JdbcTemplate,儘管我已經使用了它。讓我舉一個例子爲一到一個連接:

private Car mapCar(ResultSet rs) throws SQLException { 
    Car car = null; 
    while (rs.next()) { 
     if (car == null) { 
      Long carId = rs.getLong("ID"); 
      String model = rs.getString("MODEL"); 
      car= new Car(carId, model); 
     } 
     car.setEngine(mapEngine(rs)); 
    } 
    return car; 
} 

你既可以有一個mapEngine()方法CarRepository特定於汽車或你可以作出公開mapEngine()方法對你EngineRepository您調用類從mapCar()。如果你使用後者,你可能會有名稱衝突,所以你的選擇變量可能是有序的。即使如此,如果CarMapperEngineMapper都包含rs.getLong("ID"),您可能別無選擇,只能創建一個單獨的公共映射器。所以,你可能有這樣一個公共方法:

public Engine mapEngineShared(ResultSet rs) throws SQLException { 
    Engine engine = new Engine(); 
    engine.setId("ENGINE_ID"); // Aliased from "ID" 
    engine.setId("ENGINE_MODEL_TYPE"); // Aliased from "MODEL_TYPE" 
    return engine; 
} 

而且在任何查詢,將這種方式映射,確保與ENGINE_別名你的引擎領域與共享映射器的兼容性。這不是一個理想的解決方案,但可以讓您避免在任何地方都有重複的映射代碼。

對於一個-to-many關聯,你就需要使用ResultSetExtractor因爲RowMappers一次只能處理一個行會給你複製Cars爲每Wheel。該方法將是相同的,但在適當情況下重用RowMappers

如果最終使用複雜連接的原因很多,因爲您的數據模型和業務邏輯傾向於需要這些連接,並且您發現創建映射器很笨拙,您可以考慮一個ORM解決方案來處理映射。再說一次,如果你真的沒有發現不使用連接的性能問題,你最好少用它們,並堅持使用JdbcTemplate的簡單性。

+0

我明白了,但是當您從多個表中提取數據並且希望重用映射邏輯時,Spring JDBC中的最佳實踐是什麼? – LuckyLuke 2013-03-17 20:41:46

+0

我認爲這是你必須感覺到的一點。你當然不希望在每次加入新事物時重寫RowMappers,但是一些額外的映射邏輯是不可避免的。我會用一個例子更新我的答案。 – Planky 2013-03-17 21:32:29