執行mybatis資料庫中存放的SQL
專案中看到的一段比較神奇的思路,將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;
}