這可能對您有用,當然。我會爲未來的讀者提供更完整的問題,儘管如此:
但您寫的很多查詢可能是數據庫特定的,或者依賴某些關鍵字才能生效。以一個常見的查詢爲例。要列出所有的產品在數據庫中,但顯示用戶10在一個時間:
的MySQL:
select * from products LIMIT 0,10
然後在接下來的10行:
select * from products LIMIT 10,10
等
非常棒,所以用戶可以使用MySQL作爲數據庫。那麼如果他們使用另一個免費且非常流行的數據庫postgres呢?該查詢不起作用:
SELECT * FROM product LIMIT 10 OFFSET 10
因此,您的代碼不像您想象的那樣便攜。
解決此問題的一種方法是爲您計劃進行的所有查詢/訪問創建您自己的接口(接口Query,接口Access),然後擁有一個查詢工廠,該工廠可基於DB方言進行實例化(MySQL,postgres等),並創建MySQLQueryImpl和PostGresQueryImpl(都實現了Query接口)。
不幸的是,您必須編寫一些數據庫調用的兩次,或者將它們自己移出到屬性文件中。您還可以設計查詢因子以從屬性文件實例化(就像您最初想要的那樣),並允許其他用戶在將來實現他們自己的查詢,以便擴展性在那裏,而且您不必親自去做。
或者...
另一種選擇,這可能是更優雅和錯誤證明(嗯......也許)是讓你別人這樣做。 Hibernate是一個非常常用的工具,可以爲您抽取數據庫讀/寫,並且可以將其配置爲使用其他數據庫,只要它具有多年的經驗和錯誤修復。它不是最容易學的東西(對於複雜的查詢和連接等),但對於基本模型和映射到數據庫,它會給你提供你想要的和更多的東西,包括能夠非常輕鬆地開啓/關閉緩存和懶惰加載數據,因此您不會帶入數千條您不會使用的記錄。您需要很長時間才能創建和加固這樣的系統。
從理論上講,這很好,但根據我的經驗(1)除極少數情況外,您確實不會更換數據庫; (2)SQL語法會使其變得困難,而不是驅動程序。 – JohnFx
@JohnFx好的,謝謝,但是如果不注意sql語法的區別,那麼這個想法好?或者可能存在一些更優雅的方式來實現這一目標? – MyTitle
可能會將其移至數據源? – kosa