最近老师要求做一个数据库备份的程序,然后给了一个sqlite-jdbc-3.7.2.jar包作为工具。 然后是写操作 最后输出是这样的: 数据是保存了,但最后查看数据库大小,你还是会发现备份数据库和源数据库大小不一样。这无可厚非,毕竟人家是Blob,你给人家整成了bytes,就好比你逼着一个壮汉穿裙子,穿完了裙子给他拍照又觉得他没有爷们气质一样,这样是不对的。 以上就是本期节目的全部内容,我是无味的辣椒酱,关注我,你啥也学不到,略略略~
因为要求必须用Java实现,所以dump或者命令行之类的骚操作就不提了,这里也不谈怎么备份数据库的细节,实现方法有很多种,大家随意。
但是这个包似乎有一个Bug,就是当你使用ResultSet.getBlob()时它就会报错:
看一下源码,原来是这个方法没实现。
这就很头疼,因为Blob没法通过ResultSet来读取了,更别谈写入了。
所以我换了个方法,通过Statement来读取Blob数据,并用byte数组保存,用文件的输入输出流来实现读写操作。具体方法如下:ResultSet rss = null; try { FileOutputStream fos = null; File f = new File("blob.chm"); //把数据保存为chm文件 if(!f.exists()) { f.createNewFile(); } fos = new FileOutputStream(f); byte[] buffer; int len = 0; for(int i = 0; i < number.length; i++) { len += number[i]; //number是用来判断有多少个Blob变量,以及每一种变量有多少个的 } BYTES = new int[len + 2]; BYTES[0] = 0; Statement pre = con.createStatement(); String sql = "SELECT 1 FROM 2"; //这里我不用preparedStatement不是舍近求远 //而是在SELECT 后面跟着参数的话preparedStatement这东西会报错 //目前我只在我的电脑上试了,不知道是我的问题还是包的问题 //不过效果都是一样的,就是麻烦了些 int k = 0; //用来标记读到第几个变量了 for (int i = 0; i < 2; i++) { String head = hblob.get(mark - 1); //hblob是blob变量的行名称,tblob是blob变量所在的表的名称 sql = sql.replaceAll("1", hblob.get(k)); sql = sql.replaceAll("2", tblob.get(k)); System.out.println(sql); rss = pre.executeQuery(sql); while(rss.next()) { buffer = rss.getBytes(head); //读数据 fos.write(buffer, 0, buffer.length); BYTES[k + 1] = buffer.length; System.out.println(buffer + " " + buffer.length + " " + BYTES[k]); k++; } //重新初始化语句=-=莫得办法~ sql = "SELECT 1 FROM 2"; } fos.close(); pre.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
File InsertFile = new File("blob.chm"); //眼熟么,刚才保存的老朋友 String update = "UPDATE 1 SET 2 = (?) WHERE ? = ?;"; //preparedStatement这里受到了极大的侮辱 PreparedStatement sta = null; int bytesCounter = 0;//计算该从哪个字节开始读 try { FileInputStream fis = new FileInputStream(InsertFile); //这里必须用Integer,除了你抱着可能不会溢出的侥幸心理 byte[] bs = new byte[Integer.parseInt("" + InsertFile.length())]; for(int i = 0, k = 0; i < number.length; i++) { for(int j = 0; j < number[i]; j++, k++) { //原汁原味的老方法 update = update.replace("1", tblob.get(k)); update = update.replace("2", hblob.get(k)); sta = conn.prepareStatement(update); sta.clearParameters(); bytesCounter += BYTES[k]; System.out.println(bs + " " + bytesCounter + " " + BYTES[k + 1]); fis.read(bs, bytesCounter, BYTES[k + 1]); //BYTES是我用来标记每个Blob数据占了多少字节的数组 //之所以从k+1开始算是因为方便循环计算,我把BYTES[0]设成了0 sta.setBytes(1, bs); //这里得用setBytes。别手滑写成了setString //不过我没有试过用setBlob //毕竟get都不行,我凭什么相信它的set呢 sta.setString(2, chblob.get(k)); sta.setString(3, cblob.get(k)); sta.executeUpdate(); //执行更新 bs = new byte[Integer.parseInt("" + InsertFile.length())]; } } fis.close(); sta.close(); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } }
-------------------------------------------------------------------------------- *** Get Blob *** SELECT Picture FROM Categories [B@7506e922 10746 0 [B@4ee285c6 10746 10746 [B@621be5d1 10746 10746 [B@573fd745 10746 10746 [B@15327b79 10746 10746 [B@4f2410ac 10746 10746 [B@722c41f4 10746 10746 [B@5b80350b 10746 10746 SELECT Photo FROM Employees [B@5d6f64b1 21626 10746 [B@32a1bec0 21626 21626 [B@22927a81 21722 21626 [B@78e03bb5 21626 21722 [B@5e8c92f4 21626 21626 [B@61e4705b 21626 21626 [B@50134894 21626 21626 [B@2957fcb0 21626 21626 [B@1376c05c 21626 21626 -------------------------------------------------------------------------------- *** Update Blob *** [B@51521cc1 0 10746 [B@1b4fb997 10746 10746 [B@deb6432 21492 10746 [B@28ba21f3 32238 10746 [B@694f9431 42984 10746 [B@f2a0b8e 53730 10746 [B@593634ad 64476 10746 [B@20fa23c1 75222 10746 [B@3581c5f3 85968 21626 [B@6aa8ceb6 107594 21626 [B@2530c12 129220 21722 [B@73c6c3b2 150942 21626 [B@48533e64 172568 21626 [B@64a294a6 194194 21626 [B@7e0b37bc 215820 21626 [B@3b95a09c 237446 21626 [B@6ae40994 259072 21626
但字节转Blob也很好实现,毕竟咱这读取写入的数据都是一份一份的,没有黏成一坨,所以大家怎么高兴怎么来就行。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算