MDB格式数据可以用来存储空间信息,也可以用来存储非空间信息。如果用来存储非空间数据的话,跟普通的excel表格及关系型数据库是一样的。您可以使用微软的access数据库直接打开,也可以使用arcgis、或者qgis的地理编辑软件打开。
本文将使用JDBC的方式来讲解如何解析非空间MDB数据,将自动获取表表名和字段名。本例采用arcmap软件打开目标文件。可以看到mdb文件的内容如下:
以上表示该数据不包含空间信息,仅包含属性表信息。
表里面的字段信息如下:
在Java中如何获取到解析这些数据呢?下面教你具体如何来解析。
一、既然要使用jdbc的方式,就要在pom.xml中定义相关依赖
- <dependency>
- <groupId>net.sf.ucanaccessgroupId>
- <artifactId>ucanaccessartifactId>
- <version>4.0.4version>
- dependency>
二、动态从mdb文件中获取所有的表名,关键代码如下:
- @Test
- public void getAllTables() {
- try {
- Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
- String accessDb = "F:/vector_data/other/gdal_demo_data/mdb-data/2015phone/20150210mobile.mdb";
- String dbURL = "jdbc:ucanaccess://" + accessDb;
- Connection conn = DriverManager.getConnection(dbURL);
- System.out.println(conn);
-
- DatabaseMetaData metadata = conn.getMetaData();
- ResultSet tables = metadata.getTables(null, null, "%", null);
- while (tables.next()) {
- System.out.println(tables.getString(3));
- }
- tables.close();
- conn.close();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
运行以上代码即可获取mdb文件中所有管理的表。程序输出如下图所示:
三、动态获取字段名以及每个字段对应的属性值
1、读取指定表信息
- @Test
- public void readTableData() throws Exception {
- String mdbPath = "F:/vector_data/other/gdal_demo_data/mdb-data/2015phone/20150210mobile.mdb";
- String mdbSql = "SELECT * FROM mobileinfo";
- List
- System.out.println(list.size());
- }
2、动态获取字段及属性值
- /**
- *
- * @param mdbPath mdb文件路径
- * @param mdbSql mdb执行sql
- * @param mdbColumnList mdb查询字段
- * @return
- * @throws Exception
- */
- private static List
- if (mdbPath.isEmpty() || mdbSql.isEmpty()) {
- throw new Exception("mdb文件路径不能为空或者SQL语句不能为空或者返回字段列表不能为空");
- }
- List
- Properties prop = new Properties();
- //设置编码
- prop.put("charSet", "UTF-8");
- //数据地址
- String dbUrl = "jdbc:ucanaccess://" + mdbPath;
- //引入驱动
- Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
- try {
- //连接数据库资源
- Connection conn = DriverManager.getConnection(dbUrl, prop);
- //建立查询事务
- Statement statement = conn.createStatement();
- //执行查询
- ResultSet result = statement.executeQuery(mdbSql);
-
- ResultSetMetaData metaData = result.getMetaData();
-
- int count = metaData.getColumnCount();
- List
mdbColumnList = new ArrayList(count); - //动态解析字段名
- for (int i = 1; i <= count; i++) {
- mdbColumnList.add(metaData.getColumnName(i));
- }
- //解析执行结果
- Map
mdbMapList = new HashMap<>(16); - while (result.next()) {
- StringBuffer sb = new StringBuffer();
- for (String col : mdbColumnList) {
- //System.out.println(result.getObject(col));
- sb.append(col + "==" + result.getObject(col)).append("\t");
- mdbMapList.put(col, result.getObject(col));
- }
- System.out.println(sb.toString());
- mdbEntityList.add(mdbMapList);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- //返回数据
- return mdbEntityList;
- }
上述代码跟普通的jdbc是一样的,都是加载驱动,获取结果集,从结果集中获取相应数据。程序输出如下图所示:
总结:本文讲解了在java中使用jdbc的方式来解析非空间mdb数据,并给出了具体的关键代码,包括动态获取mdb的表名,通过表名获取字段名和属性值。希望对你有帮助。