clob保存为本地xml文件,修改后上传

这两天与小伙伴写了一个小程序,实现的功能如下:

首先将数据库的clob保存为本地的xml文件,然后对xml进行修改后上传至数据库

主要的难点如下:

1:clob文件的下载与上传,其中保存为本地的文件要求是UTF-8格式

2:xml文件中节点的修改

clob的上传与下载如下

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author GuoDi-CT DC
 *
 */

public class ClobModify {

	/**
	 *@param id 数据库中的ID
	 * 返回 保存文件的绝对路径
	 */
	public static String ClobToXml(int id) {
		Connection conn = DB.getConn();
		Statement stmt = DB.createStmt(conn);
		String sql = "select * from BD_PROCESS_DEF_VER where ID =" + id;
		ResultSet rs = DB.getRs(stmt, sql);
		String xmlFile = null;

		try {
			if (rs.next()) {
				int fjbh = rs.getInt(1);
				xmlFile = "d:\\xml\\" + fjbh + ".xml";
				Clob clob = rs.getClob(16);
				FileOutputStream fo = new FileOutputStream(xmlFile);
				OutputStreamWriter so = new OutputStreamWriter(fo, "UTF-8");
				if (clob != null) {
					Reader is = clob.getCharacterStream();
					BufferedReader br = new BufferedReader(is);
					String s = br.readLine();
					while (s != null) {
						so.write(s + System.getProperty("line.separator"));
// System.out.println(str);
						s = br.readLine();
					}
				}
				so.flush();
				so.close();
			}
		} catch (SQLException | IOException e) {
			e.printStackTrace();
		}
		DB.close(rs);
		DB.close(stmt);
		DB.close(conn);
		return xmlFile;
	}

