项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前台页面需要调整字段顺序或者增加一个字段、删除一个字段时,后台需要修改java代码。经过一上午的重构努力,改为数据库配置字段与字段对应方法,java利用反射动态调用对象方法从而获取字段值,拼接为list传递给前台。这样修改后,代码干净整洁,非常灵活,只要是对象中存在的方法,可以在数据库中任意配置显示与否、显示顺序等,现在分别介绍下实现过程:
一、数据库定义
CREATE TABLE `IS_WEB_TABLECONF` (
`guid` bigint(20) NOT NULL,
`columnname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--字段在页面的显示名称
`language` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL--语言,可以配置多套语言环境的数据
`columnmethodname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,,--字段的反射方法
`orderstr` int(10) DEFAULT NULL,--字段在页面的显示顺序
`tablename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--表单名称
`modulename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--模块名称
PRIMARY KEY (`guid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
`guid` bigint(20) NOT NULL,
`columnname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--字段在页面的显示名称
`language` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL--语言,可以配置多套语言环境的数据
`columnmethodname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,,--字段的反射方法
`orderstr` int(10) DEFAULT NULL,--字段在页面的显示顺序
`tablename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--表单名称
`modulename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,--模块名称
PRIMARY KEY (`guid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of IS_WEB_TABLECONF
-- ----------------------------
INSERT INTO `IS_WEB_TABLECONF` VALUES (1, '公司名称:', 'zh-ch', 'getBranchName', 1, b'0', 23, '2019-09-18 10:44:32', '2019-09-18 10:44:30', 12, 'WebInstallation', 'BaseInfo');
INSERT INTO `IS_WEB_TABLECONF` VALUES (2, '初始分公司:', 'zh-ch', 'getProtocolStartDate', 2, b'0', 345, '2019-09-18 10:45:48', '2019-09-18 10:45:50', 4, 'WebInstallation', 'BaseInfo');
-- Records of IS_WEB_TABLECONF
-- ----------------------------
INSERT INTO `IS_WEB_TABLECONF` VALUES (1, '公司名称:', 'zh-ch', 'getBranchName', 1, b'0', 23, '2019-09-18 10:44:32', '2019-09-18 10:44:30', 12, 'WebInstallation', 'BaseInfo');
INSERT INTO `IS_WEB_TABLECONF` VALUES (2, '初始分公司:', 'zh-ch', 'getProtocolStartDate', 2, b'0', 345, '2019-09-18 10:45:48', '2019-09-18 10:45:50', 4, 'WebInstallation', 'BaseInfo');
二、java中根据不同模块查询对应的表格定义,组装数据
private void getListInfo(String licenseClassName, List qualifyList, Object dto, String qualifyInfo) {
//licenseClassName需要反射对象的类路径名称,如:
"com.neuxa.is.isinterface.fm.dto.IsSlInstallationunitReviewDto"
//dto是查询好带有数据信息的对象实体
List<IsWebTableconfDto> tableConfQua = dictionaryUtil.getTableConf("WebInstallation", qualifyInfo);
for (IsWebTableconfDto confDto : tableConfQua) {
JSONObject object = new JSONObject();
object.put("key", confDto.getColumnname());
String value = "";
value = getInvokeMethodValue(licenseClassName, confDto.getColumnmethodname(), dto);
object.put("value", value);
qualifyList.add(object);
}
private String getInvokeMethodValue(String classBeanName,String methodName,Object curDto){
String value="";
try {
Class<?> clazz = Class.forName(classBeanName);
Method method = clazz.getDeclaredMethod(methodName);
method.setAccessible(true);
Object invoke = method.invoke(curDto);
value=invoke.toString();
}catch(Exception e){
e.printStackTrace();
}
return value;
}