*.accdb数据文件的数据解析工具类

技术总结下:
1、使用jackcess来粗略读取*.accdb数据文件;
2、基于反射,将读取的粗粒数据进行解析。

不多说了,直接贴自己写的代码: 

public static <T> String parseAccdbToObject(Class<T> clazz, Table table) {
    
    // 校验数据
    if(null == table) {
        return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                "文件数据为空!").toJSONString();
    }
    Field[] fields = clazz.getDeclaredFields();
    T t = null;
    
    JSONArray ja = new JSONArray();
    JSONObject msg_jBean_accdbCBean = new JSONObject();
    
    for(Row model: table) {
        try {
            t = clazz.newInstance();
        } catch(InstantiationException e) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                    "clazz参数对象异常" + clazz.getName() + "的实体类中没有【无参构造方法】").toJSONString();
        } catch (IllegalAccessException e) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                    "clazz参数对象异常" + clazz.getName() + "的实体类中没有【无参构造方法】").toJSONString();
        }
        for (Field field : fields) {
            
            ExcelPropertyJade epj = field.getAnnotation(ExcelProperty.class);
            if(null == epj || !epj.isImport()) {
                // 排除部分不导入数据
                continue;
            }
            field.setAccessible(true);
            
            String fieldNameFinal = field.getName();
            String fieldName = fieldNameFinal.replaceFirst(fieldNameFinal.substring(0, 1), 
                    fieldNameFinal.substring(0, 1).toUpperCase());
            String propertyName = field.getAnnotation(ApiModelProperty.class).value();
            
            Class<?> beanType = field.getType();
            Method m = null;
            try {
                m = field.getDeclaringClass().getMethod("set"+fieldName, beanType);
            }catch(NoSuchMethodException e) {
                msg_jBean_accdbCBean.put(propertyName + "=&=" + fieldNameFinal, "该对象属性没有set方法");
                continue;
            }
            
            
            String beanTypeStr = String.valueOf(beanType);
            beanTypeStr = beanTypeStr.substring(beanTypeStr.lastIndexOf(".")+1);
            
            String tableColumnTypeStr = table.getColumn(propertyName).getType().name();
            // 返回数据映射时的错误信息
            JSONObject jo = JSONObject.parseObject(rejectValueToObjectByMapping(beanTypeStr, tableColumnTypeStr, model, propertyName, t, m));
            if(jo.isEmpty())
                continue;
            msg_jBean_accdbCBean.put(propertyName + "=&=" + fieldNameFinal, jo);
        }
        if(!msg_jBean_accdbCBean.isEmpty()) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, msg_jBean_accdbCBean).toJSONString();
        }
        if(null == t) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                    BaseResultCode.ERROR_MSG_500_PROCESS).toJSONString();
        }else {
            ja.add(t);
        }
    }
    return new BaseReturn(BaseResultCode.SUCCESS_MSG_200, ja).toJSONString("yyyy-MM-dd HH:mm:ss");
}

    /*
    * <b>类型过滤器:</b>
    * 已生成java对象和accdb数据文件中的【属性—字段】类型映射后,赋值给引用对象
    * @param beanTypeStr			(String)java属性
    * @param tableColumnTypeStr	(String)access中字段类型
    * @param enrollModel			access中的Row数据
    * @param propertyName			access中的Row数据的key
    * @param t						对象引用,读取后的数据通过引用赋给对象
    * @param m						对象的set方法
    * @return
    */
private static <T> String rejectValueToObjectByMapping(String beanTypeStr, String tableColumnTypeStr,
        Row model, String propertyName, T t, Method m) {
//		accessType:
            TEXT、DOUBLE、BOOLEAN、LONG
//		ZoneId zoneId = ZoneId.systemDefault();
    JSONObject msg_jBean_accdbCBean = new JSONObject();
    try {
        switch (beanTypeStr) {
        case "Double":	m.invoke(t, model.getDouble(propertyName)); break;
        case "Long":	m.invoke(t, Long.valueOf(model.getString(propertyName))); break;
        case "int":		m.invoke(t, model.getInt(propertyName)); break;
        case "String":	m.invoke(t, model.getString(propertyName)); break;
        case "boolean":	m.invoke(t, model.getBoolean(propertyName)); break;
        case "Date":
//    		ZonedDateTime zdt = enrollModel.getLocalDateTime(model.getString(propertyName)).atZone(zoneId);
//    		Date date = Date.from(zdt.toInstant());
            String dateStr = model.getString(propertyName);
            Date date = DateUtil.parseDatePlus(dateStr);
            m.invoke(t, date); 
            break;
        default : 
            msg_jBean_accdbCBean.put("error", "类型过滤器需要新增一个Javabean:" + beanTypeStr);
            break;
        }
    } catch (IllegalAccessException IllegalAccessE) {
        msg_jBean_accdbCBean.put("IllegalAccessException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    } catch (IllegalArgumentException IllegalArgumentE) {
        msg_jBean_accdbCBean.put("IllegalArgumentException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    } catch (InvocationTargetException InvocationTargetE) {
        msg_jBean_accdbCBean.put("InvocationTargetException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    } catch (ParseException IllegalAccessE) {
        msg_jBean_accdbCBean.put("ParseException", "时间解析异常;");
    } catch (ClassCastException ClassCastE) {
        msg_jBean_accdbCBean.put("ClassCastException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    }
    return msg_jBean_accdbCBean.toJSONString();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache Spark是一个强大的大数据处理框架,它可以用于读取和处理多种数据源,包括ACCDB文件。为了使用Spark读取ACCDB文件,我们需要使用特定的库和驱动程序,如HXTT Access JDBC驱动程序。以下是使用Spark读取ACCDB文件的步骤: 1. 下载HXTT Access JDBC驱动程序,将其添加到Spark的CLASSPATH中。 2. 在Spark中创建一个JDBC连接,指定ACCDB文件的路径和驱动程序的类名。 3. 使用Spark SQL或DataFrame API执行查询并处理结果。 下面是一个使用Spark SQL读取ACCDB文件的示例代码: ```scala import org.apache.spark.sql.SparkSession object ReadAccessDB { def main(args: Array[String]) { val spark = SparkSession.builder() .appName("Read Access Database") .master("local[*]") .getOrCreate() val url = "jdbc:access:////path/to/access/database.accdb" val driver = "com.hxtt.sql.access.AccessDriver" val user = "" val password = "" val df = spark.read.format("jdbc") .option("url", url) .option("driver", driver) .option("dbtable", "tableName") .option("user", user) .option("password", password) .load() df.show() spark.stop() } } ``` 在上面的代码中,我们使用SparkSession创建一个Spark应用程序,并指定JDBC连接的URL、驱动程序、用户名和密码。然后,我们使用`spark.read.format("jdbc")`方法加载ACCDB文件中的数据,并将数据存储在DataFrame中。最后,我们使用`df.show()`方法显示结果。 注意:在使用HXTT Access JDBC驱动程序时,需要将驱动程序的类名指定为`com.hxtt.sql.access.AccessDriver`。此外,还需要在JDBC连接的URL中使用`jdbc:access://`前缀,而不是常规的`jdbc:odbc://`前缀。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值