需求:

这几天项目中遇到一个问题,需要将一个mysql数据库中某些表的数据复制到另一个数据库中,这个数据库是不存在的,也需要在代码中动态创建数据库,然后将表直接复制到这个动态创建的数据库中。
网上找了很多资料,有能动态创建一个数据库的简单方式,数据复制过程绕了些湾,不过还好最后都搞定了,其实也很简单,这里记下,方便自己以后使用。
可以将事情分步去完成,第一步:搞定动态创建数据库。第二步:复制表格数据

首先连接到原始数据库,然后利用Statement对象执行创建数据库的语句就OK。然后就调用相应的sql语句进行复制就行,完整核心函数如下:

/**
	 * 利用创建表的语句和select语句解决数据迁移问题
	 * @param dataBaseNameSource 源数据库名称
	 * @param tableNameSource 源数据表名称
	 * @param dataBaseNameTarget 目标数据库名称
	 * @param tableNameTarget 目标数据表名称
	 */
	public static void copyDataFromOneTable2AnotherWithSelectAndCreateSql(String dataBaseNameSource,String tableNameSource,
			String dataBaseNameTarget,String tableNameTarget){
		conn = null;
		Statement statement= null;
		try {
			conn = getConnection();
			statement = conn.createStatement();
			//创建数据库
			statement.execute("create database "+dataBaseNameTarget);
			statement.execute("use "+dataBaseNameTarget);
			
			//创建数据表
			statement.execute("create table "+tableNameTarget+" LIKE "+dataBaseNameSource+"."+tableNameSource);
			
			//导入数据
			String copySql = "insert "+tableNameTarget +" select * from "+dataBaseNameSource+"."+tableNameSource;
			statement.execute(copySql);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

一些公共的方法

/**
	 * 获取一个连接
	 * @return
	 */
	public static Connection getConnection(){
		try {
			String url = bundle.getString("jdbc.url");
			String username = bundle.getString("jdbc.username");
			String password = bundle.getString("jdbc.password");
			Class.forName(bundle.getString("jdbc.driver"));
			Connection conn = DriverManager.getConnection(url,username,password);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 释放资源
	 * @param conn
	 * @param stmt
	 * @param rs
	 */
	public static void release(Connection conn,Statement stmt,ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			rs=null;
		}
		if(stmt!=null){
			try {
				stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

测试代码

public static void main(String[] args){	
		System.out.println("---------------开始复制----------------");
		long startTime = System.currentTimeMillis();
		
		copyDataFromOneTable2AnotherWithSelectAndCreateSql("shop_T01","user_info","shop_T07","user_info");
		
		long endTime = System.currentTimeMillis();
		System.out.println("---------------结束复制----------------");
		System.out.println("整个过程耗时:"+(endTime-startTime)+"ms");
	}

运行结果:

测试结果:

现在有一个数据库叫shop_t01,里面有一张表user_info,现在需要将这张表复制到一个新建的数据库shop_t07中

mysql把一个表的数据更新到另一个表 mysql将表移到另一个库_创建数据库


上图中可以看出,是没有shop_t07的,需要动态创建,并将user_info复制到该数据库中,执行完main函数之后

mysql把一个表的数据更新到另一个表 mysql将表移到另一个库_数据库_02