执行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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值