• Java解析MDB(上)-纯JDBC解析非空间数据


    MDB格式数据可以用来存储空间信息,也可以用来存储非空间信息。如果用来存储非空间数据的话,跟普通的excel表格及关系型数据库是一样的。您可以使用微软的access数据库直接打开,也可以使用arcgis、或者qgis的地理编辑软件打开。

    本文将使用JDBC的方式来讲解如何解析非空间MDB数据,将自动获取表表名和字段名。本例采用arcmap软件打开目标文件。可以看到mdb文件的内容如下:

    以上表示该数据不包含空间信息,仅包含属性表信息。

    表里面的字段信息如下:

    在Java中如何获取到解析这些数据呢?下面教你具体如何来解析。

    一、既然要使用jdbc的方式,就要在pom.xml中定义相关依赖

    1. <dependency>
    2. <groupId>net.sf.ucanaccessgroupId>
    3. <artifactId>ucanaccessartifactId>
    4. <version>4.0.4version>
    5. dependency>

    二、动态从mdb文件中获取所有的表名,关键代码如下:

    1. @Test
    2. public void getAllTables() {
    3. try {
    4. Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    5. String accessDb = "F:/vector_data/other/gdal_demo_data/mdb-data/2015phone/20150210mobile.mdb";
    6. String dbURL = "jdbc:ucanaccess://" + accessDb;
    7. Connection conn = DriverManager.getConnection(dbURL);
    8. System.out.println(conn);
    9. DatabaseMetaData metadata = conn.getMetaData();
    10. ResultSet tables = metadata.getTables(null, null, "%", null);
    11. while (tables.next()) {
    12. System.out.println(tables.getString(3));
    13. }
    14. tables.close();
    15. conn.close();
    16. }catch (Exception e) {
    17. e.printStackTrace();
    18. }
    19. }

    运行以上代码即可获取mdb文件中所有管理的表。程序输出如下图所示:

    三、动态获取字段名以及每个字段对应的属性值

    1、读取指定表信息

    1. @Test
    2. public void readTableData() throws Exception {
    3. String mdbPath = "F:/vector_data/other/gdal_demo_data/mdb-data/2015phone/20150210mobile.mdb";
    4. String mdbSql = "SELECT * FROM mobileinfo";
    5. List> list = TestJdbcReadMdbCase.resolverMdb(mdbPath, mdbSql);
    6. System.out.println(list.size());
    7. }

    2、动态获取字段及属性值

    1. /**
    2. *
    3. * @param mdbPath mdb文件路径
    4. * @param mdbSql mdb执行sql
    5. * @param mdbColumnList mdb查询字段
    6. * @return
    7. * @throws Exception
    8. */
    9. private static List> resolverMdb(String mdbPath, String mdbSql) throws Exception {
    10. if (mdbPath.isEmpty() || mdbSql.isEmpty()) {
    11. throw new Exception("mdb文件路径不能为空或者SQL语句不能为空或者返回字段列表不能为空");
    12. }
    13. List> mdbEntityList = new ArrayList<>();
    14. Properties prop = new Properties();
    15. //设置编码
    16. prop.put("charSet", "UTF-8");
    17. //数据地址
    18. String dbUrl = "jdbc:ucanaccess://" + mdbPath;
    19. //引入驱动
    20. Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
    21. try {
    22. //连接数据库资源
    23. Connection conn = DriverManager.getConnection(dbUrl, prop);
    24. //建立查询事务
    25. Statement statement = conn.createStatement();
    26. //执行查询
    27. ResultSet result = statement.executeQuery(mdbSql);
    28. ResultSetMetaData metaData = result.getMetaData();
    29. int count = metaData.getColumnCount();
    30. List mdbColumnList = new ArrayList(count);
    31. //动态解析字段名
    32. for (int i = 1; i <= count; i++) {
    33. mdbColumnList.add(metaData.getColumnName(i));
    34. }
    35. //解析执行结果
    36. Map mdbMapList = new HashMap<>(16);
    37. while (result.next()) {
    38. StringBuffer sb = new StringBuffer();
    39. for (String col : mdbColumnList) {
    40. //System.out.println(result.getObject(col));
    41. sb.append(col + "==" + result.getObject(col)).append("\t");
    42. mdbMapList.put(col, result.getObject(col));
    43. }
    44. System.out.println(sb.toString());
    45. mdbEntityList.add(mdbMapList);
    46. }
    47. } catch (Exception e) {
    48. e.printStackTrace();
    49. }
    50. //返回数据
    51. return mdbEntityList;
    52. }

    上述代码跟普通的jdbc是一样的,都是加载驱动,获取结果集,从结果集中获取相应数据。程序输出如下图所示:

    总结:本文讲解了在java中使用jdbc的方式来解析非空间mdb数据,并给出了具体的关键代码,包括动态获取mdb的表名,通过表名获取字段名和属性值。希望对你有帮助。

  • 相关阅读:
    线程池实现简单案例(C语言)
    java基于springboot+vue的高校教师人事管理系统 elementui
    step5 lasso 回归 实战
    数据库设计
    软文如何打动用户,媒介盒子教你几招
    前端监控日志产品
    垃圾桶--360安全浏览器插件,用于自助过滤不良信息;
    寻找环形链表的入环点
    leetcode经典面试150题---2.移除元素
    以Vivado工具为例了解FPGA实现
  • 原文地址:https://blog.csdn.net/yelangkingwuzuhu/article/details/125882305