帐套管理,新建数据库,拷贝表结构和相应数据

简介: 最近做了一个帐套管理的一个功能,需要进行帐套初始化,在初始化的过程中,需要新建一个数据库,同时把上一个帐套的数据库里面的表的表结构全部拿出,在新数据库中全部新建,同时,有些信息在前一个帐套中是需要保留的,如一些基本信息和账目信息,这个时候就会出现表数据的拷贝和更新操作了。

最近做了一个帐套管理的一个功能,需要进行帐套初始化,在初始化的过程中,需要新建一个数据库,同时把上一个帐套的数据库里面的表的表结构全部拿出,在新数据库中全部新建,同时,有些信息在前一个帐套中是需要保留的,如一些基本信息和账目信息,这个时候就会出现表数据的拷贝和更新操作了。逻辑很简单,就是先获取到这些建数据库和建表的语句,以及更新和插入的语句,然后再按照一定的逻辑有顺序的执行它们。在做了这一系列的操作之后就是更改配置文件了,那是属于xml的操作,就不赘述了!

以下代码中用到的db是一个对Spring封装的jdbc的封装

 

主逻辑

List<String> tableNames = this.getTableNames(db);
			List<String> sqls = this.getCreateTableSql(db, dataBaseName, tableNames);
			String createDdSql = "create database "+dataBaseName;
			sqls.add(0, createDdSql);
			sqls.add(0, "set character_set_results=gbk;");
			sqls.add(0, "set character_set_connection=gbk;");
			sqls.add(0, "set character_set_client=gbk;");
			List<String> insertTableNames = getInsertTableNames();
			List<String> insertSqls = this.getInsertSql(dataBaseName, insertTableNames, db);
			List<String> updateSqls = this.getUpdateSql(dataBaseName, db, cover);
			sqls.addAll(insertSqls);
			sqls.addAll(updateSqls);
			this.executeSql(db, sqls);
 

 

/**
	 * 判断数据库是否存在,如果已经存在,就表示该帐套已经初始化了,需要给用户一个提示
	 * @param db
	 * @param dbName 数据库名
	 * @return
	 */
	public static boolean existDatabase(DB db, String dbName) {
		boolean flag = false;
		String sql = "show databases";
		SqlRowSet srs = db.executeQuery(sql);
		while (srs.next()) {
			String databaseName = srs.getString(1);
			if (databaseName.equals(dbName)) {
				flag = true;
				break;
			}
		}
		return flag;
	}

 

/**
	 * 获取当前数据库的名字,有了当前数据库的名字可以更精确的从当前数据库中拿数据
	 * @param tableName
	 * @param db
	 * @return
	 */
	public static String getDatabaseName(String tableName, DB db) {
		String sql = "select * from "+tableName+" limit 0,1";
		SqlRowSet srs = db.executeQuery(sql);
		return srs.getMetaData().getCatalogName(1);
	}

 

/**
	 * 获得所有的表名
	 * @param db
	 * @return
	 */
	private List<String> getTableNames(DB db) {
		List<String> tableNames = new ArrayList<String>();
		String sql = "show tables";
		SqlRowSet srs = db.executeQuery(sql);
		while (srs.next())
			tableNames.add(srs.getString(1));
		return tableNames;
	}

 

 

/**
	 * 获取所有的需要插入数据的表
	 * 
	 * @return
	 */
	private List<String> getInsertTableNames() {
		List<String> tableNames = new ArrayList<String>();
		String tables = "t1,t2,t3";
		String[] tnames = tables.split(",");
		for (String tableName:tnames)
			tableNames.add(tableName);
		return tableNames;
	}

 

 

