项目中看到的一段比较神奇的思路,将SQL语句存放在了数据库中,通过外键KEY_ID来获取制作一个合同需要用到的所有SQL,并依次循环执行
贴在此处,过几天深入了解一下。
/**
* 根据传入的策略名(通常是文件名,会被大写处理),读取待填充数据*
* @param key
* @param params
* 传入的查询,用keyset替换查询SQL中的关键字${key}
* @return
*/
@SuppressWarnings("unchecked")
public HashMap getFills(String key, Map params) {
HashMap fills = new HashMap();
fills.put("填充策略", key);
BaseDao<HashMap> baseDao = BaseDao.newInstance();
// 准备填充策略
logger.debug(key.toUpperCase());
List<HashMap> lstSQL = baseDao.selectForList("SRV_AIF.getSQL", key.toUpperCase());
for (HashMap mSQL : lstSQL) {
logger.info("Sequence-" + mSQL.get("SEQUENCE") + "-" + mSQL.get("ID") + " : " + mSQL.get("SQL"));
if (mSQL.get("SQL") == null) {
fills.put("错误信息", "填充SQL为空");
logger.error("\tSQL不能为空");
return fills;
}
// 准备待执行的SQL,用params中的key进行替代${key}
HashMap map = new HashMap();
String sql = mSQL.get("SQL").toString();
map.put("sql", sql);
for (Object mk : params.keySet()) {
if (mk != null) {
String akey = mk.toString();
String aval = params.get(akey).toString();
if (sql.contains("{" + akey + "}")) {
sql = sql.replaceAll("\\{" + akey + "\\}", aval);
// sql.replaceAll("{" + akey + "}", aval);
map.remove("sql");
map.put("sql", sql);
}
}
}
logger.debug(sql + "-----------------");
logger.debug("\texecute:" + map);
logger.debug("参数-----" + map);
List<HashMap> lstFillData = baseDao.selectForList("System.pdf.execute", map);
List<HashMap> lstMappers = baseDao.selectForList("SRV_AIF.getMappers", Integer.parseInt(mSQL.get("ID").toString()));
logger.debug("lstFillData=" + lstFillData);
if (lstFillData.size() > 0) {
logger.debug("\t\t获取结果集,记录数:" + lstFillData.size());
int iCnt = 0;
for (HashMap fillData : lstFillData) {
logger.debug("\t\t处理第" + iCnt + "条记录:" + fillData);
logger.debug("\t\t\t准备进行SQL->PDF域名称转换");
for (HashMap mMapper : lstMappers) {
if (mMapper.get("FIELD_SQL") == null) {
fills.put("错误信息", "FIELD_SQL不能为空,原始ID为:" + mMapper.get("ID"));
logger.error("FIELD_SQL不能为空,原始ID为:" + mMapper.get("ID"));
return fills;
}
// 如果FIELD_PDF为空,则用FIELD_SQL进行同名填充
if (mMapper.get("FIELD_PDF") == null) {
mMapper.put("FIELD_PDF", mMapper.get("FIELD_SQL"));
}
String field_sql = mMapper.get("FIELD_SQL").toString().toUpperCase();
String field_pdf = mMapper.get("FIELD_PDF").toString().toLowerCase();
logger.debug("\t\t\t待转换域: " + field_sql + " -> " + field_pdf + "\t" + mMapper.get("MEMO"));
if (fillData != null && !"null".equals(fillData) && !fillData.isEmpty() && fillData.containsKey(field_sql)) {
// if (fillData.containsKey(field_sql)) {
logger.debug("fillData=" + fillData);
String[] lstFields = field_pdf.trim().toUpperCase().split(",");
if (lstFields.length > 0) {
for (String strPDFFieldName : lstFields) {
String data = fillData.get(field_sql).toString();
// 处理多条记录的结果集
if (iCnt > 0) {
strPDFFieldName = strPDFFieldName + iCnt;
}
logger.debug("\t\t\t\t填充值: " + field_sql + ":" + data + " -> PDF域" + strPDFFieldName);
fills.put(strPDFFieldName, data);
}
} else {
logger.error("\t\t\t\t转换失败,未找到要填充的PDF表单域");
}
}
}
iCnt++;
}
} else {
fills.put("错误信息", "查询未获取到任何数据,查询参数:" + map);
logger.error("查询未获取到任何数据,查询参数:" + map);
continue;
// return fills;
}
}
logger.debug("AIF填充值就绪");
return fills;
}