前言:C2接口工程处理数据入库,因着不同的上游平台自家实现的cms平台有着不同的差距,产生的工单(xml数据),以及使用不同的key携带的数据入库。所以,需要消除字段差异。
------------------------------------ 免责声明: 文章中所涉及的代码不包含业务隐私,仅学术研究,分享实现思路 -----------------------------------
设计:
1.借助数据库实现外部的字段(工单中的key)与系统内部字段的对应。
2.原版使用SpringJDBCTemplate,自行封装String构建SQL语句。
3.新选型中引入了Mybatis.故而想到了一种新的实现思路。(可能MybatisPlus/SpringData JPA等有其他实现思路,目前还没想到,欢迎讨论)
关键点:
Mybatis SQL语句构建器 参考官方文档
构建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操作可以类比。要注意该方法最好使用在后台系统,并且要注意权限控制,避免出现安全问题。
好处在于,动态处理不同厂商之间的外部与内部的字段差异,减少冗余代码。(可以考虑使用策略模式)