20161027 sql文件下载(主从表sql文件)

本文是sql文件下载,主从表都可以下载

调用方法:

download.DownloadSql(jdbcTemplate,主表中要下载的所有主键id, 主表表名, 所有从表表名, 从表中与主表关联的列名,response);


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.jeecgframework.core.util.ResourceUtil;
import org.jeecgframework.web.cgform.service.migrate.MigrateForm;
import org.jeecgframework.web.cgform.util.PublicUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
import org.springframework.util.StringUtils;

/**
 * 下载sql文件
 * @author hua 20161027
 *
 */
public class DownloadFileSql{
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(DownloadFileSql.class);
	
	/**
	 * 下载sql文件
	 * @param jdbcTemplate jdbcTemplate
	 * @param ids          主表的所有主键id
	 * @param parentTable  主表的表名
	 * @param childTables  从表的所有表名
	 * @param childKey     从表与主表相关联的外键
	 * @param response     reponse
	 */
	public void DownloadSql(JdbcTemplate jdbcTemplate,
			String ids,
			String parentTable,
			List<String> childTables,
			String childKey,
			HttpServletResponse response){
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		String nowTime = format.format(new Date());
		String savePath = ResourceUtil.getSystempPath() + parentTable +"_sql_"+nowTime+".sql";
		File file = new File(savePath);
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				logger.error("创建文件名失败!!");
				e.printStackTrace();
			}
		}
		
		// 获得sql语句
		List<String> insertSqlList = getInsertSql(jdbcTemplate,ids,parentTable,childTables,childKey);
		
		FileWriter fw = null;
		BufferedWriter bw = null;
		try {
			fw = new FileWriter(file);
			bw = new BufferedWriter(fw);
			if (insertSqlList.size() > 0) {
				for (int i = 0; i < insertSqlList.size(); i++) {
					bw.append(insertSqlList.get(i));
					bw.append("\n");
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
			logger.error(e.getMessage());
		} finally {
			try {
				bw.close();
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
				logger.error(e.getMessage());
			}
		}
		
		// 输出生成的sql文件
		String fileName = file.getName();
		InputStream fis = null;
		try{
			fis = new BufferedInputStream(new FileInputStream(savePath));
			// 清空response
			response.reset();
			// 设置response的header
			response.setContentType("text/html;charset=utf-8");
			response.addHeader("Content-Length", "" + file.length());
			OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
			response.setContentType("application/octet-stream");
			response.setHeader("Content-disposition", "attachment;filename="
					+ new String(fileName.getBytes("utf-8"), "ISO8859-1"));
			int bytesRead = 0;
			byte[] buffer = new byte[8192];
			while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
				toClient.write(buffer, 0, bytesRead);
			}
			toClient.write(buffer);
			toClient.flush();
			toClient.close();
			fis.close();
			
		}catch(Exception e){
			e.printStackTrace();
			logger.error(e.getMessage());
		}finally {
			try{
				fis.close();
			}catch(IOException e){
				e.printStackTrace();
				logger.error(e.getMessage());
			}
		}
	}


	/**
	 * 获得插入数据库的sql
	 * @param ids 所有要下载的主表id
	 * @param parentTable 主表表名
	 * @param childTables 从表表名
	 * @param childKey    从表关联主表的列名
	 * @return
	 */
	private List<String> getInsertSql(JdbcTemplate jdbcTemplate,String ids,String parentTable,List<String> childTables,String childKey){
		List<String> insertList = new ArrayList<String>();
		String[] idArray = ids.split(",");
		String sql = "SELECT * FROM "+parentTable+" WHERE ID = ";
		String ls_id = "";
		String sqlSelect = "";
		for(String id : idArray){
			sqlSelect = sql + "'"+id+"'";
			
			SqlRowSet sqlRowSet = jdbcTemplate.queryForRowSet(sqlSelect);
			SqlRowSetMetaData sqlRsmd = sqlRowSet.getMetaData();
			int columnCount = sqlRsmd.getColumnCount(); // 获得表字段个数
			String tableName = sqlRsmd.getTableName(columnCount); // 获得表名称
			if(StringUtils.isEmpty(tableName)){
				tableName = PublicUtil.getTableName(sqlSelect);
			}
			
			// 主表sql
			insertList = getTableSql(jdbcTemplate,insertList,columnCount,sqlRowSet,sqlRsmd,tableName,ls_id);
			
			// 从表sql
			if(null == childTables || 0 == childTables.size() || StringUtils.isEmpty(childKey)){
				continue;
			}
			
			for(String childTable : childTables){
				String childSelectSql = "select * from " + childTable + " where "+childKey+"='"+id+"'";
				String child_ls_id = "";
				
				SqlRowSet childSqlRowSet = jdbcTemplate.queryForRowSet(childSelectSql);
				SqlRowSetMetaData childSqlRsmd = childSqlRowSet.getMetaData();
				int childColumnCount = childSqlRsmd.getColumnCount(); // 获得表字段个数
				String childTableName = childSqlRsmd.getTableName(childColumnCount); // 获得表名称
				if(StringUtils.isEmpty(childTableName)){
					childTableName = PublicUtil.getTableName(childSelectSql);
				}
				insertList = getTableSql(jdbcTemplate,insertList,childColumnCount,childSqlRowSet,childSqlRsmd,childTableName,child_ls_id);
			}
		}
		return insertList;
	}
	
	/**
	 * 拼接sql语句
	 * @param jdbcTemplate
	 * @param insertList
	 * @param columnCount
	 * @param sqlRowSet
	 * @param sqlRsmd
	 * @param tableName
	 * @param ls_id
	 * @param tableId
	 * @return
	 */
	private List<String> getTableSql(JdbcTemplate jdbcTemplate,
			List<String> insertList,
			int columnCount,
			SqlRowSet sqlRowSet,
			SqlRowSetMetaData sqlRsmd,
			String tableName,
			String ls_id){
		String tableId="";
		while(sqlRowSet.next()){
			StringBuffer ColumnName = new StringBuffer();
			StringBuffer ColumnValue = new StringBuffer();

			for (int i = 1; i <= columnCount; i++) {
				String value = sqlRowSet.getString(i);
				if (value == null || "".equals(value)) {
					value = "";
				}
				Map<String, String> fieldMap = new HashMap<String, String>();
				fieldMap.put("name", sqlRsmd.getColumnName(i));
				fieldMap.put("fieldType", String.valueOf(sqlRsmd.getColumnType(i)));
				// 生成插入数据sql语句
				if (i == 1) {
					// 1、生成删除指定ID语句,清除现有冲突数据
					insertList.add("delete from " + tableName + " where " + sqlRsmd.getColumnName(i) + "='" + value + "';");

					ColumnName.append(sqlRsmd.getColumnName(i));
					ls_id = value;
					tableId = value;
					if (Types.CHAR == sqlRsmd.getColumnType(i) 
							|| Types.VARCHAR == sqlRsmd.getColumnType(i)) {
						ColumnValue.append("'").append(value).append("',");
					} else if (Types.SMALLINT == sqlRsmd.getColumnType(i) 
							|| Types.INTEGER == sqlRsmd.getColumnType(i) 
							|| Types.BIGINT == sqlRsmd.getColumnType(i) 
							|| Types.FLOAT == sqlRsmd.getColumnType(i) 
							|| Types.DOUBLE == sqlRsmd.getColumnType(i) 
							|| Types.NUMERIC == sqlRsmd.getColumnType(i) 
							|| Types.DECIMAL == sqlRsmd.getColumnType(i)) {
						if ("".equals(value))	value = "0";
						ColumnValue.append(value).append(",");
					} else if (Types.DATE == sqlRsmd.getColumnType(i) 
							|| Types.TIME == sqlRsmd.getColumnType(i) 
							|| Types.TIMESTAMP == sqlRsmd.getColumnType(i)) {
						if ("".equals(value))
							value = "2000-01-01";
						ColumnValue.append("'").append(value).append("',");
					} else {
						ColumnValue.append(value).append(",");
					}
				} else if (i == columnCount) {
					ColumnName.append("," + sqlRsmd.getColumnName(i));
					if (Types.CHAR == sqlRsmd.getColumnType(i) 
							|| Types.VARCHAR == sqlRsmd.getColumnType(i) 
							|| Types.LONGVARCHAR == sqlRsmd.getColumnType(i)) {
						ColumnValue.append("'").append(value).append("'");
					} else if (Types.SMALLINT == sqlRsmd.getColumnType(i) 
							|| Types.INTEGER == sqlRsmd.getColumnType(i) 
							|| Types.BIGINT == sqlRsmd.getColumnType(i) 
							|| Types.FLOAT == sqlRsmd.getColumnType(i) 
							|| Types.DOUBLE == sqlRsmd.getColumnType(i) 
							|| Types.NUMERIC == sqlRsmd.getColumnType(i) 
							|| Types.DECIMAL == sqlRsmd.getColumnType(i)) {
						if ("".equals(value))	value = "0";
						ColumnValue.append(value);
					} else if (Types.DATE == sqlRsmd.getColumnType(i) 
							|| Types.TIME == sqlRsmd.getColumnType(i) 
							|| Types.TIMESTAMP == sqlRsmd.getColumnType(i)) {
						if ("".equals(value))
							value = "2000-01-01";
						ColumnValue.append("'").append(value).append("'");
					} else {
						ColumnValue.append(value).append("");
					}
				} else {
					ColumnName.append("," + sqlRsmd.getColumnName(i));
					if (Types.CHAR == sqlRsmd.getColumnType(i) 
							|| Types.VARCHAR == sqlRsmd.getColumnType(i) 
							|| Types.LONGVARCHAR == sqlRsmd.getColumnType(i)) {
						ColumnValue.append("'").append(value).append("'").append(",");
					} else if (Types.SMALLINT == sqlRsmd.getColumnType(i) 
							|| Types.INTEGER == sqlRsmd.getColumnType(i) 
							|| Types.BIGINT == sqlRsmd.getColumnType(i) 
							|| Types.FLOAT == sqlRsmd.getColumnType(i) 
							|| Types.DOUBLE == sqlRsmd.getColumnType(i) 
							|| Types.NUMERIC == sqlRsmd.getColumnType(i) 
							|| Types.DECIMAL == sqlRsmd.getColumnType(i)) {
						if ("".equals(value))	value = "0";
						ColumnValue.append(value).append(",");
					} else if (Types.DATE == sqlRsmd.getColumnType(i) 
							|| Types.TIME == sqlRsmd.getColumnType(i) 
							|| Types.TIMESTAMP == sqlRsmd.getColumnType(i)) {
						if ("".equals(value))
							value = "2000-01-01";
						ColumnValue.append("'").append(value).append("',");
					} else if (Types.BLOB == sqlRsmd.getColumnType(i) 
							|| Types.LONGVARCHAR == sqlRsmd.getColumnType(i) 
							|| Types.LONGNVARCHAR == sqlRsmd.getColumnType(i) 
							|| Types.BINARY == sqlRsmd.getColumnType(i) 
							|| Types.LONGVARBINARY == sqlRsmd.getColumnType(i) 
							|| Types.VARBINARY == sqlRsmd.getColumnType(i)) {
						String ls_tmp = MigrateForm.getBlob(ls_id, tableName, sqlRsmd.getColumnName(i), jdbcTemplate);
						ColumnValue.append(ls_tmp).append(",");
					} else {
						ColumnValue.append(value).append(",");
					}
				}

			}
			
			insertSQL(tableName, ColumnName, ColumnValue,insertList);// 拼装并放到全局list里面
			if(tableName.equals("cgform_head")){
				insertList.add("update cgform_head set is_dbsynch='N' where id='"+tableId+"';");// 设为未同步		
			}
		}
		
		return insertList;
	}
	
	/**
	 * 拼装insertsql 放到全局list里面
	 * 
	 * @param ColumnName
	 * @param ColumnValue
	 */
	public static void insertSQL(String tablename, StringBuffer ColumnName, StringBuffer ColumnValue,List<String> insertList) {
		StringBuffer insertSQL = new StringBuffer();
		// 拼装sql语句
		insertSQL.append("insert into ").append(" ").append(tablename).append("(").append(ColumnName.toString()).append(")").append(" values ").append("(").append(ColumnValue.toString()).append(");");
		insertList.add(insertSQL.toString()); // 放到全局list里面
	}

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值