javaSE基础数据库操作2之数据库备份方法

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集合写入文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值