java中简单数据库操作之数据库备份方法
- 流程
接上一篇内容,这是Dao(数据类操作类)的一个数据库备份方法
方法思想:如果人要去创造一个一模一样的Sq文件要怎么做呢,可以直接复制,还可以在数据库按照先前创造表的步骤重来一遍,这就是本次代码的思想,将一个要备份的表用sql表示,进而写入文件中
// 数据库备份
/*
此段代码要对应上一篇的Dao类看,这只是一个方法,一些类在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_datail","tb_rkth_main",
"tb_ruku_detail","tb_ruku_main","tb_sell_detail","tb_sell_detail","tb_spinfp",
"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(); //sql接口 conn为Connection类 Statement由Connection的createStatement方法构造
ResultSet rs=stmt.executeQuery("desc"+tables[i]);
//desc表示显示表结构
/*resultset返回一个结果集,相当于一个表结构,
并提供指针
*/
ArrayList<Columns> columns=new ArrayList<Columns>();//列集合
while(rs.next()){ //rs.next()表示表的下一行
Columns c=new Columns();
c.setName(rs.getString("Field")); //依照表中的列名设定
c.setType(rs.getString("Type")); //getstring()表示获得这一行某一列的值,参数可以为列名(string类)或列的编号(int类)
String isnull=rs.getString("Null");
if("YES".equals(isnull)){ //判断是否为空
c.setisNull(true);
}
String key=rs.getString("Key");
if("PRI".equals(key)){ //判断是否为主键
c.setisKey(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集合中添加删除sql语句
StringBuilder createsql=new StringBuilder();
/*StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
要先创捷一个实例对象
*/
createsql.append("Create table"+table.getName()+"("); //创建表的sql语句
ArrayList<Columns> columns=table.getcolumns(); //获取表中的所有列对象
for(int k=0;k<columns.size();k++){
Columns c=columns.get(k); //获取一个列对象
createsql.append(c.getName()+" "+c.getType()); //添加创建表的sql语句
if(!c.getisNull()){ //如果列不为空
createsql.append(" not null ");
}
if(c.getisKey()){ //如果是主键
createsql.append(" primary key ");
}
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();
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")){
insertsql.append("'"+rs.getString(c.getName())+"'");
}else {
insertsql.append(rs.getString(c.getName()));
}
if(j<columns.size()-1){
insertsql.append(",");
}else{
insertsql.append(");");liuc
}
}//列循环
}//赋值循环
rs.close();
stmt.close();
}//表循环结束
//删除ruku视图 先清空视图
sqls.add("drop view if exists v_rukuView");
//插入ruku视图
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 INNEER JOIN tb_spinfo ON tb_ruku_detail.spid=tb_spinfo_id");
//删除sell视图 先清空视图
sqls.add("drop view if exists v_sellView");
//插入sell视图
sqls.add("create view v_sellView AS select tb_sell_main.sellID,tb_spinfo.spname,tb_sell_detail.spid,tb_sell_detail.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 tb_sell_main ON tb_sell_detail.sellID=tb_sell_main.sellID INNER JOIN tb_spinfo ON tb_sell_detail.spid=tb_spinfo.id");
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd_HHmmss");
String backupTime=sdf.format(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 BufferedWriter(osw);
for(String tmp:sqls){
rw.write(tmp);
rw.newLine();
rw.flush();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(rw!=null){
try {
rw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(osw!=null){
try {
osw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return filepath;
}
流程
1.创建一个LinkedList集合,保存sql语句
2.命名一个表名数组,其中为要备份表的表名
3.创建一个表对象集合
4.遍历表名数组
4.1 查询表结构,创建列集合
4.2 将表中的列的属性(对应Columns的属性)传入列集合
4.3构造一个Tables类(对应上一篇的Tables类,参数为表名和列集合),将此Tables类加入表集合
5.遍历表集合,将表集合的值转换为sql语句,将sql加入sql集合
6.创建视图等sql语句,将sql加入sql集合
6.将sqls集合写入文件