2011-07-23 64 views
4

我正在使用JDBC(和spring-jdbc的jdbcTemplate)訪問java Web應用程序中的數據庫。我有很多不同的查詢,有些地方我加入到那裏的表中,一個是子查詢,一個是在這裏使用一個組等。等等。將SQL結果映射到java對象的策略

我經常需要結果來顯示一個特定的表由JSP生成,所以我可以使用方便的queryForList方法,該方法返回一個List<Map<String, Object>>,這是一個List,每行代表一個將列名映射到值的映射。在JSP中這很好,沒有任何編譯時類型檢查,通過eclipse沒有代碼完成屬性。

但有時我有java代碼來處理查詢結果,我認爲這將有助於不工作與地圖,但與真實的對象,主要是爲了有一個編譯時檢查屬性是否真的存在,有正確的類型,當然有代碼完成。

但是,如果我希望我需要爲每個可能是許多對象(除了setter和getters之外的任何代碼的頁面)的單個查詢編寫一個Object。

處理這種情況的最佳方法是什麼?只要寫那些織物對象?或者,還有更好的方法?

回答

3

...這將是有益的不與地圖工作,但與真正的對象, 主要用於具有編譯時檢查是否真正的屬性存在 ,有正確的類型,當然有代碼完成。

你希望編譯器能夠理解你的對象模型,所以(至少在Java中)你需要創建它,恐怕。

一個體面的IDE將提供選項來爲您從成員變量生成get/set方法,這些成員變量可以是一個定時器。如果對象模型純粹是爲了將某些語義應用於JDBC查詢而不是業務邏輯,則公共成員可能是合適的,從而避免以J2EE Transfer Object模式的樣式需要獲取者和設置者。注意業務邏輯在那裏蔓延,不要忘記equals() and hashCode()

雖然在Spring JDBC中有一些幫助可用於映射到和來自對象的映射,如RowMapperMappingSqlQuery。您可能還想查看對象關係映射框架,如Spring ORM以節省您的一些工作量。我認爲這些方法可以節省編寫SQL代碼的翻譯代碼,管理事務和數據庫模式 - 我們仍然需要創建對象模型。

+0

好吧,好吧。我想我會寫的對象比。我擔心我會走過任何像樣的設計結構。但是你的推理非常有意義......謝謝:-)。 – yankee

0

正如Brabster所提到的,RowMapper和MappingSQLQuery可以幫助您將sql結果集轉換爲對象。但我明白你的擔心是你並不總是從查詢中提取整個對象,有時候你會提取一個對象的組合(通過執行sql連接)。

所以,如果我理解正確,你基本上想知道你是否必須爲每個這些對象的組合創建類?

簡單的答案是否定的,您不需要爲每種類型的連接查詢創建自定義類,但是如果沒有合適的ORM,則必須爲每種類型的連接提供RowMappers(請注意,M in ORM代表映射)。由於Spring的JDBC框架不是ORM,它會要求您爲每個查詢提供映射邏輯。如果這個聲音太多的工作,歡迎來到ORM世界:)

+0

嗯,我在其他項目中使用了「真正的」ORM(Hibernate),但是在這個項目中,我太依賴直接SQL了;-)。當然,我不需要額外的類來進行額外的連接,但是通過+聚合函數進行分組...... – yankee

+0

我自己並沒有使用它,但是您可能想檢查[MyBatis](http:// www .mybatis.org /)。在這裏有你自己的話:「要使用MyBatis數據映射器,你需要依靠自己的對象,XML和SQL,很少有人知道你還不知道,通過MyBatis數據映射器,你擁有全部的能力SQL和存儲過程都在您的指尖。「 –