数据库 BLOB对象

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class BlobPros {
 private static final String URL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=qhjcpt";

 private Connection conn = null;

 private PreparedStatement pstmt = null;

 private ResultSet rs = null;

 private File file = null;

 public BlobPros() {
 }

 /**
  * 向数据库中插入一个新的BLOB对象
  *
  * @param infile
  *            要输入的数据文件
  * @throws java.lang.Exception
  */
 public void blobInsert(String infile) throws Exception {
  FileInputStream fis = null;
  try {
   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
   conn = DriverManager.getConnection(URL, "sa", "");

   file = new File(infile);
   fis = new FileInputStream(file);
   // InputStream fis = new FileInputStream(infile);
   pstmt = conn.prepareStatement("insert into a(bb,aa) values(?,?)");
   pstmt.setString(1, file.getName()); // 把传过来的第一个参数设为文件名
   // pstmt.setBinaryStream(2,fis,(int)file.length());
   // //这种方法原理上会丢数据,因为file.length()返回的是long型
   pstmt.setBinaryStream(2, fis, fis.available()); // 第二个参数为文件的内容
   pstmt.executeUpdate();
  } catch (Exception ex) {
   System.out.println("[blobInsert error : ]" + ex.toString());
  } finally {
   // 关闭所打开的对像//
   pstmt.close();
   fis.close();
   conn.close();
  }
 }

 /**
  * 从数据库中读出BLOB对象
  *
  * @param outfile
  *            输出的数据文件
  * @param id
  *            要取的文件在数据库中的ID
  * @throws java.lang.Exception
  */

 public void blobRead(String outfile, int id) throws Exception {
  FileOutputStream fos = null;
  InputStream is = null;
  byte[] Buffer = new byte[4096];

  try {
   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
   conn = DriverManager.getConnection(URL, "sa", "");
   pstmt = conn.prepareStatement("select aa from a where id=?");
   pstmt.setInt(1, id); // 传入要取的图片的ID
   rs = pstmt.executeQuery();
   rs.next();

   file = new File(outfile);
   if (!file.exists()) {
    file.createNewFile(); // 如果文件不存在,则创建
   }
   fos = new FileOutputStream(file);
   is = rs.getBinaryStream("aa");
   int size = 0;
   /*
    * while(size != -1) { size = is.read(Buffer); //从数据库中一段一段的读出数据
    * //System.out.println(size); if(size != -1) //-1表示读到了文件末
    * fos.write(Buffer,0,size); }
    */
   while ((size = is.read(Buffer)) != -1) {
    // System.out.println(size);
    fos.write(Buffer, 0, size);
   }

  } catch (Exception e) {
   System.out.println("[OutPutFile error : ]" + e.getMessage());
  } finally {
   // 关闭用到的资源
   fos.close();
   if (rs != null) {
    rs.close();
   }
   pstmt.close();
   conn.close();
  }
 }

// public static void main(String[] args) {
//  try {
//           
//   BlobPros blob = new BlobPros();
//   // blob.blobInsert("e:/天气.xls");
//   blob.blobRead("d:/啊.txt", 1);
//  } catch (Exception e) {
//   System.out.println("[Main func error: ]" + e.getMessage());
//  }
// }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
环境:Windows XP professional, JDK 1.6, Eclipse 3.3 安装JDK 6.0之后会安装自带的纯Java的数据derby. 也就是说,如果安装JDK 6.0版本,那么会在客户端安装一个客户端的数据库,该数据很小4M左右,但是它可以管理15G的文档。所以,我们应用好好利用JDK自带的数据库,为应用编程的解决方案带方便。 使用步骤: 1、下载解压之后,用Eclipse导入工程 2、找到c:\Program Files\sun\JavaDB\lib之后,然后使用cmd命令进行该路径 3、在cmd窗体中输入java -jar derbyrun.jar server start启动derby数据库服务器 4、如果成功,那么在c:\Program Files\sun\JavaDB\lib目录下创建一个ij.properties文档,内容如下: ij.driver=org.apache.derby.jdbc.ClientDriver ij.protocol=jdbc:derby://localhost:1527/ ij.database=COREJAVA;create=true 5、接着打开另外一个cmd窗体,路径同上,然后输入以下命令: java -jar derbyrun.jar ij -p ij.properties 6、如果成功,那么工程中的"演示时需要的数据库脚本.sql"文档打开,拷贝也相应的SQL语句,创建应用所需要的表 7、创建表成功之后,自己写insert语句给测试数据 8、如果以上步骤完成,那么在工程中运行ShowJDBCForDerby类,你会看到一个derby数据库的使用 9、运行ShowQueryDB类,你会看到对derby数据库的新增修改操作动作,其中有写入图片到数据库的语句,以及从数据库读到图片并显示出来窗体中的语句。 阅读对象:熟悉Swing编程、JDBC编程的学员。 感觉:因为derby是纯Java的数据库,因此与应用可以无缝连接,它支持中文、图片的存贮与读取等。是一个非常好客户端数据库。该数据数应该为J2ME编程带来非常大的好处,同时也为J2SE和J2EE编程来带方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值