`
234390216
  • 浏览: 10238618 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462885
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775976
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398743
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395157
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680171
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531143
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1185007
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468815
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151491
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68344
社区版块
存档分类
最新评论

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

阅读更多

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

 

2
2
分享到:
评论
1 楼 com1com4 2011-08-05  
我的方案是直接从information_schema中直接把表和字段信息拿出来生成xml,再通过xslt生成sql,比直接拼字符串舒服多了

相关推荐

    数据库与表操作.doc

    - `COPY STRUCTURE TO 接受表名 [FIELDS 字段名列表]`:用于拷贝表结构。 - `APPEND FROM 表文件名 [FIELDS 字段名表] [WHILE 条件] [FOR 条件]`:用于从其他表向当前表批量添加记录。 ##### 3. 表的基本操作 - ...

    SQL Server 2005数据库的简单应用

    接下来,新建表时,展开“表”节点,同样通过右键菜单选择【新建表】,定义表结构包括字段名和数据类型,最后保存并命名表。 #### 查看与修改表数据 要查看已创建表中的数据记录,只需在表上右键选择【打开表】,...

    dmp文件导入oracle数据库方法[参考].pdf

    DMP 文件是 Oracle 数据库的导出文件,包含了数据库中的表结构、数据和索引信息。下面将详细介绍如何将 DMP 文件导入 Oracle 数据库中。 首先,需要准备相关的环境,包括将 DMP 文件拷贝到目标服务器上,使用超大...

    使用ibdata和frm文件恢复MySQL数据库.docx

    MySQL 数据库是当前最流行的开源关系数据库管理系统之一,但是在实际使用中,可能会遇到各种问题,例如磁盘空间不足、服务器崩溃、数据库无法启动等问题,这些问题可能会导致数据库无法连接,数据无法导出。...

    10级《数据库系统》上机作业01—双号.docx

    数据库系统是管理和存储数据的核心工具,对于IT专业人士来说,理解和操作数据库至关重要。本作业主要涵盖了数据库的创建、修改、拷贝和附加等基础操作,以及对数据库内部结构的理解。 1. **数据库设计与创建** - *...

    Lotus Domino BS开发--熟悉并使用Lotus的各种设计元素--数据库介绍

    设计元素是构建Lotus Domino应用的基础,包括帧结构集、页面、表单、视图、文件夹、代理、大纲、子表单、域、列、操作、Script库、图像、文件、小程序、样式表、数据连接、数据库资源、导航器和摘要。摘要虽非设计...

    Mysql8.0 数据库恢复工具

    本软件适合于操作系统崩溃后将mysql数据目录拷贝出进行恢复,在恢复前需要使用之前备份的数据库结构新建空库,然后将还原文件的数据恢复到新库,目前只能恢复InnoDB引擎、MyISAM引擎 表。

    sqlserver2008数据库备份与恢复.ppt

    备份就是制作数据库结构和数据的拷贝,以便在数据库遭到破坏时能够修复数据库。数据库的破坏是难以预测的,因此必须采取能够还原数据库的措施。一般地,造成数据丢失的常见原因包括以下几种:软件系统瘫痪、硬件系统...

    oracle数据字典制作流程

    数据字典是数据库管理员和开发人员了解数据库结构和数据关系的重要工具。在本文中,我们将介绍使用 PowerDesigner 15 Evaluation 版本创建 Oracle 数据字典的流程。 安装 PowerDesigner 15 Evaluation 第一步是在 ...

    数据库操作语句大全(sql)

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) select...

    ArcGIS-10.2 SQLite

    ArcGIS 10.2操作SQLite的内容还包括了数据操作的相关部分,如新建数据库、导入数据和查看数据等。这些操作允许用户在ArcGIS中执行基本的数据库管理任务,如创建数据库、创建视图、导入导出数据等。然而,对于想要...

    ADO方法对Access数据库操作.pdf

    在初始化对话框中调用OnInitADOConn函数,获取数据库表中数据,并显示在列表控件中。使用LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES样式显示列表...

    易语言-易语言编写内存微型数据库

    它可能采用链表、哈希表或者B树等数据结构来组织数据,以便高效地进行查找、插入和删除操作。 2. API函数调用:易语言虽然有自己的内建函数,但为了实现更复杂的功能,通常会调用操作系统提供的API函数,如内存分配...

    NoSQL数据库技术腾讯CMongo架构与优化实践.pdf

    CMongo支持灵活的文档模型,无需预定义模式,允许表结构随业务发展而自由变化。同时,CMongo提供了丰富的索引类型,优化了交互方式,以及强大的横向和纵向扩展能力,确保了在大规模数据处理中的高性能。 **整体架构...

    .NET整合聊聊

    - **数据库结构要求**:生成框架的数据库的每张表都必须有一个为自增长的主键,这是确保数据完整性和关系型数据库操作的基础。 - **数据库连接字符串**:生成框架完成后,一定要修改Web.config文件中的数据库连接...

    一张图空间数据制图模板设计及打印输出说明

    其主界面包括了一个左侧的树状结构,用于展示当前数据库中所有可用的地图模板及其分类。 - **根节点右键菜单**:提供“新建”、“刷新”等功能,其中“新建”用于创建新的模板类别,“刷新”则可以更新整个模板树...

    PowerDesigner15的简单使用方法

    CDM是从功能模型中提炼出的实体关系模型,而LDM和PDM则是在CDM的基础上进一步细化,分别表示逻辑上的数据结构和数据库中的实际存储结构。 在使用PowerDesigner时,首先需要准备Windows 2000或更高版本操作系统的...

Global site tag (gtag.js) - Google Analytics