Java解析MDB(上)-纯JDBC解析非空间数据
【摘要】 本文讲解了在java中使用jdbc的方式来解析非空间mdb数据,并给出了具体的关键代码,包括动态获取mdb的表名,通过表名获取字段名和属性值。
MDB格式数据可以用来存储空间信息,也可以用来存储非空间信息。如果用来存储非空间数据的话,跟普通的excel表格及关系型数据库是一样的。您可以使用微软的access数据库直接打开,也可以使用arcgis、或者qgis的地理编辑软件打开。
本文将使用JDBC的方式来讲解如何解析非空间MDB数据,将自动获取表表名和字段名。本例采用arcmap软件打开目标文件。可以看到mdb文件的内容如下:
以上表示该数据不包含空间信息,仅包含属性表信息。
表里面的字段信息如下:
在Java中如何获取到解析这些数据呢?下面教你具体如何来解析。
一、既然要使用jdbc的方式,就要在pom.xml中定义相关依赖
<dependency> <groupId>net.sf.ucanaccess</groupId> <artifactId>ucanaccess</artifactId> <version>4.0.4</version> </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<Map<String, Object>> list = TestJdbcReadMdbCase.resolverMdb(mdbPath, mdbSql); System.out.println(list.size()); }
2、动态获取字段及属性值
/** * * @param mdbPath mdb文件路径 * @param mdbSql mdb执行sql * @param mdbColumnList mdb查询字段 * @return * @throws Exception */ private static List<Map<String, Object>> resolverMdb(String mdbPath, String mdbSql) throws Exception { if (mdbPath.isEmpty() || mdbSql.isEmpty()) { throw new Exception("mdb文件路径不能为空或者SQL语句不能为空或者返回字段列表不能为空"); } List<Map<String, Object>> mdbEntityList = new ArrayList<>(); 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<String> mdbColumnList = new ArrayList<String>(count); //动态解析字段名 for (int i = 1; i <= count; i++) { mdbColumnList.add(metaData.getColumnName(i)); } //解析执行结果 Map<String, Object> 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的表名,通过表名获取字段名和属性值。希望对你有帮助。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)