近日,在项目中涉及到大数据在mysql中的存储,在网上查阅了些资料,加上自己处理问题的过程,在此进行总结

一、MySQL BLOB 类型介绍
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob、LongBlob),除了在存储的最大信息量上不同外,他们是等同的。

MySQL的四种BLOB类型
类型  大小(单位:字节)
TinyBlob  最大 255B
Blob  最大 65K
MediumBlob  最大 16M
LongBlob  最大 4G

实际使用中根据需要存入的数据大小定义不同的BLOB类型。需要注意的是:如果你存储的文件过大,数据库的性能会下降很多。

二、mysql中的blob存取

create table Dish {

int id;

blob photo;

};

下面是从数据库里写的方法:

         String filepath = (String)session.getAttribute("file");//这里获得的是用jspsmartupload上传的文件的路径
          File file = new File(filepath);
          FileInputStream fin = new FileInputStream(file);
     
          dataBS = new blobConn();  
          con = dataBS.getConn();

          String erpsql = "insert into Dish values(?,?)";
          PreparedStatement stmt = con.prepareStatement(erpsql);
          stmt.setString(2,String.valueOf(id));
          stmt.setBinaryStream(3,fin,(int)file.length());//想数据库里插入是很简单的,就一行,但这种方法只有mysql可以用
          stmt.executeUpdate();
                           
          fin.close();
          stmt.close();
          con.close();

在本人的项目中,需要对byte[]进行存储,因此涉及到byte[]与blob的转换问题

我们看到对于blob写入的方法setBinaryStream参数的设置,第二项只要是INputStream类型即可,在项目中,已经得到了byte[]message,因此对message进行转换

       ByteArrayInputStream byteIn = new ByteArrayInputStream(messages);

      这样就可以得到能够对blob进行写入的数据格式,然后

      stmt.setBinaryStream(3,byteIn);  //完成对数据库中插入blob

下面是从数据库里读的方法:

1.BufferedInputStream inputimg = null;

try {

Connection con = sqlDS.getConnection();//简写,获得数据库连接

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("select from Dish where id = 11");

if(rs.next()){

java.sql.Blob blob = (java.sql.Blob)rs.getBlob("photo");  //获取blob数据,也可以使用rs.getBlob(1);

input = new BufferedInputStream(blob.getBinaryStream);

}

BufferedImage image = null;

image = javax.imageio.ImageIo.read(input);

ServlerOutputStream sos = response.getOutputStream();

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);

encoder.encode(image);

input.close();

}catch(Exception e) {

e.printStackTrace();

}

2.

if(rs.next()){

    res.setContentType ("image/jpeg;charset=GB2312");//HttpServletResponse res
    ServletOutputStream out = res.getOutputStream ();
  
    BufferedInputStream jpgData = new BufferedInputStream (rs.getBinaryStream ("photo"));
    byte [] buf = new byte [4*1024];
    int len;

    if(jpgData.available () <= 0x0)//判断数据库里存放图片的字段是否有值,可以进行其他处理
     res.sendRedirect ("/images/nophoto.gif");
   
    while((len = jpgData.read (buf, 0, buf.length)) != -1)
     out.write (buf, 0, len);

}

3.

if(rs.next()){

        res.setContentType("image/jpeg"); 
        ServletOutputStream   out=res.getOutputStream(); 
        InputStream   in=rs.getBinaryStream("photo"); 
        byte   buff[]=new   byte[1024]; 
        int   i; 
        while((i=in.read(buff))!=-1){  
              out.write(buff); 
        } 
        in.close();  
        out.close();

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