	public static void updateClob(String fileName, int id) {

		FileInputStream fis = null;
		InputStreamReader rd = null;

		try {
			fis = new FileInputStream(fileName);
			rd = new InputStreamReader(fis, "UTF-8");
		} catch (FileNotFoundException e2) {
			e2.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		PreparedStatement pst = null;
		Connection conn = DB.getConn();
		Statement stmt = DB.createStmt(conn);
		try {
			conn.setAutoCommit(false);
		} catch (SQLException e1) {
			e1.printStackTrace();
		}

		String sql1 = "update BD_PROCESS_DEF_VER s set s.NODE_INFO=' ' where ID="
				+ id; // 这边需要设置一个空的字段,后面就不会出现空指针
		try {
			stmt.execute(sql1);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		String sql2 = "select * from BD_PROCESS_DEF_VER s where s.ID=" + id;
		// 锁定数据行进行更新,注意“for update”语句
		ResultSet rs = null;
		try {
			rs = stmt.executeQuery(sql2);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		try {
			while (rs.next()) {
				String sql3 = "update BD_PROCESS_DEF_VER set NODE_INFO= ? where ID="+ id;
				pst = conn.prepareStatement(sql3);
				pst.setCharacterStream(1, rd, 100000000);
				pst.executeUpdate();
			}
			// 最后一步自己提交
			conn.commit();
			conn.setAutoCommit(true);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DB.close(rs);
			DB.close(stmt);
			try {
				pst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			DB.close(conn);
		}
	}
}

其中DB是连接数据库的javabean,如下

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author GuoDi-CT DC
 * jdcbc JavaBean
 *
 */
public class DB {
	// 驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 连接地址是由各个数据库生产商单独提供的,所以需要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@172.17.20.215:1521:BPMIDE";
	// 连接数据库的用户名
	public static final String DBUSER = "bpmduser";
	// 连接数据库的密码
	public static final String DBPASS = "bpmd";

	public static Connection getConn() {
		Connection conn = null;
		try {
			Class.forName(DBDRIVER);
			conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 2、连接数据库
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} // 1、使用CLASS 类加载驱动程序
		catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static Statement createStmt(Connection conn) {
		Statement stmt = null;
		try {
			stmt = conn.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stmt;
	}

	public static ResultSet getRs(Statement stmt, String sql) {
		ResultSet rs = null;
		try {
			rs = stmt.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}

	public static void close(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				rs = null;
			}
		}
	}

	public static void close(Statement stmt) {
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
	}

	public static void close(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}
}

xml的修改程序如下

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author zhangwen.ctdc DOM更新与解析XML文档
 */
public class XmlAnalysis /* implements XmlDocumentInterface */{
	private Document document;

	public void init() {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			this.document = builder.newDocument();
		} catch (ParserConfigurationException e) {
			System.out.println(e.getMessage());
		}
	}

	public void insertElementNode(String fileName, String nodeName,
			String newElementName) {
		document = parserXml(fileName);

		NodeList nodeList = document.getElementsByTagName(nodeName);

		for (int i = 0; i < nodeList.getLength(); i++) {
			Element element = document.createElement(newElementName);
			nodeList.item(i).appendChild(element);
		}

		createXml(fileName);

	}

	public void insertAttrNode(String fileName, String nodeName,
			String newAttrName, String attrValue) {
		document = parserXml(fileName);

		NodeList nodeList = document.getElementsByTagName(nodeName);
		for (int i = 0; i < nodeList.getLength(); i++) {
			Element element = (Element) (nodeList.item(i));
			element.setAttribute(newAttrName, attrValue);
		}

		createXml(fileName);
	}

	public void insertTextNode(String fileName, String nodeName, String textNode) {
		document = parserXml(fileName);

		NodeList nodeList = document.getElementsByTagName(nodeName);
		for (int i = 0; i < nodeList.getLength(); i++) {
			nodeList.item(i).appendChild(document.createTextNode(textNode));
		}
		createXml(fileName);

	}

	public void deleteElementNode(String fileName, String nodeName) {
		document = parserXml(fileName);

		NodeList nodeList = document.getElementsByTagName(nodeName);

		while (nodeList.getLength() > 0) {
			nodeList.item(0).getParentNode().removeChild(nodeList.item(0));
			nodeList = document.getElementsByTagName(nodeName);
		}

		createXml(fileName);
	}

	public void updateNode(String fileName, String nodeName, String attrName,
			String newAttrValue) {
		document = parserXml(fileName);

		NodeList nodeList = document.getElementsByTagName(nodeName);
		for (int i = 0; i < nodeList.getLength(); i++) {
			Element node = (Element) nodeList.item(i);
			node.setAttribute(attrName, newAttrValue);
		}

		createXml(fileName);
	}

	private Document parserXml(String fileName) {
		try {
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.parse(fileName);

			System.out.println("-----------------------------------" + "解析完毕"
					+ "----------------------------------------");
			return document;

		} catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch (ParserConfigurationException e) {
			System.out.println(e.getMessage());
		} catch (SAXException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		return document;
	}

	private void createXml(String fileName) {
		try {
			/** 将document中的内容写入文件中 */
			TransformerFactory tFactory = TransformerFactory.newInstance();
			Transformer transformer = tFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			DOMSource source = new DOMSource(document);
			StreamResult result = new StreamResult(new FileOutputStream(
					fileName));
			transformer.transform(source, result);
			System.out.println("--------------------------------"
					+ "更新 XML文件成功" + "-------------------------------------");
		} catch (Exception exception) {
			System.out.println("更新" + fileName + "出错:" + exception);
			exception.printStackTrace();
		}

	}
}

最后程序提供的接口与说明如下

/**
 * @author GuoDi and ZhangWen
 *
 */
public interface NodeInfoInterface {

    /**
    * XML文档 插元素入节点
    * @param time 时间
    * @param nodeName 标签名
    * @param newElementName 新标签
    */
    public void insertElementNode(String time, String nodeName,String newElementName);

    /**
    * @param time 时间
    * @param nodeName 标签名
    * @param newAttrName 新属性名
    * @param attrValue 新属性值
    * XML文档 插入属性节点
    */
    public void insertAttrNode(String time,String nodeName,String newAttrName,String attrValue);

    /**
    * @param time 时间
    * @param nodeName 标签名
    * @param textNode 文本
    * XML文档 插入文本节点
    */
    public void insertTextNode(String time,String nodeName,String textNode);

    /**
    * @param time 时间
    * @param nodeName 标签名
    * XML文档 删除所有对应元素节点
    */
    public void deleteElementNode(String time,String nodeName);

    /**
    * @param time 时间
    * @param nodeName 标签名
    * @param newAttrName 新属性名
    * @param attrValue 新属性值
    * XML文档 修改属性节点内容
    */
    public void updateNode(String time,String nodeName,String newAttrName,String attrValue);

}
时间: 2024-10-13 23:36:08

clob保存为本地xml文件,修改后上传的相关文章

tomcat下web.xml文件修改后工程重启的原因

$tomcat/conf/context.xml文件中的配置,监听了WEB-INF/web.xml文件 <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for

/profile文件修改后立即生效

修改profile etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的.要修改profile,需要取得root权限,(使用gedit编辑) $sudo gedit /etc/profile 或者 $sudo -s $gedit /etc/profile 这样打开profile文件,修改后就可以保存了. /profile文件修改后立即生效 方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # .  /etc/profile 注意: . 和

【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp

一.本人环境描述      1.oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0      2.Linux为centos6.5 32位,安装在Oracle VM VirtualBox虚拟机上      3.win7上装有ftp服务 二.功能实现描述      用shell的crontab命令定时执行某个.sh文件,此文件的功能已实现生成oracle表的数据到本地txt文件,并上传到ftp,必要时可记录执行日志. 三.步骤      1.在centos中安装orac

将Chrome调试器里的JavaScript变量保存成本地JSON文件

我写了一个系列的文章,主要用来搜集一些供程序员使用的小工具,小技巧,帮助大家提高工作效率. 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理器的替代者-Process Explorer 介绍一个强大的磁盘空间检测工具Space Sniffer 如何在电脑上比较两个相似文件的差异 程序员工作效率提升系列-推荐一个JSON文件查看和修改的小工具 我们在Chrome开发者工具的Console

UWP 读取本地XML文件

读取本地XML文件时要将xxx.xml文件的“生成操作”改为“嵌入的资源”会比较好,在手机上运行的话需要改为“内容” <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata

让/etc/profile文件修改后立即生效(转)

方法1:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# .  /etc/profile注意: . 和 /etc/profile 有空格方法2:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# source /etc/profile 附:Linux中source命令的用法source命令:source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.用法: source f

让/etc/profile文件修改后立即生效

让/etc/profile文件修改后立即生效 方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # .  /etc/profile 注意: . 和 /etc/profile 有空格 方法2: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # source /etc/profile 

解决前端文件修改后浏览器页面未更新的问题

前端开发技巧:解决前端文件修改后页面未更新的问题.建议使用chrome, 1. 按F12打开控制台,点击右上角设置图标 2. 关闭浏览器缓存 3.日后修改前端文件后,注意观察eclipse下方写入和编译是否执行(有进度条),若写入和编译完成,按F5刷新页面即可体现修改效果.

IIS6修改ASP上传文件200K限制

大家租用美国服务器的时候,2003+IIS6下ASP上传文件限制为200K,如何修改这个上传大小限制呢?方法如下:第一步:直接编辑配置数据库设为允许在IIS中右键“本地计算机”选择“属性”,钩选“允许直接编辑配置数据库”. 第二步:关闭“IIS Admin Service”服务依次打开“控制面板--管理工具--服务”,在其中右边找到“IIS Admin Service”,选中该项并点击鼠标右键,选中“停止”即可关闭该服务. 第三步:修改“MetaBase.xml”文件依次打开“C:\WINDOW