• 备份数据工具类


    备份数据工具类

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.apache.log4j.Logger;
    
    import com.jfinal.plugin.activerecord.Db;
    
    import net.wwwyibu.jfinal.config.DataLoad;
    
    /**
     * @author 马家立
     * @version 创建时间:2019年12月12日下午3:49:35
     * @Description:TODO 备份数据工具类
     */
    public class BackupsUtil {
    
        private static final Logger logger = Logger.getLogger(BackupsUtil.class);
    
        /**
         * @Title:createDBByName
         * @author:马家立
         * @date:2019年12月12日 下午3:57:55
         * @Description:TODO 根据数据库名称创建数据库
         * @param dbName--数据库名称
         * @return boolean--true:创建成功;false:创建失败
         */
        public static boolean createDBByName(String dbName) {
            logger.info("进入BackupsUtil的createDBByName方法");
            try {
                // 保存创建数据库的sql
                StringBuffer creatDBSql = new StringBuffer();
                creatDBSql.append("create database if not exists " + dbName + " ");
                // 设置字符集
                creatDBSql.append("default character set gbk ");
                // 设置字符集默认校对规则
                creatDBSql.append("default collate gbk_chinese_ci ");
                // 执行sql并接收受影响的行数
                Db.update(creatDBSql.toString());
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("BackupsUtil的createDBByName error", e);
            }
            return false;
        }
    
        /**
         * @Title:backUpDbToOneTable
         * @author:马家立
         * @date:2019年12月12日 下午5:15:27
         * @Description:TODO 备份旧数据库里面的一张表
         * @param oldDbName--需要备份的数据库
         * @param newsDbName--备份到指定的数据库,如果没有则创建新数据库
         * @param tableName--需要备份的表名
         *            void
         * @throws Exception
         */
        public static void backUpDbToOneTable(String oldDbName, String newsDbName, String tableName) throws Exception {
            logger.info("进入BackupsUtil的backUpDbToOneTable方法");
            List<String> sqlList = new ArrayList<String>();
            // 在数据库db2中建立一个和db1中一样的表table
            sqlList
                .add("create table if not exists " + newsDbName + "." + tableName + " LIKE " + oldDbName + "." + tableName);
            // 清空表中的数据
            sqlList.add("truncate table " + newsDbName + "." + tableName);
            // 将数据库db1.table1 复制到 数据库db2.table2
            sqlList.add("insert into " + newsDbName + "." + tableName + " select * from " + oldDbName + "." + tableName);
            Db.batch(sqlList, 3);
            logger.info("备份成功的表:" + tableName);
        }
        
        /**
         * @Title:findTablesByDbName
         * @author:马家立
         * @date:2019年12月12日 下午3:51:33
         * @Description:TODO 根据数据库名获取所有的表名
         * @param dbName--数据库名字
         * @return List<String>
         * @throws Exception
         */
        public static List<String> findTablesByDbName(String dbName) throws Exception {
            logger.info("进入BackupsUtil的findTablesByDbName方法");
            if (QwyUtil.isNullAndEmpty(dbName)) {
                logger.error("数据库名为空");
                return null;
            }
            String sql = "SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA= ? ";
            List<String> params = new ArrayList<String>();
            params.add(dbName);
            // 查询出所有的表名
            params = Db.query(sql, params.toArray());
            return params;
        }
    
        /**
         * @Title:backUpDbTable
         * @author:马家立
         * @date:2019年12月13日 下午2:03:47
         * @Description:TODO 把旧数据库的表数据备份到新数据库里面
         * @param oldDbName--旧数据库名称
         * @param newsDbName--新数据库名称
         * @param tables--旧数据库的表数据集合
         * @return Map<String,String>{code:ok或者err;msg:错误信息,如果为空则无错误信息,count:成功的数量}
         */
        public static Map<String, String> backUpDbTable(String oldDbName, String newsDbName, List<String> tables) {
            logger.info("进入BackupsUtil的backUpDbTable方法");
            Map<String, String> resultMap = new HashMap<String, String>();
            try {
                resultMap.put("code", "ok");
                if (QwyUtil.isNullAndEmpty(oldDbName)) {
                    logger.error("旧数据库名为空");
                    resultMap.put("code", "err");
                    resultMap.put("msg", "旧数据库名为空");
                    return resultMap;
                }
                if (QwyUtil.isNullAndEmpty(newsDbName)) {
                    logger.error("新数据库名为空");
                    resultMap.put("code", "err");
                    resultMap.put("msg", "新数据库名为空");
                    return resultMap;
                }
                // 根据数据库名称创建数据库
                boolean iscreateDBOk = createDBByName(newsDbName);
                if (!iscreateDBOk) {
                    logger.error("创建新数据库失败");
                    resultMap.put("code", "err");
                    resultMap.put("msg", "创建新数据库失败");
                    return resultMap;
                }
                if (QwyUtil.isNullAndEmpty(tables)) {
                    logger.info("需要备份的表为空");
                    resultMap.put("code", "err");
                    resultMap.put("msg", "需要备份的表为空");
                    return resultMap;
                }
                // 表数量
                int counts = 0;
                for (String table : tables) {
                    // 判断字符串中是否包含数字
                    // if (hasDigit(table)) {
                    // continue;
                    // }
                    backUpDbToOneTable(oldDbName, newsDbName, table);
                    System.out.println("备份成功的表:" + table);
                    logger.info("备份成功的表:" + table);
                    counts++;
                }
                resultMap.put("counts", counts + "");
            } catch (Exception e) {
                resultMap.put("code", "err");
                resultMap.put("msg", "备份数据表方法异常");
                e.printStackTrace();
                logger.error("备份数据表方法异常", e);
            }
            return resultMap;
        }
        
        /**
         * @Title:findToTableBegin
         * @author:马家立
         * @date:2019年12月13日 下午2:20:02
         * @Description:TODO 在数据库中查找以XXX字符串开头的表
         * @param dbName--数据库名
         * @param prefixTable--以XXX开头的字符串
         * @param flag--true:以XXX开头;false:不以XXX开头
         * @return List<String>--null:则是参数为空或者异常
         * @throws Exception
         */
        public static List<String> findToTableBegin(String dbName, String prefixTable, boolean flag)
            throws Exception {
            logger.info("进入BackupsUtil的findToTableBegin方法");
            if (QwyUtil.isNullAndEmpty(dbName)) {
                logger.error("旧数据库名为空");
                return null;
            }
            if (QwyUtil.isNullAndEmpty(prefixTable)) {
                logger.error("参数前缀为空");
                return null;
            }
            // 根据数据库名获取所有的表名
            List<String> allTables = findTablesByDbName(dbName);
            if (QwyUtil.isNullAndEmpty(allTables)) {
                logger.error("数据库下无表存在!");
                return null;
            }
            // 需要备份的表
            List<String> newstables = new ArrayList<String>();
            // 遍历添加所需备份的表
            for (String table : allTables) {
                if (flag) {
                    // 以它开头的表
                    if (table.startsWith(prefixTable)) {
                        newstables.add(table);
                    }
                } else {
                    // 不以它开头的表
                    if (!table.startsWith(prefixTable)) {
                        newstables.add(table);
                    }
                }
            }
            return newstables;
        }
        
        /**
         * @Title:findToTableEnd
         * @author:马家立
         * @date:2019年12月13日 下午2:21:02
         * @Description:TODO 在数据库中查找以XXX字符串结尾的表
         * @param dbName--数据库名
         * @param suffixTable--以XXX结尾的字符串
         * @param flag--true:以XXX结尾;false:不以XXX结尾
         * @return List<String>--null:则是参数为空或者异常
         * @throws Exception
         */
        public static List<String> findToTableEnd(String dbName, String suffixTable, boolean flag) throws Exception {
            logger.info("进入BackupsUtil的findToTableEnd方法");
            if (QwyUtil.isNullAndEmpty(dbName)) {
                logger.error("旧数据库名为空");
                return null;
            }
            if (QwyUtil.isNullAndEmpty(suffixTable)) {
                logger.error("参数后缀为空");
                return null;
            }
            // 根据数据库名获取所有的表名
            List<String> allTables = findTablesByDbName(dbName);
            if (QwyUtil.isNullAndEmpty(allTables)) {
                logger.error("数据库下无表存在!");
                return null;
            }
            // 需要备份的表
            List<String> newstables = new ArrayList<String>();
            // 遍历添加所需备份的表
            for (String table : allTables) {
                if (flag) {
                    // 以它结尾的表
                    if (table.endsWith(suffixTable)) {
                        newstables.add(table);
                    }
                } else {
                    // 不以它结尾的表
                    if (!table.endsWith(suffixTable)) {
                        newstables.add(table);
                    }
                }
            }
            return newstables;
        }
    
        /**
         * @Title:findToTableContain
         * @author:马家立
         * @date:2019年12月13日 下午2:23:02
         * @Description:TODO 在数据库中查找包含xxx字符串的表
         * @param dbName--数据库名
         * @param containTable--包含XXX的字符串
         * @param flag--true:数据库包含XXX的表名,false:数据库不包含XXX的表名
         * @return List<String>--null:则是参数为空或者异常
         * @throws Exception
         */
        public static List<String> findToTableContain(String dbName, String containTable, boolean flag) throws Exception {
            logger.info("进入BackupsUtil的findToTableContain方法");
            if (QwyUtil.isNullAndEmpty(dbName)) {
                logger.error("旧数据库名为空");
                return null;
            }
            if (QwyUtil.isNullAndEmpty(containTable)) {
                logger.error("参数包含为空");
                return null;
            }
            // 根据数据库名获取所有的表名
            List<String> allTables = findTablesByDbName(dbName);
            if (QwyUtil.isNullAndEmpty(allTables)) {
                logger.error("数据库下无表存在!");
                return null;
            }
            // 需要备份的表
            List<String> newstables = new ArrayList<String>();
            // 遍历添加所需备份的表
            for (String table : allTables) {
                if (flag) {
                    // 包含什么的表
                    if (-1 != table.indexOf(containTable)) {
                        newstables.add(table);
                    }
                } else {
                    // 不包含什么的表
                    if (-1 == table.indexOf(containTable)) {
                        newstables.add(table);
                    }
                }
            }
            return newstables;
        }
    
    
        /**
         * @Title:hasDigit
         * @author:马家立
         * @date:2019年12月12日 下午3:59:47
         * @Description:TODO 判断字符串中是否包含数字
         * @param str--字符串
         * @return boolean--true:包含数字,false:不包含数字
         * @throws Exception
         */
        public static boolean hasDigit(String str) throws Exception {
            logger.info("进入BackupsUtil的hasDigit方法");
            boolean flag = false;
            Pattern p = Pattern.compile(".*\d+.*");
            Matcher m = p.matcher(str);
            if (m.matches()) {
                flag = true;
            }
            return flag;
        }
    
        public static void main(String[] args) {
            try {
                DataLoad.startOA();
                String oldDbName = "schooloa_djzx_20190128";
                String newsDbName = "schooloa_djzx_20190128_tabu";
                // /根据数据库名获取所有的表名
                List<String> tables = findTablesByDbName(oldDbName);
                System.out.println("库中表集合数量为:" + tables.size());
                // 待备份的表集合
                List<String> bfTables = new ArrayList<String>();
                for (String table : tables) {
                    if (table.contains("2016") || table.contains("2017") || table.contains("2018") || table.contains("2019")
                        || table.contains("bk") || table.contains("bf") || table.contains("copy")) {
                        continue;
                    } else {
                        bfTables.add(table);
                        System.out.println("待备份的表名:" + table);
                    }
                }
                System.out.println("待备份的表集合数量为:" + bfTables.size());
                // 把旧数据库的表数据备份到新数据库里面
                Map<String, String> resultMap = backUpDbTable(oldDbName, newsDbName, bfTables);
                System.out.println(resultMap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    WebService
    jdbc访问数据库
    ssm文件配置
    ssh文件配置
    配置数据源的三种方式和sql心跳的配置
    SQL in与exists
    套接字
    oracle 方向及资料
    ORACLE恢复数据
    SQL时间戳的使用
  • 原文地址:https://www.cnblogs.com/mjtabu/p/12035077.html
Copyright © 2020-2023  润新知