【开发心得】巧妙借助SQL语句构建器实现根据字段配置动态拼接SQL语句

前言:C2接口工程处理数据入库,因着不同的上游平台自家实现的cms平台有着不同的差距,产生的工单(xml数据),以及使用不同的key携带的数据入库。所以,需要消除字段差异。

------------------------------------  免责声明: 文章中所涉及的代码不包含业务隐私,仅学术研究,分享实现思路  -----------------------------------

设计:

1.借助数据库实现外部的字段(工单中的key)与系统内部字段的对应。

2.原版使用SpringJDBCTemplate,自行封装String构建SQL语句。

3.新选型中引入了Mybatis.故而想到了一种新的实现思路。(可能MybatisPlus/SpringData JPA等有其他实现思路,目前还没想到,欢迎讨论)

关键点:

Mybatis SQL语句构建器 参考官方文档

https://mybatis.org/mybatis-3/zh/statement-builders.html

构建SQL语句: 

public class InsertCommonSql {
    /**
     *
     * @param tableName     表名
     * @param fieldConfig   字段配置  key 键为需要匹配的数据  value 为数据库字段
     * @param valueObject   数据
     * @return
     */
    public static String saveCommonInsert(String tableName, Map<String,String> fieldConfig, Map<String,String> valueObject){
        String resultSql = "";
        SQL self = new SQL().
                INSERT_INTO(tableName).getSelf();
        for(Map.Entry<String,String> mapEntry : fieldConfig.entrySet()){
            // 字段配置通过,字段配置数据的value为数据库字段,valueObject的value 为能在valueObject匹配到key的数据
            self.VALUES(mapEntry.getValue(),
                    valueObject.get(mapEntry.getValue()) == null?
                            "null":
                            "'"+valueObject.get(mapEntry.getValue())+"'");
        }
        resultSql = self.toString();
        return resultSql;
    }

    public static void main(String[] args) {
        String tableName = "program";
        Map<String,String> configMap = new HashMap<>();
        configMap.put("ID","id");
        configMap.put("Code","code");
        configMap.put("SeriesFlag","seriesflag");
//        configMap.put("objectid","id");
        Map<String,String> objectValue = new HashMap<>();
        objectValue.put("id","111");
        objectValue.put("code","111");
        objectValue.put("seriesflag","0");
        String fullSql = saveCommonInsert("ma_vod_program", configMap, objectValue);
        System.out.println(fullSql);
    }
}

使用 

 @InsertProvider(type = InsertCommonSql.class,method = "saveCommonInsert")
    Integer saveObject(String tableName,Map<String,String> fieldConfig,Map<String,String> objectData);

推而广之,Update, Delete,Selete操作可以类比。要注意该方法最好使用在后台系统,并且要注意权限控制,避免出现安全问题。

好处在于,动态处理不同厂商之间的外部与内部的字段差异,减少冗余代码。(可以考虑使用策略模式)

猜你喜欢

转载自blog.csdn.net/qq_26834611/article/details/113816674