跨库迁徙指定表
跨库迁移指定表
程序如下:
package com; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; /** * 根据表名进行两个数据库的迁移 * * @author 大鹏 * */ @SuppressWarnings("unchecked") public class TableTransferTool { private static final Logger logger = Logger.getLogger(TableTransferTool.class); private static Connection connFrom = null;// 源数据源(查询数据源) private static Connection connTo = null;// 目标数据源(更新数据源) static { DOMConfigurator.configureAndWatch("config/log4j.xml"); } /** * 根据源数据库和目标数据库的配置,初始化数据源 */ public static void initDB(Properties propFrom, Properties propTo) throws ClassNotFoundException, SQLException { Class.forName("oracle.jdbc.driver.OracleDriver"); connFrom = DriverManager.getConnection(propFrom.getProperty("url"), propFrom.getProperty("username"), propFrom.getProperty("password")); connTo = DriverManager.getConnection(propTo.getProperty("url"), propTo.getProperty("username"), propTo.getProperty("password")); } /** * 从源数据库生成指定表的创建SQL */ public static List<String> createInsertSql(String tableName) throws SQLException { logger.info(tableName); List<String> resultList = new LinkedList<String>(); Statement stmt = null; ResultSet rs = null; try { stmt = connFrom.createStatement(); rs = stmt.executeQuery("SELECT * FROM " + tableName); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); String sqlHead = "INSERT INTO " + tableName + " ("; int j; for (j = 0; j < numberOfColumns; j++) { // 获取指定列的名称 sqlHead += rsmd.getColumnName(j + 1) + ", "; } sqlHead = sqlHead.substring(0, sqlHead.length() - 2); sqlHead += ") "; int i = 0; while (rs.next()) { i++; String sqlValues = "VALUES ("; for (j = 0; j < numberOfColumns; j++) { String columnValue = rs.getString(rsmd.getColumnName(j + 1)); // 获取指定列的数据库特定的类型名称 String columnTypeName = rsmd.getColumnTypeName(j + 1); if (columnValue != null) { if ("VARCHAR2".equals(columnTypeName) || "NUMBER".equals(columnTypeName) || "CHAR".equals(columnTypeName)) { columnValue = "'" + columnValue + "'"; } else if ("DATE".equals(columnTypeName)) { columnValue = columnValue.substring(0, columnValue.length() - 2); columnValue = "TO_DATE('" + columnValue + "', 'YYYY-MM-DD HH24:MI:SS')"; } } sqlValues += columnValue + ", "; } sqlValues = sqlValues.substring(0, sqlValues.length() - 2); sqlValues += ")"; logger.debug(sqlHead + sqlValues + ";"); resultList.add(sqlHead + sqlValues); } logger.info("生产库共有条数:" + i); } finally { rs.close(); stmt.close(); } return resultList; } /** * 更新目标数据库指定表的数据 */ public static void insertTable(List<String> insertSqlList, String tableName) throws SQLException { Statement stmt = null; // 关闭自动提交 connTo.setAutoCommit(false); try { stmt = connTo.createStatement(); int delNum = stmt.executeUpdate("DELETE FROM " + tableName); for (String tempSql : insertSqlList) { stmt.addBatch(tempSql); } int[] successNums = stmt.executeBatch(); connTo.commit(); connTo.setAutoCommit(true); logger.info("开发库删除原有数据条数:" + delNum); int insertNum = 0; for (int num : successNums) { insertNum += num; } logger.info("开发库新插入条数:" + insertNum); logger.info("*********************************"); } finally { stmt.close(); } } /** * 得到源数据库和目标数据库的用户名密码等相关配置 */ public static Map getProperties() throws Exception { Map resultMap = new HashMap(); // 获取数据库的配置信息 Properties config = new Properties(); config.load(ClassLoader.getSystemResourceAsStream("config/config.properties")); // 获得连接配置 Properties propFrom = DesUtil.getConfig(config, config.getProperty("DBSource")); Properties propTo = DesUtil.getConfig(config, config.getProperty("DBTarget")); String tableGroups = config.getProperty("readTableGroup"); tableGroups = config.getProperty(tableGroups); resultMap.put("DBFrom", propFrom); resultMap.put("DBTo", propTo); resultMap.put("tableGroups", tableGroups); return resultMap; } public static void closeConnection() throws SQLException { connFrom.close(); connTo.close(); } public static void main(String[] args) { try { logger.info("************程序开始*************"); Map propMap = getProperties(); Properties propFrom = (Properties) propMap.get("DBFrom"); Properties propTo = (Properties) propMap.get("DBTo"); initDB(propFrom, propTo); String tableGroups = (String) propMap.get("tableGroups"); logger.info("************更新数据库参数表:*************"); for (String tableName : tableGroups.split(",")) { logger.info("************" + tableName + "*************"); } logger.info("*********************************"); for (String tableName : tableGroups.split(",")) { List<String> insertSqlList = createInsertSql(tableName); insertTable(insertSqlList, tableName); } closeConnection(); logger.info("************程序结束*************"); } catch (Exception e) { e.printStackTrace(); } } }
config.properties文件如下:
des.isEncrypt=true key=config/key.obj readTableGroup=tableGroupA DBSource=DBFrom DBTarget=DBFrom3 ##源数据库(测试库) driver.DBFrom2= oracle.jdbc.driver.OracleDriver url.DBFrom2=jdbc:oracle:thin:@132.35.81.59:1521:essdemo username.DBFrom2=top_sysmanm password.DBFrom2=DE57F36EC8F7AC335ECA1DA0B62E0229 ##目标数据库(开发库) driver.DBTo=oracle.jdbc.driver.OracleDriver url.DBTo=jdbc:oracle:thin:@132.35.81.59:1521:essdemo username.DBTo=ucenter password.DBTo=F9EE1D8DA9829260 #组A:终端配置表 #组B:权限配置表 tableGroupA=TD_R_TERMINAL_PROPTY,TD_R_TERMINAL_COLOR,TD_R_TERMINAL_TYPE,TD_R_TERMINAL_SUBTYPE,TD_R_TERMINAL_FACTORY,TD_R_TERMINAL_BRAND,TD_R_TERMINAL_MODEL,TD_R_TERMINAL_INTPROXY,TD_R_MACHINE_TYPE tableGroupB=TD_M_FUNCRIGHT,TD_S_GUIMENU,TD_S_MODFILE tableGroupC=TD_B_PRVBRAND tableGroupD=TD_R_TERMINAL_SUBTYPE