生活中,你我必定都看到過這種「xx元爆改出租屋」,「爆改小汽車」之類的文章,作爲IT人,折騰的勁頭一點也不差。web
軟件開發過程當中,你是否有時候,會拿着業務提供的一個個CSV或者JSON的數據文件,寫個解析程序,把它們存到數據庫裏,再在本身的程序裏經過數據庫讀出來?sql
其實不用這麼麻煩,還繞了一個大圈。shell
今天,咱們一塊兒來「爆改」JSON/CSV這類文件,把它們打形成 MySQL同樣的關係型數據庫,一套SQL查詢走天下。:-)數據庫
第一步:代碼里加入Maven依賴
<dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-file</artifactId> <version>1.21.0</version> </dependency>
經過這一步,你大概就看出來,我們今天的爆改,主要依賴 Calcite,這個Apache的頂級項目。apache
來張官網截圖感覺下:json
簡單介紹的話,它是個數據庫查詢和優化的引擎,不負責具體的存儲。
tomcat
因此介紹里人家本身也說了,是你高性能數據庫的地基。許多的開源項目是基於它作的,好比大名鼎鼎的這些:微信
第二步:添加配置文件
配置的JSON 文件,通常是下面這樣子:app
改造的配置文件,就像行軍打仗的地圖同樣,來告訴咱們往哪走,這裏的配置文件,對應到關係型數據庫裏,就像是哪一個庫,哪些表同樣。ide
{ "version": "1.0", "defaultSchema": "SALES", "schemas": [ { "name": "SALES", "type": "custom", "factory": "org.apache.calcite.adapter.file.FileSchemaFactory", "operand": { "directory": "sales" } } ]}
其中schemas
表示都有哪些數據庫, defaultSchema
固然是默認數據庫了。factory
表示當前的數據文件,咱們使用哪一種Schema的形式進行解析。由於 Calcite 能夠支持多種數據格式,經過這個圖你也能感覺到幾分吧。
第三步:JDBC Style
經過 JDBC 的形式就能鏈接到咱們本身的數據庫查詢了。代碼和通常的JDBC相似,區別只在於鏈接URL的寫法上,須要將配置文件的位置聲明一下。
public class Demo { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("org.apache.calcite.jdbc.Driver"); Properties config = new Properties(); config.put("model", "./src/main/resources/model.json"); String sql = "select * from hello";
try (Connection con = DriverManager.getConnection("jdbc:calcite:", config)) { try (Statement stmt = con.createStatement()) { ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString(2)); } } } }}
其中SQL 語句,能夠支持條件過濾,join 等全部的標準SQL。
總體項目結構以下:
PS: 忘了提一句,對於CSV文件,第一行須要將各列列名和類型加上,表示數據庫表裏定義的列。
你說我很忙,不想囉哩囉嗦再寫個Java程序,辦法也還有。有個程序叫 sqlline,能夠方便你在命令行裏執行,一個腳本鏈接到對應的文件數據庫以後,就開始你飛通常的SQL表演吧。
!connect jdbc:calcite:model=src/main/resources/model.json admin admin
Have fun!
幫忙在看或轉發扶我一把吧,感謝。
近期文章
Java七武器系列長生劍 -- Java虛擬機的顯微鏡 Serviceability Agent
寫代碼效率不高?放過Ctrl C 和 V,讓AI來能幫你寫代碼吧
這裏是「Tomcat那些事兒」,關注源碼|實戰|成長等話題,歡迎關注,一塊兒成長。
本文分享自微信公衆號 - Tomcat那些事兒(tomcat0000)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。