处理Blob类型数据()

【处理Blob类型数据()】处理Blob类型数据:
(1)Blob(Binary long Object)是二进制长对象的意思,Blob通常用于存储大文件,典型的Blob内容是一张图片或者一个声音文件,由于他们的特殊性,必须使用特殊的方式来存储。使用Blob列可以把照片声音等文件的二进制数据保存在数据库里,并可以从数据库里恢复指定文件。
(2)如果需要将图片插入数据库,显然不能通过普通的SQL语句来完成,因为有一个关键的问题,Blob常量无法表示,所以将Blob数据插入数据库需要使用PreparedStatement。该对象有一个方法:setBinaryStream(int parameterIndex ,InputStream x) 该方法可以为指定参数传入二进制流,从而可以实现将Blob数据保存到数据库的功能。
(3)当需要从ResultSet里取出Blob数据时,可以调用ResultSet的getBlob(int columnIndex)方法,该方法将返回一个Blob对象Blob对象提供了getBinaryStream()方法获取该获取该Blob数据的输入流,也可以使用Blob对象的getBytes()方法直接取出该Blob对象封装的二进制数据
(4)实例程序:
为了把图片放入数据库,本程序先使用如下SQL语句来建立一个数据表:
create table img_table
{
img_id int auto_increment primary key,
img_name varchar(255),
#创建一个mediumblob类型的数据列,用于保存图片数据
ima_data mediumblob
};
**img_data 列使用mediumblob类型,而不是blob类型。因为MySQL数据库里的blob类型最多只能存储64kb的内容,所以使用mediumblob类型,该类型可以存储16M内容。
**下面程序可以实现图片上传,实际就是将图片保存到数据库,并在右边的列表框中显示图片的名字,当用户双击列表框中的图片名时,左边窗口将显示该图片,实质就是根据选中的ID从数据库中查找图片,并将其显示出来。

