package com.lzw.dao;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
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.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.JOptionPane;
import com.lzw.Item;
import com.lzw.dao.model.TbGysinfo;
import com.lzw.dao.model.TbJsr;
import com.lzw.dao.model.TbKhinfo;
import com.lzw.dao.model.TbKucun;
import com.lzw.dao.model.TbRkthDetail;
import com.lzw.dao.model.TbRkthMain;
import com.lzw.dao.model.TbRukuDetail;
import com.lzw.dao.model.TbRukuMain;
import com.lzw.dao.model.TbSellDetail;
import com.lzw.dao.model.TbSellMain;
import com.lzw.dao.model.TbSpinfo;
import com.lzw.dao.model.TbXsthDetail;
import com.lzw.dao.model.TbXsthMain;
public class Dao {
protected static String dbClassName = "com.mysql.jdbc.Driver";// MySQL数据库驱动类的名称
protected static String dbUrl = "jdbc:mysql://127.0.0.1:3306/db_database28";// 访问MySQL数据库的路径
protected static String dbUser = "root";// 访问MySQL数据库的用户名
protected static String dbPwd = "123456";// 访问MySQL数据库的密码
protected static String dbName = "db_database28";// 访问MySQL数据库中的实例(db_database28)
protected static String second = null;//
public static Connection conn = null;// MySQL数据库的连接对象
static {// 静态初始化Dao类
try {
if (conn == null) {
Class.forName(dbClassName).newInstance();// 实例化MySQL数据库的驱动
conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);// 连接MySQL数据库
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "请将MySQL的JDBC驱动包复制到lib文件夹中。");// 捕获异常后,弹出提示框
System.exit(-1);// 系统停止运行
} catch (Exception e) {
e.printStackTrace();
}
}
private Dao() {
}
// 数据库备份
public static String backup() throws SQLException {
LinkedList<String> sqls = new LinkedList<String>();// 备份文件中的所有sql
// 涉及的相关表命数组
String tables[] = { "tb_gysinfo", "tb_jsr", "tb_khinfo", "tb_kucun",
"tb_rkth_detail", "tb_rkth_main", "tb_ruku_detail",
"tb_ruku_main", "tb_sell_detail", "tb_sell_main", "tb_spinfo",
"tb_userlist", "tb_xsth_detail", "tb_xsth_main" };
ArrayList<Tables> tableList = new ArrayList<Tables>();// 创建保存所有表对象的集合
for (int i = 0; i < tables.length; i++) {// 遍历表名称数组
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("desc " + tables[i]);// 查询表结构
ArrayList<Columns> columns = new ArrayList<Columns>();// 列集合
while (rs.next()) {
Columns c = new Columns();// 创建列对象
c.setName(rs.getString("Field"));// 读取列名
c.setType(rs.getString("Type"));// 读取列类型
String isnull = rs.getString("Null");// 读取为空类型
if ("YES".equals(isnull)) {// 如果列可以为空
c.setNull(true);// 列可以为空
}
String key = rs.getString("Key");// 读取主键类型
if ("PRI".equals(key)) {// 如果是主键
c.setKey(true);// 列为主键
String increment = rs.getString("Extra");// 读取特殊属性
if ("auto_increment".equals(increment)) {// 表主键是否自增
c.setIncrement(true);// 主键自增
}
}
columns.add(c);// 列集合添加此列
}
Tables table = new Tables(tables[i], columns);// 创建表示此表命和拥有对应列对象的表对象
tableList.add(table);// 表集合保存此表对象
rs.close();// 关闭结果集
stmt.close();// 关闭sql语句接口
}
for (int i = 0; i < tableList.size(); i++) {// 遍历表对象集合
Tables table = tableList.get(i);// 获取表格对象
String dropsql = "DROP TABLE IF EXISTS " + table.getName() + " ;";// 删除表sql
sqls.add(dropsql);// 添加删除表sql
StringBuilder createsql = new StringBuilder();// 创建表sql
createsql.append("CREATE TABLE " + table.getName() + "( ");// 创建语句句头
ArrayList<Columns> columns = table.getColumns();// 获取表中所有列对象
for (int k = 0; k < columns.size(); k++) {// 遍历列集合
Columns c = columns.get(k);// 获取列对象
createsql.append(c.getName() + " " + c.getType());// 添加列名和类型声明语句
if (!c.isNull()) {// 如果列可以为空
createsql.append(" not null ");// 添加可以为空语句
}
if (c.isKey()) {// 如果是主键
createsql.append(" primary key ");// 添加主键语句
if (c.isIncrement()) {// 如果是主键自增
createsql.append(" AUTO_INCREMENT ");// 添加自增语句
}
}
if (k < columns.size() - 1) {// 如果不是最后一列
createsql.append(",");// 添加逗号
} else {// 如果是最后一列
createsql.append(");");// 创建语句结尾
}
}
sqls.add(createsql.toString());// 添加创建表sql
Statement stmt = conn.createStatement();// 执行sql接口
ResultSet rs = stmt
.executeQuery("select * from " + table.getName());
while (rs.next()) {
StringBuilder insertsql = new StringBuilder();// 插入值sql
insertsql.append("INSERT INTO " + table.getName() + " VALUES(");
for (int j = 0; j < columns.size(); j++) {// 遍历表中所有列
Columns c = columns.get(j);// 获取列对象
String type = c.getType();// 获取列字段修饰符
if (type.startsWith("varchar") || type.startsWith("char")
|| type.startsWith("datetime")) {// 如果数据类型开头用varchar、char、datetime任意一种修饰
insertsql.append("'" + rs.getString(c.getName()) + "'");// 获取本列数据,两端加逗号
} else {
insertsql.append(rs.getString(c.getName()));// 获取本列数据,两端不加逗号
}
if (j < columns.size() - 1) {// 如果不是最后一列
insertsql.append(",");// 添加逗号
} else {// 如果是最后一列
insertsql.append(");");// 添加句尾
}
}
sqls.add(insertsql.toString());// 添加插入数据sql
}
rs.close();// 关闭结果集
stmt.close();// 关闭sql语句接口
}
sqls.add("DROP VIEW IF EXISTS v_rukuView;"); // 插入删除视图语句
// 插入创建爱视图语句
sqls.add("CREATE VIEW v_rukuView AS SELECT tb_ruku_main.rkID, tb_ruku_detail.spid, tb_spinfo.spname, tb_spinfo.gg, tb_ruku_detail.dj, tb_ruku_detail.sl,tb_ruku_detail.dj * tb_ruku_detail.sl AS je, tb_spinfo.gysname, tb_ruku_main.rkdate, tb_ruku_main.czy, tb_ruku_main.jsr,tb_ruku_main.jsfs FROM tb_ruku_detail INNER JOIN tb_ruku_main ON tb_ruku_detail.rkID = tb_ruku_main.rkID INNER JOIN tb_spinfo ON tb_ruku_detail.spid = tb_spinfo.id;");
sqls.add("DROP VIEW IF EXISTS v_sellView;");// 插入删除视图语句
// 插入创建爱视图语句
sqls.add("CREATE VIEW v_sellView AS SELECT tb_sell_main.sellID, tb_spinfo.spname, tb_sell_detail.spid, tb_spinfo.gg, tb_sell_detail.dj, tb_sell_detail.sl,tb_sell_detail.sl * tb_sell_detail.dj AS je, tb_sell_main.khname, tb_sell_main.xsdate, tb_sell_main.czy, tb_sell_main.jsr,tb_sell_main.jsfs FROM tb_sell_detail INNER JOIN tb_sell_main ON tb_sell_detail.sellID = tb_sell_main.sellID INNER JOIN tb_spinfo ON tb_sell_detail.spid = tb_spinfo.id;");
java.util.Date date = new java.util.Date();// 通过Date对象获得当前时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");// 设置当前时间的输出格式
String backupTime = sdf.format(date);// 格式化Date对象
String filePath = "backup\\" + backupTime + ".sql";// 通过拼接字符串获得备份文件的存放路径
File sqlFile = new File(filePath);// 创建备份文件对象
FileOutputStream fos = null;// 文件字节输出流
OutputStreamWriter osw = null;// 字节流转为字符流
BufferedWriter rw = null;// 缓冲字符流
try {
fos = new FileOutputStream(sqlFile);
osw = new OutputStreamWriter(fos);
rw = new