数据拷贝/数据迁移工具类

2013/06/16 1840点热度 0人点赞 0条评论

我们在做项目的时候,数据分为公共数据,和过程数据,公共数据永远都审批以后最新的数据.过程数据是在每次申报的时候可以修改的数据.

每次申报的时候都需要将公共数据拷贝到过程表中.

/**
 * 数据拷贝处理工具类
 * 
 * @Company 中海纪元
 * @author ducc
 * @date 2012-11-4 上午10:32:40
 * @Team 智慧住建事业部
 */
@Repository
public class DataCopyDao extends EntityHibernateDao {
      
    /**数据拷贝主方法
     * @author ducc
     * @param sourceTab 源数据表
     * @param targetTab 目的数据表
     * @param sequenceId 主键生产ID
     * @param source_target_column_map 非同名字段需要进行特殊映射的字段内容
     * @param sourceQueryCondition  源数据检索条件
     * @param appendConstantColumn  需要追加的额外常量列
     * @param ignoreForginColumn   不管的外键
     * @return
     */
    @SuppressWarnings("unchecked")
    public Map<String, String> dataCopy(String sourceTab, String targetTab,
            String sequenceId, Map<String, String> source_target_column_map,
            String sourceQueryCondition,
            Map<String, String> appendConstantColumn,
            Map<String, String> ignoreForginColumn, String pk_suffix)
            throws DAOException {
        Map<String, String> hashmap = new HashMap<String, String>();
        // 查询表结构
        StringBuffer sqlString = new StringBuffer(
                "SELECT "
                        + "t.table_name \"table_name\", t.column_name \"column_name\",c.comments \"comments\",t.data_type \"data_type\",t.nullable \"nullable\""
                        + "from "
                        + "user_tab_cols t, user_col_comments c "
                        + "where"
                        + " t.column_name=c.column_name  and t.table_name= c.table_name and t.table_name = ? order by t.COLUMN_NAME");
  
        // 查询表中是否有外键关联
        StringBuffer constrainsql = new StringBuffer(
                "select "
                        + "cu.table_name || ',' ||  cu.column_name as constrain "
                        + "from "
                        + "user_cons_columns cu, user_constraints au "
                        + "where"
                        + " cu.constraint_name = au.constraint_name and au.constraint_type = 'R' and au.table_name = ?");
        List<TabColumObj> sourceTabColumObjs = this
                .getSession()
                .createSQLQuery(sqlString.toString())
                .setString(0, sourceTab)
                .setResultTransformer(
                        Transformers.aliasToBean(TabColumObj.class)).list();
        List<TabColumObj> targetTabColumObjs = this
                .getSession()
                .createSQLQuery(sqlString.toString())
                .setString(0, targetTab)
                .setResultTransformer(
                        Transformers.aliasToBean(TabColumObj.class)).list();
        List<String> lisconstrainObjs = this.getSession()
                .createSQLQuery(constrainsql.toString())
                .setString(0, sourceTab).list();
        StringBuffer sqltmp = null;
        StringBuffer target_colums = new StringBuffer();// 目的表的列
        StringBuffer source_colums = new StringBuffer();// 目的表的列
        String columname = "";// 列名
        // 循环拼接 insert into a selct * from b 类似的sql语句
        sqltmp = new StringBuffer("insert into ");
        sqltmp.append(targetTab + " (");
        for (int i = 0; i < sourceTabColumObjs.size(); i++) {
            // 按照表进行inser 语句的拼接
            for (int j = 0; j < targetTabColumObjs.size(); j++) {
                if (sourceTabColumObjs
                        .get(i)
                        .getColumn_name()
                        .equalsIgnoreCase(
                                targetTabColumObjs.get(j).getColumn_name())) {// 同名字段赋值
                    if (lisconstrainObjs.size() > 0) {
                        columname = sourceTabColumObjs.get(i).getColumn_name();
                        if (lisconstrainObjs.contains(sourceTab + ","
                                + columname)) {// 判断是否包含外键包含的话则需要拼接后缀值
                            source_colums.append(columname);
                            source_colums.append(",");
                            if (ignoreForginColumn.get(columname) != null
                                    && !"".equals(ignoreForginColumn
                                            .get(columname))) {// 如果包含外键忽略字段值则即使为外键也不需要拼接后缀
                                if (source_target_column_map
                                        .containsKey(columname)) {// 需要映射的字段进行重组
                                    if (source_target_column_map.get(columname)
                                            .equals("ignore")) {
                                        target_colums.append("''");
                                    } else {
                                        target_colums
                                                .append(source_target_column_map
                                                        .get(columname));
                                    }
                                } else {
                                    target_colums.append(columname);
                                }
                            } else {
                                if (source_target_column_map
                                        .containsKey(columname)) {// 需要映射的字段进行重组
                                    if (source_target_column_map.get(columname)
                                            .equals("ignore")) {
                                        target_colums.append("''");
                                    } else {
                                        target_colums
                                                .append(source_target_column_map
                                                        .get(columname));
                                    }
                                }else{
                                    target_colums.append(columname + " || "
                                            + pk_suffix);
                                }
                            }
                            target_colums.append(",");
                        } else {
                            source_colums.append(columname);
                            source_colums.append(",");
                            if (ignoreForginColumn.get(columname) != null
                                    && !"".equals(ignoreForginColumn
                                            .get(columname))) {// 如果包含外键忽略字段值则即使为外键也不需要拼接后缀
                                if (source_target_column_map.get(columname)
                                        .equals("ignore")) {
                                    target_colums.append("''");
                                } else {
                                    target_colums
                                            .append(source_target_column_map
                                                    .get(columname));
                                }
                            } else {
                                if (columname.equalsIgnoreCase("ID")) {// 为主键的话拼接后缀
                                    target_colums.append(columname + " || "
                                            + pk_suffix);
                                } else {
                                    if (source_target_column_map
                                            .containsKey(columname)) {// 需要映射的字段进行重组
                                        target_colums
                                                .append(source_target_column_map
                                                        .get(columname));
                                    } else {
                                        target_colums.append(columname);
                                    }
                                }
                            }
                            target_colums.append(",");
                        }
                    } else {
                        columname = sourceTabColumObjs.get(i).getColumn_name();
                        source_colums.append(columname);
                        source_colums.append(",");
                        if (columname.equalsIgnoreCase("ID")) {// 为主键的话拼接后缀
                            target_colums
                                    .append(columname + " || " + pk_suffix);
                        } else {
                            if (source_target_column_map.containsKey(columname)) {// 需要映射的字段进行重组
                                target_colums.append(source_target_column_map
                                        .get(columname));
                            } else {
                                target_colums.append(columname);
                            }
                        }
                        target_colums.append(",");
                    }
                }
            }
        }
        /*循环添加额外补充字段比如常量字段等*/
        for(String str : appendConstantColumn.keySet()){
            source_colums.append(str);
            source_colums.append(",");
            target_colums.append(appendConstantColumn.get(str));
            target_colums.append(",");
        }
        if(source_colums.length()>0){
            sqltmp.append(source_colums.substring(0, source_colums.length() - 1));
        }
        if(target_colums.length()>0){
            sqltmp.append(") select "
                    + target_colums.substring(0, target_colums.length() - 1)
                    + " from " + sourceTab);
        }
        int num = 0;
        if ("".equals(sourceQueryCondition)) {
            num = this.getSession().createSQLQuery(sqltmp.toString())
                    .executeUpdate();
        } else {
            sqltmp.append("  " + sourceQueryCondition);
            num = this.getSession().createSQLQuery(sqltmp.toString())
                    .executeUpdate();
        }
        logger.info("insert sql is :" + sqltmp.toString());
        logger.info("导入记录数" + num);
  
        return hashmap;
    }
  
    public String returnSeqId() {
        String pk_suffix = "";// 所有主键后统一体添加后缀
        pk_suffix = String.valueOf(this.getSession()
                .createSQLQuery("select COMMITTABLONGID.NEXTVAL FROM DUAL")
                .uniqueResult().toString());
        return pk_suffix;
    }
    /**
     * 删除数据表
     * @param tab
     * @param delcondition
     * @return
     * @throws DAOException
     */
    public String delTab(String tab,String delcondition) throws DAOException{
        String delsql = "delete from "+tab+delcondition;
        int num = this.getSession().createSQLQuery(delsql).executeUpdate();
        logger.info("删除记录数:"+num);
        return num+"";
    }
}

yxkong

这个人很懒,什么都没留下

文章评论