package dao;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import com.mysql.jdbc.PreparedStatement;
public class DBandXML {
// 驱动程序名
private final String driver =
"com.mysql.jdbc.Driver";
// URL指向要访问的数据库名qt_data_newd
private final String url =
"jdbc:mysql://localhost:3306/qt_data_newd";
// 创建数据库连接
private Connection connection = null;
// MySQL配置时的用户名
private final String user = "root";
// Java连接MySQL配置时的密码
private final String password = "123456";
private int nodeCount;
// 得到数据库连接方法
public Connection getConn() {
try {
//
加载驱动程序
Class.forName(driver);
connection =
DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException
e) {
//
TODO自动生成blockStatement捕捉
e.printStackTrace();
} catch (SQLException e)
{
//
TODO自动生成blockStatement捕捉
e.printStackTrace();
}
// 返回数据库连接
return connection;
}
public static String checkXMLCharacters(String
in) {
StringBuffer out = new StringBuffer(); //用于保存输出
char current; // 用于引用当前字符。
if (in == null || ("".equals(in)))
return ""; // 空置测试.
for (int i = 0; i < in.length(); i++) {
current = in.charAt(i); // 注意:不IndexOutOfBoundsException抓住了
// 在这儿,这应该不会发生。
if ((current == 0x9) || (current == 0xA) || (current == 0xD)
|| ((current >= 0x20)
&& (current <=
0xD7FF))
|| ((current >= 0xE000)
&& (current <=
0xFFFD))
|| ((current >= 0x10000)
&& (current <=
0x10FFFF)))
out.append(current);
}
return out.toString();
}
public Document getTableInfotoXML(Connection
conn, Statement stm)
throws
SQLException {
ResultSet rs; //储存表结构
Document document =
DocumentHelper.createDocument(); //创建 document文档 储存表结构信息
Element qt_data_newElement =
document.addElement("qt_data_new"); //添加 根节点
Element
Elements=null; //用来属性储存字段名字数据类型
等。
ResultSet
rss; // 储存主键
//取主键
String PrimaryKeys =
null;
rss =
conn.getMetaData().getPrimaryKeys(null, null, "qt_data_new");
while(rss.next()){
PrimaryKeys=rss.getString(4);
}
rs = stm.executeQuery("select *
from qt_data_new limit 0,1" ); ResultSetMetaData mete =
rs.getMetaData(); //
得到结果集(rs)的结构信息,比如字段数、字段名等 boolean b;
int isnull;
for(int
y=1;y<=mete.getColumnCount();y++){ Elements=qt_data_newElement.addElement("col");
Elements.addAttribute("code",
"C"+y+"");
Elements.addAttribute("name",
mete.getColumnName(y)); //去列名(字段)
Elements.addAttribute("type",
mete.getColumnTypeName(y)); //字段类型
Elements.addAttribute("length",mete.getColumnDisplaySize(y)+"");
//字段长度
if(PrimaryKeys.equals(mete.getColumnName(y))){ //判断谁是主键
Elements.addAttribute("ispk","yes");
}else{
Elements.addAttribute("ispk","");
}
b=mete.isAutoIncrement(y); if(b==true){ //判断是否自动增长
Elements.addAttribute("Autoincr","true");
}else{
Elements.addAttribute("Autoincr","false");
}
isnull=mete.isNullable(y);
if(isnull==0){ //判断 是否 可以为空
Elements.addAttribute("isnull","NOTNULL");
}else{
Elements.addAttribute("isnull","NULL");
} }
rs.close(); rss.close();
return
document; // 返回 document文档
}
public void db_to_xml()
{
Connection conn = null; //
创建数据库连接
Statement stm = null; //
statement用来执行SQL语句
ResultSet rs = null; //
记录表中读取的数据结果集 try {
conn =
this.getConn(); // 连接数据库
Document
document = null; // 建立document对象(创建文档文件)
Element
qt_data_newElement = null ; // 建立XML文档的根qt_data_new(表名)
//
这句指定了格式化的方式为缩进式,则非紧凑式。
OutputFormat
format = OutputFormat.createPrettyPrint();
//
指定编码为UTF-8。
format.setEncoding("UTF-8");
XMLWriter
writer = null;
//
遍历RS结果集把每一行的值取出来赋给节点
stm =
conn.createStatement(); // 创建statement
rs =
stm.executeQuery("SELECT COUNT(*) FROM qt_data_new");
rs.next();
int
ResultCount = rs.getInt(1) ; //查询出表中总行数 rs.close();
int
n=10000;
int m;
Element
rowElement=null; //每一条记录
Element
element=null; //每一条记录 详细值
//每次取一万条
进行判断(ResultCount/10000 最多分多少次取)
for (int i =
0; i < ResultCount/10000+1; i++) {
m=i*10000;
if(ResultCount
m=ResultCount;
break; //当N 大于总行数是跳出循环
} document=getTableInfotoXML(conn,stm); // 获得 储存表结构的 document
qt_data_newElement=document.getRootElement(); //获得跟节点
rs
= stm.executeQuery("select * from qt_data_new limit " + m
+
"," +n+ ""); // 查询qt_data_new中的数据放入rs结果集
ResultSetMetaData
mete = rs.getMetaData(); // 得到结果集(rs)的结构信息,比如字段数、字段名等
System.out.println("生成:"+"qt_data_new"+(i+1)+".xml");
while(rs.next())
{
rowElement
= qt_data_newElement.addElement("row"); // 加入第一个row节点
for(int
y=1;y<=mete.getColumnCount();y++){ //
element
= rowElement.addElement("C"+y+""); // 字段取出作为节点的名字 ( C1:getInt()
C2:getInt() C3:getLong() 其他的getString())
element.addAttribute("V",this.checkXMLCharacters((rs.getString(mete.getColumnName(y))
+ "").trim())); // 把该字段的值取出
}
} rs.close();
writer
= new XMLWriter(new OutputStreamWriter(new
FileOutputStream("qt_data_new"+(i+1)+".xml"), "UTF-8"),
format); writer.write(document);
writer.close();
//java
虚拟机会自己调用gc()方法去释放内存。
rowElement=null;
element=null;
document=null;
qt_data_newElement=null;
System.gc();
}
} catch (Exception ex)
{
ex.printStackTrace();
} finally {
try {
if
(rs != null)
rs.close();
if
(stm != null)
stm.close();
if
(conn != null)
conn.close();
} catch
(Exception e) {
e.printStackTrace();
conn
= null;
}
}
//return true; // 返回boolben
值为true 将此值赋给 一个boolben类型后可以判断此方法是否执行
}
public void createTable(){
Connection conn = null; //
创建数据库连接
Statement stm = null; //
statement用来执行SQL语句
ResultSet rs = null; //
记录表中读取的数据结果集
try{
conn =
this.getConn(); // 连接数据库
//
遍历RS结果集把每一行的值取出来赋给节点
stm =
conn.createStatement(); // 创建statement
//创建一个SAX阅读器
SAXReader
reader = new SAXReader();
reader.setEncoding("UTF-8");
//读取XML文档赋给document
文档
Document
document=reader.read("qt_data_new1.xml");
Element root = document.getRootElement();// 得到根节点
//如果表不存在在创建表格
String sql="CREATE TABLE IF NOT EXISTS"+"
"+root.getName()+"1"+"(";
String primarykey="";
//Iterator模式 迭代器 遍历结合
//取得根节点下的所有col节点
for (Iterator i = root.elementIterator("col"); i.hasNext();)
{
Element col= (Element) i.next();
sql+="`"+col.attributeValue("name")+"`"+" ";
//判断如果字符串过大的话 类型变为TEXT
if(col.attributeValue("type").equals("VARCHAR")
&&
Integer.parseInt(col.attributeValue("length"))>1024){
//强转成整数类型
sql+="text";
}else{