1.关于使用Model set(string,object);方法的一点点总结
最近根据公司需求编写一个文件上传下载功能,目的是将excel表上传最终存入数据库,要求很简单,就是不能有错误数据,需要对上传的excel表格做严格的数据校验。
要使用excel导入导出首先能想到的应该是使用poi去做,在pom.xml文件中导入相应的依赖,即可使用相关的api去操作表格。这里不过多解释,我只说jbolt中的问题。
对于表格字段多,表多的情况我首先想的是封装一个通用性比较强的工具类,我也是这么做的,首先将上传的excel文件读取出来,每一行就是一个对象,每一列对应一个表字段,在使用反射创建对应表的模型对象,调用Model中的set方法给模型赋值。如下:
但是结果却并不理想,使用set方法赋值免去了类型判断的问题,所有的字段都使用Model类提供的set方法,但是在测试过程中我发现:
虽然字段num是Integer类型的数据
但是在上传的文件中出现错误数据,就是把int数据不小心存成字符串
封装出来的model里面就变成了字符串,问题在于它没有报错,且成功的封装了model,使得我这个通用性的方法宣告破产。
后来查阅资料发现这个set方法封装在Model中,是凌驾于所有表模型类的父类,是泛型方法,针对所有的字段,第二个参数之所以类型是object,就是增强了通用性。所以我就想只能一 一处理,通过反射获得数据库字段类型,在对其进行判断封装。如下:
需要注意的一点是,使用t.getDeclaredFields()去获取对象的属性,这个方法在这里是没有的,也就是说常规的方式获取不到属性值类型,在jfinal中要使用这两句代码去获取字段类型:
Table table = TableMapping.me().getTable(tClass);//tClass是对于表模型的类对象
Class<?> columnType = table.getColumnType(fileName);//fileName是需要获取类型的字段的字段名
通过这样的一些判断处理基本就满足了上传表格过滤错误数据的功能,但是由于我将表格数据全部读取为字符串处理,所以诞生了一个新的问题,如果字段为string类型,读到的表格数据是不做处理直接封装的,那么如果我在表格当中填写了数字,就会把数字当成字符串封装进model中,这显然是不合理的,所以我在判断string类型的时候加了这个判断条件:
就是在判断是数据库字段是string类型的同时判断上传表格的数据不能是数字,但是这样也是采取了一棒子打死的做法,如果有的字段是string类型,但是需求可以存放数字那这样的做法是不可取的,如电话号码,可能会出现"-",所以还是按照需求改动,我这里是不需要的,所以我加了这个判断。
至此,这个上传表格中遇到的关于Model问题解决,可能有不恰当的地方,我将继续改进。