JDBC连接多个库进行数据操作(常用于数据迁移)

2023-11-01

package turnOverClass;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBUtils {
    private static String url = "jdbc:mysql://数据库?characterEncoding=UTF-8";
    private static String user = "用户名";
    private static String password = "密码";

    private static String localUrl = "jdbc:mysql://数据库?useOldAliasMetadataBehavior=true";
    private static String localUser = "用户名";
    private static String localPwd = "密码";
    

    public static Connection conn;
    public static Statement stat;
    public static ResultSet rs;

    // 连接
    public static Connection getConnection(){

        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 连接数据库
            return DriverManager.getConnection(url,user,password);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 连接
    public static Connection getLocalConn(){

        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 连接数据库
            return DriverManager.getConnection(localUrl,localUser,localPwd);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static ResultSet query(String sql, Connection con){
        Statement st ;
        ResultSet rs  = null;
        try {
            st = con.createStatement();
            // 运行SQL查询语句
            rs =  st.executeQuery(sql);
        } catch(Exception e) {
            System.err.println("Exception: " + e.getMessage());
        }
        return rs;
    }

    public static List<Map<String, Object>> read(String sql, Connection conn) {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            ResultSetMetaData rsmd = ps.getMetaData();

            // 取得结果集列数
            int columnCount = rsmd.getColumnCount();

            // 构造泛型结果集
            List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();
            Map<String, Object> data = null;

            // 循环结果集
            while (rs.next()) {
                data = new HashMap<String, Object>();
                // 每循环一条将列名和列值存入Map
                for (int i = 1; i < columnCount; i++) {
                    data.put(rsmd.getColumnLabel(i), rs.getObject(rsmd
                            .getColumnLabel(i)));
                }
                // 将整条数据的Map存入到List中
                datas.add(data);
            }
            return datas;
        } catch (Exception e) {
            throw new RuntimeException();
        } finally {
            DBUtils.close();
        }
    }

    public static Integer readInt(String sql, Connection conn) {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            ResultSetMetaData rsmd = ps.getMetaData();

            Integer i = null;
            // 循环结果集
            while (rs.next()) {
                // 每循环一条将列名和列值存入Map
                   i = (Integer) rs.getObject(rsmd.getColumnLabel(1));
                }
          
            return i;
        } catch (Exception e) {
            throw new RuntimeException();
        } finally {
            DBUtils.close();
        }
    }
    
    public static void close(){
        try {
            if (rs != null){
                rs.close();
                rs = null;
            }
            if (stat != null){
                stat.close();
                stat=null;
            }
            if (conn != null){
                conn.close();
                conn=null;
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 把ResultSet的结果放到java对象中
     *
     * @param <T>
     * @param rs
     *            ResultSet
     * @param obj
     *            java类的class
     * @return
     */
    public static <T> ArrayList<T> putResult(ResultSet rs, Class<T> obj) {
        try {
            ArrayList<T> arrayList = new ArrayList<T>();
            ResultSetMetaData metaData = rs.getMetaData();
            /**
             * 获取总列数
             */
            int count = metaData.getColumnCount();
            while (rs.next()) {
                /**
                 * 创建对象实例
                 */
                T newInstance = obj.newInstance();
                for (int i = 1; i <= count; i++) {
                    /**
                     * 给对象的某个属性赋值
                     */
                    String name = metaData.getColumnName(i).toLowerCase();
                    name = toJavaField(name);// 改变列名格式成java命名格式
                    String substring = name.substring(0, 1);// 首字母大写
                    String replace = name.replaceFirst(substring, substring.toUpperCase());
                    Class<?> type = obj.getDeclaredField(name).getType();// 获取字段类型
                    Method method = obj.getMethod("set" + replace, type);
                    /**
                     * 判断读取数据的类型
                     */
                    if(type.isAssignableFrom(String.class)){
                        method.invoke(newInstance, rs.getString(i));
                    }else if(type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)){
                        method.invoke(newInstance, rs.getInt(i));
                    }else if(type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)){
                        method.invoke(newInstance, rs.getBoolean(i));
                    }else if(type.isAssignableFrom(Date.class)){
                        method.invoke(newInstance, rs.getDate(i));
                    }
                }
                arrayList.add(newInstance);
            }
            return arrayList;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
    /**
     * 数据库命名格式转java命名格式
     *
     * @param str
     *            数据库字段名
     * @return java字段名
     */
    public static String toJavaField(String str) {

        String[] split = str.split("_");
        StringBuilder builder = new StringBuilder();
        builder.append(split[0]);// 拼接第一个字符

        // 如果数组不止一个单词
        if (split.length > 1) {
            for (int i = 1; i < split.length; i++) {
                // 去掉下划线,首字母变为大写
                String string = split[i];
                String substring = string.substring(0, 1);
                split[i] = string.replaceFirst(substring, substring.toUpperCase());
                builder.append(split[i]);
            }
        }
        return builder.toString();
    }

}
package turnOverClass;




import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.List;
/**
 * 先建表
 * @author ywh
 *
 */


public class DataMigration {


	/**
	 * 获取当前表数据
	 */
    private static void getSeriesClassVersion() {
        String sql = "select sclass.series_class_id ,"
        		+ "m.version as version_code,sclass.create_id,"
        		+ "sclass.create_time,"
        		+ "sclass.update_id,"
        		+ "sclass.update_time "
        		+ "from series_class sclass "
        		+ "left join menu m on m.id = sclass.menu_id where sclass.exist = '0'  ";
        Connection localCon = DBUtils.getLocalConn();
        List<TtsSeriesClassVersion> ttsSeriesClassVersions = DBUtils.putResult(DBUtils.query(sql, localCon), TtsSeriesClassVersion.class);
        DBUtils.close();
        Connection conn = DBUtils.getConnection();
        
        for (TtsSeriesClassVersion ttsSeriesClassVersion : ttsSeriesClassVersions) {
            sql = "select version_id from tts_version where version_code='"+ttsSeriesClassVersion.getVersionCode()+"'";
            //version查出来有些为null,为null的显示为-1,导完数据统一将-1改为null
            ttsSeriesClassVersion.setVersionId(DBUtils.readInt(sql,conn)==null?-1:DBUtils.readInt(sql,conn));
            insertTtsSeriesClassVersion(ttsSeriesClassVersion, localCon);
        }
        DBUtils.close();
        System.out.println("数据插入完成");
    }


    
    /**
     * 插入到tts_series_class_version
     * @param tcv
     * @param conn
     * @return
     */
    private static int insertTtsSeriesClassVersion(TtsSeriesClassVersion tcv, Connection conn) {
    	System.out.println(tcv.getSeriesClassId());
        int i = 0;
        //表中create_id,update_id均为空,插入数据后,均为零,因此不予插入
        String sql = "INSERT INTO tts_series_class_version ( series_class_id, version_id, version_code, create_time, update_time) VALUES ( ?, ?, ?, ?, ?)";
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        PreparedStatement pstmt;
        try {
        	
            pstmt = (PreparedStatement) conn.prepareStatement(sql);
            pstmt.setInt(1, tcv.getSeriesClassId());
            pstmt.setInt(2, tcv.getVersionId());
            pstmt.setString(3, tcv.getVersionCode());
            pstmt.setString(4, df.format(tcv.getCreateTime()));
            pstmt.setString(5, df.format(tcv.getUpdateTime()));
            i = pstmt.executeUpdate();
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }
    


   /**
    *获取已删除数据 
    */
    private static void getSeriesClassVersionHis() {
        String sql = "select sclass.series_class_id ,"
        		+ "m.version as version_code,sclass.create_id,"
        		+ "sclass.create_time,"
        		+ "sclass.update_id,"
        		+ "sclass.update_time "
        		+ "from series_class sclass "
        		+ "left join menu m on m.id = sclass.menu_id where sclass.exist = '1'  ";
        Connection localCon = DBUtils.getLocalConn();
        List<TtsSeriesClassVersion> ttsSeriesClassVersions = DBUtils.putResult(DBUtils.query(sql, localCon), TtsSeriesClassVersion.class);
        DBUtils.close();
        Connection conn = DBUtils.getConnection();
        
        for (TtsSeriesClassVersion ttsSeriesClassVersion : ttsSeriesClassVersions) {
            sql = "select version_id from tts_version where version_code='"+ttsSeriesClassVersion.getVersionCode()+"'";
            //version查出来有些为null,为null的显示为-1,导完数据统一将-1改为null
            ttsSeriesClassVersion.setVersionId(DBUtils.readInt(sql,conn)==null?-1:DBUtils.readInt(sql,conn));
            insertTtsSeriesClassVersionHis(ttsSeriesClassVersion, localCon);
        }
        DBUtils.close();
        System.out.println("数据插入完成");
    }


    
    
    private static int insertTtsSeriesClassVersionHis(TtsSeriesClassVersion tcv, Connection conn) {
    	System.out.println(tcv.getSeriesClassId());
        int i = 0;
        //表中create_id,update_id均为空,插入数据后,均为零,因此不予插入
        String sql = "INSERT INTO tts_series_class_version_his ( series_class_id, version_id, version_code, create_time, update_time) VALUES ( ?, ?, ?, ?, ?)";
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        PreparedStatement pstmt;
        try {
        	
            pstmt = (PreparedStatement) conn.prepareStatement(sql);
            pstmt.setInt(1, tcv.getSeriesClassId());
            pstmt.setInt(2, tcv.getVersionId());
            pstmt.setString(3, tcv.getVersionCode());
            pstmt.setString(4, df.format(tcv.getCreateTime()));
            pstmt.setString(5, df.format(tcv.getUpdateTime()));
            i = pstmt.executeUpdate();
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }
    
    
    public static void main(String[] args) {
    	//迁移到tts_series_class_version
    	//getSeriesClassVersion();
    	//迁移到tts_series_class_version_his
    	getSeriesClassVersionHis();


    }


}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC连接多个库进行数据操作(常用于数据迁移) 的相关文章

  • CDH安装常见问题

    为什么80 的码农都做不了架构师 gt gt gt 1 Intall Parcel 的时候 hash verification failure 首先使用命令以下命令查看其hash值 sha1sum CDH 5 12 0 1 cdh5 12
  • REW声学测试(一):麦克风校准

    更多文章请关注微信公众号 智能音箱设计 最近按照Room EQ Wizard 软件的推荐 购买了其推荐的麦克风 miniDSP UMIK 1 这款麦克风的优点在于它是一款USB麦克风 而非卡侬头麦克风 也就是说 它可以直插电脑 而不需要外接
  • MACOS 如何使用 MSSQL(SQL server)?

    文章目录 一 如何启动SQL Server 2012 数据库服务 记录运行情况和处理方法 二 用界面工具创建自己的数据库 名称自定 试着用界面工具在该数据库 一 如何启动SQL Server 2012 数据库服务 记录运行情况和处理方法 由
  • 数据分析岗位需求分析

    本文爬取了某招聘网站数据分析职位的相关数据 基于SQL和python分析数据分析的岗位需求 了解各个行业对数据分析岗位的招聘需求分布 增进对职业前景的了解 1 爬取数据 首先 基于python的requests get json爬取某招聘网
  • 梦想世界2014年5月29日服务器维护公告,《新梦想世界》8月6日更新:药包系统上线 服务器开放等级加快...

    梦想逍遥侠 带你仗剑走天涯 在2020 ChinaJoy结束之后 多益网络于本周四对 新梦想世界 的游戏内容进行了一波内容更新 此次的更新中最主要内容就是一直受玩家们期待的新收纳系统 并且官方还改进了经验果的使用规则 加快开放服务器等级的进
  • [OpenWRT系列]一、LUCI开发之luci.http.formvalue获取表单数据

    OpenWRT系列 一 LUCI开发之luci http formvalue获取表单数据 1 前言 2 luci http formvalue 3 实现思路 4 程序代码 1 前言 开发项目过程中需要获取页面的按钮点击动作并且通过传入的值进
  • flask多线程下,连接泄露的bug【转载】

    flask多线程下 连接泄露的bug 架构图 如图所示 底层使用mysql web服务使用flask SqlAlchemy的连接池 复用连接 减少创建销毁开销 逻辑层代码使用线程池 异步IO操作 如果要异步cpu操作 可以很方便改成进程池
  • 魔兽实名好友怎么显示服务器,跨服实名组队正式开启 可邀请实名好友

    跨服实名组队正式开启 可邀请实名好友 新浪游戏 2011 10 12 10 22 国服4 2 2版本已经开放 而其中有一项大家都比较关心的功能也悄悄的开放了 那就是跨服实名好友组队系统 当你挣扎在艾泽拉斯最惨无人道副本的深处时 身边能有几个
  • Flink原理与调优

    Flink提交流程 Yarn Per Job 1 client运行脚本提交命令 2 CliFrontend实例化CliFrontendParser进行参数解析 3 CliFrontend实例化YarnJobClusterExecutor并创
  • 【EI会议】2022年国际土木与海洋工程联合会议(JCCME 2022)

    2022年国际土木与海洋工程联合会议 JCCME 2022 重要信息 会议网址 www jccme org 会议邮箱 jccme iased org 会议时间 2022年10月21 23日 召开地点 中国 上海 截稿时间 2022年9月15
  • 动态网站开发学习笔记01:网页开发基础

    目录 一 HTML基础 一 HTML简介 1 HTML 2 HTML语言的基本格式 3 声明 4 html标签 5 head标签 6 body标签 7 编写第一个网页 8 关于编写HTML文件的工具 9 HTML标签概述 1 单标签 2 双
  • 微信小程序实现原生导航栏和自定义头部导航栏

    原生导航栏 可以在 app json 的 window 属性中或页面的 JSON 文件中设置 navigationBarTitleText 导航栏标题内容 navigationBarTextStyle 导航栏标题颜色 navigationB
  • AD修改铜皮的透明度

    AD软件有时候铺完铜皮后 无法知道焊盘的位置 这样在打孔时候 可能会打到焊盘上 这时后可以通过修改铜皮的透明度来解决这个问题 方法 1 快捷键L 找到Transparency 然后选择Polygons 拖动进度条 修改透明比例 完成效果如下
  • PCIe热插拔:通知试热插拔&暴力热插拔

    PCIE热插拔 某些特殊的应用场合可能要求PCIe设备能够以高可靠性持续不间断运行 为此 PCIe总线采用热插拔 Hot Plug 和热切换 Hot Swap 技术 来实现不关闭系统电源的情况下更换PCIe卡设备 热切换和热插拔的主要区别是
  • TortoiseGit和Git如何使用相同的密钥

    Git密钥配置 TortoiseGit密钥配置 TortoiseGit和Git密钥配置图文教程 TortoiseGit和Git如何使用相同的密钥 使用 TortoiseGit 的 PuTTYgen 生成的私钥和使用Git的 ssh keyg
  • GVIM配置文件

    给大家分享一下我的vim的配置文件 关闭兼容模式 set nocompatible 模仿快捷键 如Ctrl A全选 Ctrl C复制等 source VIMRUNTIME vimrc example vim source VIMRUNTIM
  • 【c++】指针

    目录 1 1指针的基本概念 1 2指针变量的定义和使用 1 3指针所占内存空间 1 4空指针和野指针 1 5const修饰指针 1 6指针和数组 1 7指针和函数 1 8指针 数组 函数 1 1指针的基本概念 作用 可以通过指针间接访问内存
  • 使用Selenium和Python自动预订车票

    在本文中 我们将探讨如何使用Selenium和Python自动预订车票 我们将以12306 cn网站为例 演示自动化预订车票的过程 通过阅读本文 您将更好地了解如何使用Selenium与网页进行交互 准备工作 首先 我们需要安装Seleni
  • 信息学奥赛一本通(C++版)

    信息学奥赛一本通 C 版 总目录 1 信息学奥赛一本通 C 版 刷题 记录 2 信息学奥赛一本通 C 版 第一部分 C 语言 第一章 C 语言入门 3 信息学奥赛一本通 C 版 第一部分 C 语言 第二章 顺序结构程序设计 4 信息学奥赛一
  • sqlmap -u -r参数的使用

    SQLMAP基本使用实例 u参数 直接输入目标URL 命令实例 sqlmap u http 127 0 0 1 sql Less 1 id 1 验证过程 判断可注入的参数 判断可以用哪种SQL注入技术来注入 识别出所有存在的注入类型 尝试去

随机推荐

  • hbase compaction

    minor compaction 删除TTL过期数据 major compaction 被删除的数据 打了Delete标记的数据 TTL过期数据 版本号超过设定版本号的数据 Minor Compaction 指选取一些小的 相邻的HFile
  • 20个解决日常问题的Python代码片段

    在本文中 将分享20 个 Python 代码片段 以帮助你应对日常编程挑战 你可能已经知道其中一些片段 但有些其他片段对你来说可能是新的 赶紧使用这些有用的 Python 代码片段提升你的编程技能吧 1 简单的 HTTP Web 服务器 简
  • CSS 布局(一)

    到目前为止 我们已经了解了CSS基础知识 如何设置文本样式 以及如何设置和操作内容所在的框 现在是时候看看如何根据视口以及彼此之间的关系正确地安排你的盒子了 我们已经介绍了必要的先决条件 所以让我们深入了解CSS布局 查看各种功能 不同的显
  • 接上一篇 对多个模型环形旋转进行优化 指定旋转位置

    using System Collections using System Collections Generic using UnityEngine using DG Tweening public class ModelAnimal M
  • Vue全局日期格式化(过滤器式)

    设置 main js文件下 全局日期时间过滤器 Vue filter dateFormat function v let date new Date v if Number isNaN Number date date new Date l
  • 问答专场

    作为一名产品经理 或许你刚刚进入某个领域 或许你在为管理头疼 或许你在为创业辗转 或许你还不知如何拥抱移动互联网 那么 我们来聊聊吧 本期PMCAFF 问答专场 邀请到阿里巴巴无线创始人 费杰 擅长领域 创业 管理 电商 供应链 移动互联网
  • javascript--BOM(browser object model)五大对象

    浏览器对象模型 作用 访问 控制 修改浏览器 与浏览器进行交互 打开新的窗口 回退历史记录 获取url BOM与的DOM区别 JS通过BOM与浏览器进行交互 BOM的window对象包含了document对象 document对象是DOM的
  • JavaScript教程-空值合并运算符 ‘??‘优先级,循环,while,for,for...of..,for..in,do...while循环,跳出循环,break,continue

    空值合并运算符 最近新增的特性 这是一个最近添加到 JavaScript 的特性 旧式浏览器可能需要 polyfills 空值合并运算符 nullish coalescing operator 的写法为两个问号 由于它对待 null 和 u
  • 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻

    前言 深入理解计算机系统 官网 http csapp cs cmu edu 3e labs html 该篇文章是实验二Bomb Lab的Writeup机翻 原文 http csapp cs cmu edu 3e bomblab pdf 阅读
  • 各种开源协议对比

    开源协议允许对比 Name Commercial use Modification Distribution Private use Patent use BSD Zero Clause License Academic Free Lice
  • 史上最详细mybatis与spring整合教程

    点击上方 田守枝的技术博客 关注我 mybatis本身使用比较灵活 和spring整合也有多种方式 本文一网打尽mybatis与spring整合所有方式 让你彻底掌握mybatis与spring整合原理 堪称史上最全面的mybatis与sp
  • java试题

    题目 下列程序会输出什么结果 E class Super public int getLength return 4 public class Sub extends Super public long getLength return 5
  • STM32F207 USART+DMA代码+个人理解

    环境 STM32F207 目的USART通过DMA通信 DMA初步理解 1 之前发送数据的方式 数据放到串口数据寄存器里面 等待一个字节发送完成 重复第一二步 看到我们平时的方式我们就会有个想法 如果我们发送五百个字节 我们就需要让CPU在
  • zookeeper源码(01)集群启动

    本文介绍一下zookeeper 3 5 7集群安装 解压安装 tar zxf apache zookeeper 3 5 7 bin tar gz 创建数据 日志目录 mv apache zookeeper 3 5 7 bin app zoo
  • shell 中函数function()

    Shell函数类似于Shell脚本 里面存放了一系列的指令 不过Shell的函数存在于内存 而不是硬盘文件 所以速度很快 另外 Shell还能对函数进行预处理 所以函数的启动比脚本更快 1 函数定义 function 函数名 语句 retu
  • 【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

    目录 一 实验目的 二 实验要求 三 实验内容与结果 四 实验心得 一 实验目的 1 掌握求数值导数和数值积分的方法 2 掌握代数方程数值求解的方法 3 掌握常微分方程数值求解的方法 二 实验要求 1 根据实验内容 编写相应的MATLAB程
  • Hadoop学习——MapReduce的组件及简单API(一)

    上一篇参考Hadoop学习 MapReduce的简单介绍及执行步骤 MapReduce的组件 组件是实现MapReduce的真正干活的东西 即我们的业务逻辑 就是要写到这里边来的 MapReduce共有4个组件 一 Mapper组件 介绍
  • Neo4j学习笔记(二) SpringMVC中使用Spring Data Neo4j

    目录 一 pom xml中添加spring data neo4j依赖 二 数据库连接配置文件neo4j properties 三 日志打开Cypher的DEBUG信息 便于调试 四 JAVA代码 4 1 Neo4jConfiguration
  • 百度文库副业项目,适合新手,后期躺赚

    前几天帮朋友找资料 费尽周折 最后在百度文库中找到了 但需要付费 百度文库 我之前有关注过 但没真正把它作为项目来操作 通过这几天的研究 发现做百度文库还蛮赚钱的 有的文库资料是几年前上传的 现在还在赚钱 这真是个躺赚的好项目 那么 下面浩
  • JDBC连接多个库进行数据操作(常用于数据迁移)

    package turnOverClass import java lang reflect Method import java sql Connection import java sql DriverManager import ja