将plsql导出的XML文件再次还原到oracle数据库

前端之家收集整理的这篇文章主要介绍了将plsql导出的XML文件再次还原到oracle数据库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

由于最近工作要对数据库反复的操作,数据扭转完毕之后要将数据还原,因此这是一个很痛苦的过程,自己使用sqlPLUS工具,导出的数据没有sql文件,(只导出查询的结果而不是整个数据表,导出表是有sql文件的,因为数据很多的时候导出表很花费时间,实际工作中只关注自己需要的数据,因此没有必要导出整个表,我这里只是导出查询的结果)只有XML等其他四种文件格式,因此自己写了一个小程序,将导出的XML数据再次插入到数据库中,目的是将原来的数据删除掉,然后再插入,这样数据就还原了(貌似很麻烦,但数据量大了也没有办法)

对于上面的问题,个人能力有限,希望看官能给出你们的意见,下面是我代码实现XML导入数据库的过程

  1. package hb.dom4j;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.sqlException;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.Iterator;
  11. import java.util.Map;
  12.  
  13. import org.dom4j.Document;
  14. import org.dom4j.DocumentException;
  15. import org.dom4j.Element;
  16. import org.dom4j.io.SAXReader;
  17. import org.junit.Test;
  18. /**
  19. * 该测试类是将sqlPLUS导出的XML文件插入到数据库
  20. * @author huangbiao
  21. *
  22. */
  23. public class readXMLIntoDb {
  24. private static String path = "C:\\hb\\hb.xml";
  25. private static String tableName="person";
  26. private static String dbName="orcl";
  27. private static String username="huangbiao";//连接数据库用户名
  28. private static String password="huangbiao";//
  29. private static String serverIP = "127.0.0.1";//数据库的IP地址
  30. private static String serverPort = "1521";
  31. private static int maxCoursor = 299;
  32. //模拟数据字典的方式,下面字段的格式为日期类型
  33. public static class DATE{
  34. public static String BIRTHDAY = "BIRTHDAY";
  35. }
  36. public static class INTEGER{
  37. public static String AGE = "AGE";
  38. }
  39. //使用Map方式提高运行的效率
  40. public static Map<String,String> MAP_DATE = null;
  41. public static Map<String,String> MAP_INTEGER = null;
  42. public void init(){
  43. if(MAP_DATE == null){
  44. MAP_DATE = new HashMap<String,String>();
  45. MAP_DATE.put("BIRTHDAY",DATE.BIRTHDAY);
  46. }
  47. if(MAP_INTEGER == null){
  48. MAP_INTEGER = new HashMap<String,String>();
  49. MAP_INTEGER.put("AGE",INTEGER.AGE);
  50. }
  51. }
  52. public static void main(String[]args){
  53. readXMLIntoDb x = new readXMLIntoDb();
  54. x.init();//用来初始化数据
  55. x.xmlDataIntoDB();
  56. }
  57. /**
  58. * 测试能够正常读取文件
  59. */
  60. @Test
  61. public void readXML(){
  62. // 以DOM4J默认的SAX解析器解析
  63. SAXReader reader = new SAXReader();
  64. // read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
  65. Document document=null;
  66. try {
  67. document = reader.read(path);
  68. } catch (DocumentException e) {
  69. System.out.println("读取文件异常");
  70. e.printStackTrace();
  71. }
  72. if(document == null){
  73. System.out.println("读取文件失败");
  74. }
  75. }
  76. /**
  77. * 测试解析XML文件内容,读取里面的内容
  78. */
  79. @Test
  80. public void readXMLContent(){
  81. // 以DOM4J默认的SAX解析器解析
  82. SAXReader reader = new SAXReader();
  83. // read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
  84. Document document=null;
  85. try {
  86. document = reader.read(path);
  87. } catch (DocumentException e) {
  88. System.out.println("读取文件异常");
  89. e.printStackTrace();
  90. }
  91. if(document == null){
  92. System.out.println("读取文件失败");
  93. }
  94. // 获得根节点
  95. Element root = document.getRootElement();
  96. // i为根节点孩子节点的迭代器
  97. for (Iterator i = root.elementIterator(); i.hasNext();) {
  98. Element element = (Element) i.next();
  99. // 根节点的名称
  100. System.out.println(element.getName());
  101. for(Iterator it = element.elementIterator(); it.hasNext();){
  102. Element subElement = (Element)it.next();
  103. System.out.println(subElement.getName()+":"+subElement.getText());
  104. }
  105. }
  106. }
  107. /**
  108. * 连接数据库测试
  109. */
  110. @Test
  111. public void connDB(){
  112. try {
  113. Class.forName("oracle.jdbc.driver.OracleDriver");
  114. Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@"+serverIP+":"+serverPort+":"+dbName,username,password);
  115. System.out.println("连接成功!");
  116. conn.close();
  117. } catch (ClassNotFoundException e) {
  118. e.printStackTrace();
  119. } catch (sqlException e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. /**
  124. * 测试通过DOM4J解析文件拼装的插入sql语句
  125. */
  126. @Test
  127. public void getsqlString(){
  128. // 以DOM4J默认的SAX解析器解析
  129. SAXReader reader = new SAXReader();
  130. // read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
  131. Document document=null;
  132. try {
  133. document = reader.read(path);
  134. } catch (DocumentException e) {
  135. System.out.println("读取文件异常");
  136. e.printStackTrace();
  137. }
  138. if(document == null){
  139. System.out.println("读取文件失败");
  140. }
  141. StringBuffer sb = new StringBuffer();
  142. sb.append("insert into "+tableName+" (");
  143. Element root = document.getRootElement();
  144. Iterator it = root.elementIterator();
  145. Element el = (Element)it.next();
  146. int number = 0;
  147. Iterator i = el.elementIterator();
  148. while(i.hasNext()){
  149. Element sub = (Element)i.next();
  150. // System.out.println(sub.getName());
  151. sb.append(sub.getName()+",");
  152. number++;
  153. }
  154. // 打印显示内容——insert into t_user (SSID,NAME,// System.out.println(sb.toString());
  155. // 删除最后一个逗号
  156. String temp = sb.substring(0,sb.length()-1);
  157. System.out.println(temp);
  158. StringBuffer result = new StringBuffer(temp);
  159. result.append(")").append("values(");
  160. for(int p=0;p<number;p++){
  161. result.append("?");
  162. if(p<number-1){
  163. result.append(",");
  164. }
  165. }
  166. result.append(")");
  167. System.out.println(result);
  168. }
  169. /**
  170. * 抽象出来的静态方法,解析XML文件,得到插入的sql语句
  171. * @return
  172. */
  173. public static String getsql(){
  174. // 以DOM4J默认的SAX解析器解析
  175. SAXReader reader = new SAXReader();
  176. // read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
  177. Document document=null;
  178. try {
  179. document = reader.read(path);
  180. } catch (DocumentException e) {
  181. System.out.println("读取文件异常");
  182. e.printStackTrace();
  183. }
  184. if(document == null){
  185. System.out.println("读取文件失败");
  186. }
  187. StringBuffer sb = new StringBuffer();
  188. sb.append("insert into "+tableName+" (");
  189. Element root = document.getRootElement();
  190. Iterator it = root.elementIterator();
  191. Element el = (Element)it.next();
  192. int number = 0;
  193. Iterator i = el.elementIterator();
  194. while(i.hasNext()){
  195. Element sub = (Element)i.next();
  196. // System.out.println(sub.getName());
  197. sb.append(sub.getName()+",");
  198. }
  199. }
  200. result.append(")");
  201. System.out.println(result);
  202. return result.toString();
  203. }
  204. /**
  205. * 将XML文件的数据插入到数据库中,通过这个类就能够看到效果
  206. */
  207. @Test
  208. public void xmlDataIntoDB(){
  209. Connection conn = null;
  210. PreparedStatement pre = null;
  211. try {
  212. Class.forName("oracle.jdbc.driver.OracleDriver");
  213. conn = DriverManager.getConnection("jdbc:oracle:thin:@"+serverIP+":"+serverPort+":"+dbName,password);
  214. System.out.println("连接成功!");
  215. } catch (ClassNotFoundException e1) {
  216. e1.printStackTrace();
  217. } catch (sqlException e) {
  218. e.printStackTrace();
  219. }
  220. // String sql="insert into t_user (SSID,name)values(?,?)";
  221. String sql=getsql();
  222. System.out.println("sql----"+sql);
  223. // 以DOM4J默认的SAX解析器解析
  224. SAXReader reader = new SAXReader();
  225. // read函数的形参可以是url 也可以是 File类型,也可以是STRING类型的相对或绝对路径
  226. Document document=null;
  227. try {
  228. document = reader.read(path);
  229. } catch (DocumentException e) {
  230. System.out.println("读取文件异常");
  231. e.printStackTrace();
  232. }
  233. if(document == null){
  234. System.out.println("读取文件失败");
  235. }
  236. // 获得根节点
  237. Element root = document.getRootElement();
  238. // i为根节点孩子节点的迭代器
  239. int count = 1;
  240. for (Iterator i = root.elementIterator(); i.hasNext();) {
  241. Element element = (Element) i.next();
  242. // 根节点的名称
  243. System.out.println(element.getName());
  244. String elementName="";
  245. String elementText="";
  246. try {
  247. pre = conn.prepareStatement(sql);
  248. int num=1;
  249. for(Iterator it = element.elementIterator(); it.hasNext();){
  250. Element subElement = (Element)it.next();
  251. elementName = subElement.getName();
  252. elementText = subElement.getText();
  253. System.out.println(elementName +":"+elementText);
  254. // 如果是日期类型的字符串需要转换为日期类型
  255. if(MAP_DATE.get(elementName)!=null){
  256. //使用当前系统的时间
  257. // java.util.Date utilDate = new java.util.Date();
  258. // java.sql.Date date = new java.sql.Date( utilDate .getTime());
  259. // System.out.println("date----"+date);
  260. // pre.setDate(num,date);
  261. String temp[] = elementText.split("-");
  262. //使用下面的格式有点过时了,用Calendar对象代替了Date对象
  263. // int year = Integer.parseInt(temp[0])-1900;
  264. // int month = Integer.parseInt(temp[1])-1;
  265. // int day = Integer.parseInt(temp[2]);
  266. // Date date = new Date(year,month,day);
  267. int year = Integer.parseInt(temp[0]);
  268. int month = Integer.parseInt(temp[1])-1;
  269. int day = Integer.parseInt(temp[2]);
  270. Calendar c = Calendar.getInstance();
  271. c.set(year,day);
  272. Date date = c.getTime();
  273. java.sql.Date time = (java.sql.Date) new java.sql.Date(date.getTime());
  274. pre.setDate(num,time);
  275. }
  276. else if(MAP_INTEGER.get(elementName)!=null){
  277. pre.setInt(num,4);
  278. }else{
  279. pre.setString(num,elementText);
  280. }
  281. num++;
  282. }
  283. pre.executeUpdate();
  284. } catch (sqlException e) {
  285. e.printStackTrace();
  286. }
  287. count++;
  288. // 这个过程是为了解决一次性读取的数据量比较大,超出打开游标的最大数而抛出异常的解决办法
  289. if(count > maxCoursor){
  290. try {
  291. pre.close();
  292. pre = conn.prepareStatement(sql);
  293. } catch (sqlException e) {
  294. e.printStackTrace();
  295. }
  296. }
  297. }
  298. try {
  299. pre.close();
  300. conn.close();
  301. } catch (sqlException e) {
  302. e.printStackTrace();
  303. }
  304. }
  305. }

备注:当插入一定数量之后要关闭preparedStatement,这样是为了解决“oracle超出打开最大游标数

工具导出xml文件的格式

  1. <?xml version="1.0" ?>
  2. <ROWDATA>
  3.  
  4. <ROW>
  5. <SSID>654971292BD54071A18D8DC3124A9CD0</SSID>
  6. <NAME>huangbiao</NAME>
  7. </ROW>
  8.  
  9. <ROW>
  10. <SSID>0FF29DCB5EEC4C97A1D4EF91D04B9CC3</SSID>
  11. <NAME>biaobiao</NAME>
  12. </ROW>
  13.  
  14. </ROWDATA>

猜你在找的XML相关文章