天天看點

java解析MDB檔案的方法,已經寫成公用方法

近期,有人和我說某些企業的資料是存儲在Access庫中,該檔案以點mdb(.mdb)結尾,新人也許不知道Access。它是微軟的辦公軟體存儲形式,與office一樣,是很早期的存儲方案。

Java 為Access提供了解決方案,一種是橋接模式,即odbc形式,它不需要導任何包,因為它被封裝在JDK1.7中,而如今,使用JDK1.8的較多,因為JDK6和JDK7并沒有什麼大改進,就像iPhone6和iPhone7,沒啥變化,但願IPhone8不會讓我們大失所望,雖然我現在仍然用iPhone5S。

插播一段廣告(我這電話用4年了快,16G的,居然不卡。要是安卓估計早就廢了,難道這就是開源的弊端?雖然我很愛國,但也希望山寨機能加強點,别打臉啊)。

再看看JDK1.8,真可謂翻雲覆雨啊!我個人對并發比較感興趣,是以當它出來的時候,就喜歡CompleteFuture加上流式程式設計。扯遠了,說說怎麼解析Mdb吧。顯然Jdk1.8取代了橋接模式。是以你解析時總會報錯,告訴你沒有這種類型的驅動器。那是不是就沒辦法了呢!不是的,這裡我介紹一個jar包,Access_JDBC30.jar,這東西就和mysql驅動性質一樣,隻不過使用方法有所差異。

/**
	 * @category mdb檔案的解析
	 * @author PQF
	 */
	public static List<Map<String, String>> resolverMdb(String mdbPath,
			String sql, Object... column) throws Exception {
		List<Map<String, String>> entityList = new ArrayList<>();
		if (mdbPath.isEmpty() || sql.isEmpty() || column.length < 1) {
			throw new Exception("mdb檔案路徑不能為空或者SQL語句不能為空,并且列的長度不能小于1");
		}
		Properties prop = new Properties();
		prop.put("charSet", "UTF-8");
		String dbUr1 = "jdbc:Access:///" + mdbPath;
		Class.forName("com.hxtt.sql.access.AccessDriver").newInstance();
		try (Connection conn = DriverManager.getConnection(dbUr1, prop);
				Statement statement = conn.createStatement();
				ResultSet result = statement.executeQuery(sql)) {
			Map<String, String> mapList = null;
			while (result.next()) {
				mapList = new HashMap<>();
				for (Object col : column) {
					mapList.put((String) col, result.getString((String) col));
				}
				entityList.add(mapList);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return entityList;
	}
           

這裡注意兩點:1.String dbUr1 = "jdbc:Access:///" + mdbPath;

标紅的地方(jdbc:Access:///)千萬不能去掉啊!!!!

2.Class.forName("com.hxtt.sql.access.AccessDriver").newInstance();

驅動名稱是固定的,别瞎改!!!後面的newInstance(),可以加,也可以不加。

此方法已讓我編寫的十分簡單,傳送一個檔案路徑,然後一段查詢的SQL,和你要查詢的列的名稱即可。什麼???你說你不會用???别鬧了朋友,你搞笑呢???自己琢磨吧!!!

感謝讀者的光顧。