/**
	 * 获取建表语句
	 * @param dbName新建数据库的名称
	 * @param tableName 表的名字
	 * @param db
	 * @return
	 */
	public static String createTable(String dbName,String tableName,DB db) {
		StringBuffer buffer = new StringBuffer("create table ").append(dbName+"."+tableName).append("(");
		String sql = "select * from " + tableName + " limit 0,1";
		SqlRowSet srs = db.executeQuery(sql);
		SqlRowSetMetaData metaData = srs.getMetaData();
		for (int i=0;i<metaData.getColumnCount();i++) {
			String columnName = metaData.getColumnName((i+1));//字段名
			String columnType = metaData.getColumnTypeName((i+1));//字段类型
			int displaySize = metaData.getColumnDisplaySize((i+1));//长度
			int precision = metaData.getPrecision((i+1));//整数位
			int scale = metaData.getScale((i+1));//小数位
			if (displaySize > 300)
				columnType = "text";
			if (columnName.equals("s_id")) {
				buffer.append("s_id int primary key,");
			} else if (scale > 0 && "decimal".equalsIgnoreCase(columnType)) {
				buffer.append(columnName+" "+columnType+"("+precision+","+scale+"),");
			} else if ("double".equalsIgnoreCase(columnType) || columnType.toLowerCase().startsWith("date") || columnType.toLowerCase().startsWith("int")) {
				buffer.append(columnName+" "+columnType+",");
			} else {
				buffer.append(columnName+" "+columnType+"("+displaySize+"),");
			}
//			System.out.println("columnName:"+columnName+",      columnType:"+columnType);
		}
		buffer.deleteCharAt(buffer.length()-1);
		buffer.append(");");
		return buffer.toString();
	}

 

/**
	 * 通过表名获取一系列的建表语句
	 * @param db
	 * @param tableNames
	 * @return
	 */
	private List<String> getCreateTableSql(DB db, String dbName, List<String> tableNames) {
		List<String> createSqls = new ArrayList<String>();
		for (String tableName:tableNames) {
			createSqls.add(Util.createTable(dbName, tableName, db));
		}
		return createSqls;
	}

 

/**
	 * 获取复制数据的语句
	 * @param tableNames
	 * @param db
	 * @return
	 */
	private List<String> getInsertSql(String databaseName,List<String> tableNames, DB db) {
		List<String> sqls = new ArrayList<String>();
		String dbName = Util.getDatabaseName("t_area", db);
		sqls.add("insert into "+databaseName+".t_auto_increment select * from "+dbName+".t_auto_increment;");
//		sqls.add("update t_auto_increment set current_value = 1;");
		for (String tableName:tableNames) {
			String tempName = dbName+"."+tableName;
			sqls.add("insert into "+databaseName+"."+tableName+" select * from "+tempName+";");
		}
		for (String sql:sqls)
			System.out.println(sql);
		return sqls;
	}

 

 

 

/**
	 * 执行SQL语句
	 * @param db
	 * @param sqls
	 */
	private void executeSql(DB db, List<String> sqls) {
		for (String sql:sqls) {
			db.executeUpdate(sql);
		}
	}
 

 

目录
相关文章
|
13天前
|
存储 SQL 监控
Visual Basic与数据库交互:实现数据访问和管理
【4月更文挑战第27天】本文探讨了使用Visual Basic进行数据库编程的基础,包括数据库基础、连接、数据访问技术如ADO.NET,数据绑定,事务处理,存储过程与视图。还强调了性能优化、安全性、测试与调试,以及持续维护的重要性。通过掌握这些概念和技巧,开发者能构建高效、可靠的数据驱动应用。
|
10天前
|
监控 关系型数据库 MySQL
初体验:数据库监控、管理和可观测性工具(PMM)
Percona Monitoring and Management (PMM) 是一个开源工具,用于监控MySQL、PostgreSQL和MongoDB的性能。它提供实时监控、数据可视化、故障排除和管理功能,支持本地和云端数据库。要安装PMM,首先需安装Docker,然后通过提供的脚本部署PMM服务器和客户端。在MySQL服务器上创建PMM用户后,使用`pmm-admin`命令添加数据库。访问PMM的HTTPS网址(默认用户名和密码为admin)进行配置。本文还包含了安装Docker和PMM的命令行步骤。
初体验:数据库监控、管理和可观测性工具(PMM)
|
10天前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
29 0
|
3天前
|
NoSQL 关系型数据库 数据库
数据库同步 Elasticsearch 后数据不一致,怎么办?
数据库同步 Elasticsearch 后数据不一致,怎么办?
9 0
|
9天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型
|
11天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在使用 DataWorks 数据集成同步 PostgreSQL 数据库中的 Geometry 类型数据如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
23 0
|
11天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
|
1天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
11 0
|
9天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
9天前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)