import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Properties; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.filechooser.FileFilter; import com.mysql.jdbc.Blob; import com.mysql.jdbc.Statement; public class BlobTest { JFramejf =new JFrame("图片管理程序"); //private static Connectionconn; private static PreparedStatement insert; private static PreparedStatement query; private staticPreparedStatement queryAll; //定义一个DefaultListModel对象 privateDefaultListModel imageModel =new DefaultListModel<>(); private JList imageList = new JList<>(imageModel); private JTextFieldfilePath =new JTextField(26); privateJButtonbrowserBn =newJButton("..."); privateJButtonuploadBn=new JButton("上传"); privateJLabel imageLabel=new JLabel(); //以当前路径创建文件选择器 JFileChooserchooser=new JFileChooser("."); //创建文件过滤器 ExtensionFileFilter filter=newExtensionFileFilter(); static { try{ Propertiesprops=new Properties(); props.load(new FileInputStream("mysql.ini")); String driver =props.getProperty("driver"); Stringurl =props.getProperty("url"); String user=props.getProperty("user"); Stringpass=props.getProperty("pass"); Class.forName(driver); //获取数据库连接 Connection conn=DriverManager.getConnection(url, user, pass); //创建执行插入的PrepareStatement对象,该对象执行插入后可以返回自动上生成的主键 insert =conn.prepareStatement("insert into img_table"+" values(null,?,?)", Statement.RETURN_GENERATED_KEYS); //创建两个prepareStatement对象,用于查询指定图片,所有图片 query =conn.prepareStatement("selectimg_datafromimg_table" +"where img_id=?"); queryAll=conn.prepareStatement("selectimg_id,"+"img_namefromimg_table"); }catch (Exceptione){ e.printStackTrace(); }}publicvoidinit()throwsException { //初始化文件选择器 filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("gif"); filter.addExtension("png"); filter.setDescription("图片文件(*.jpg,*.jpeg,*.gif,*.png)"); //禁止显示 “所有文件选项” chooser.setAcceptAllFileFilterUsed(false); //初始化程序界面fillListModel(); filePath.setEditable(false); //只能单选 imageList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JPaneljp=new JPanel(); jp.add(filePath); jp.add(browserBn); browserBn.addActionListener(event ->{ //显示对话框 intresult=chooser.showDialog(jf, "浏览图片文件上传"); //如果用户选择了APPROVE按钮,即打开,保存按钮 if(result == JFileChooser.APPROVE_OPTION); { filePath.setText(chooser.getSelectedFile().getPath()); } }); jp.add(uploadBn); uploadBn.addActionListener(avt-> { //如果上传的文本框有内容 if(filePath.getText().trim().length()>0){ //将指定的文件保存到数据库 upload(filePath.getText()); //清空文本框内容 filePath.setText(""); } }); JPanelleft=newJPanel(); left.setLayout(new BorderLayout()); left.add(new JScrollPane(imageList), BorderLayout.CENTER); left.add(jp, BorderLayout.SOUTH); jf.add(left); imageList.setFixedCellWidth(160); jf.add(new JScrollPane(imageList), BorderLayout.EAST); imageList.addMouseListener(new MouseAdapter() { public voidmouseClicked(MouseEvent e){ //如果鼠标双击 if(e.getClickCount()>=2){ //取出选中的List项 ImageHoldercur= (ImageHolder) imageList.getSelectedValue(); //显示选中项对应的Image try { showImage(cur.getId()); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }); jf.setSize(620, 400); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); }//——————————查找img_table填充ListModel publicvoidfillListModel() throws Exception{ //执行查询 ResultSetrs=queryAll.executeQuery(); //先清除所有元素 imageModel.clear(); //把查询的傲记录全部添加到ListModel中 while(rs.next()){ imageModel.addElement(new ImageHolder(rs.getInt(1),rs.getString(2))); } }//将指定文件放入数据库 public void upload(String fileName) throws Exception{ //截取文件名 StringimageName=fileName.substring(fileName.lastIndexOf("\\")+1,fileName.lastIndexOf('.') ); Filef=new File(fileName); InputStreamis =newFileInputStream(f); { insert.setString(1, imageName); insert.setBinaryStream(2, is, (int)f.length()); int affect=insert.executeUpdate(); if (affect==1){ fillListModel(); } } }//根据图片ID来显示图片 public void showImage(int id)throwsException{ //设置参数 query.setInt(1, id); ResultSetrs=query.executeQuery(); if(rs.next()){ //取出Blob列 java.sql.Blob imgBlob=rs.getBlob(1); //取出Blob列的数据 ImageIconicon=new ImageIcon(imgBlob.getBytes(1L, (int)imgBlob.length())); imageLabel.setIcon(null); } }public static void main(String[]args){ new BlobTest().init(); }//创建FileFilter的子类,用于实现文件过滤的功能 classExtensionFileFilter extends FileFilter { privateStringdescription=""; privateArrayListextensions =new ArrayList<>(); //自定义方法,用于添加文件扩展名 public voidaddExtension(Stringextension) { if(! extension.startsWith(".")){ extension="." +extension; extensions.add(extension.toLowerCase()); } }//用于设置该文件过滤器的描述性文本 publicvoidsetDescription (StringaDescription) { description=aDescription; }//继承FileFilter必须实现的抽象方法,判断该文件过滤器是否接受该文件 @Override public boolean accept(File f) { // TODO Auto-generated method stub //如果该文件是路径,则接受该文件 if(f.isDirectory()) return true; //将文件名转为小写(全部转化为小写后,用于忽略文件名的大小写) String name=f.getName().toLowerCase(); //遍历所有的扩展名,如果扩展名相同,则文件可以被接受 for(Stringextension :extensions){ if(name.endsWith(extension)) { returntrue; } } return false; } //继承FileFilter类必须实现的抽象方法,返回该文件过滤器的描述文本 @Override public String getDescription() { // TODO Auto-generated method stub return description; }}//创建一个ImageHolder类,用于封装图片名,图片IDclassImageHolder { //封装图片的ID privateintid; //封装图片的名字 privateString name; public ImageHolder(){}public ImageHolder(int id,String name){ this.id=id; this.name=name; } //id的setter和getter方法 public void setId(int id){ this.id=id; }publicint getId() { return this.id; } //name的setter和getter方法 public void setName(Stringname){ this.name=name; } public String getName(){ returnthis.name; }//重写toString方法,返回图片名publicStringtoString(){ return name; } }}

    推荐阅读