MySQL数据库写入图片并读取图片显示到JLabel上的详解

相较于Oracle,MySQL作为一个轻量级的开源的数据库,可谓是大大简化了我们的操作。这次我就来写一个关于数据库存入图片,获取图片的例子吧,也为了今后的复习使用。(我们一般采取存入路径的方式,而不是直接存储字节的方式,毕竟读取的时候还要通过字节读取,并做一些转换,这真的是太麻烦了,但是咧,这次就来个麻烦的吧,咱们用字节的方式)
首先我们需要在MySQL数据库中创建好我们所需要的表
,下面就是正式的编码了,我们需要一个数据库专用类,用于对数据库的一些操作,我称之为DBUtils

package DBUtils;

import java.sql.DriverManager;
import java.sql.SQLException;

import com.mysql.jdbc.*;
public class ConnectionToMySQL {

    private String DRIVER,name,password;

    public ConnectionToMySQL() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String []args){
        getConnection();
    }

    public static Connection getConnection(){
        Connection conn=null;
        try {
            String DRIVER="com.mysql.jdbc.Driver";
            String url="jdbc:mysql://localhost:3306/tiger";
            Class.forName(DRIVER);
            conn=(Connection) DriverManager.getConnection(url, "root", "mysql");

            System.out.println("Succeed in Connect to your Database!");

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }

}

很明显,接下来就是往数据库存入我们的图片了,代码如下,

import java.sql.SQLException;

import DBUtils.ConnectionToMySQL;

import com.mysql.jdbc.PreparedStatement;

public class SaveImage {

    public SaveImage() {
        // TODO Auto-generated constructor stub
    }

    public static String insertImage(){
        String flag="";
        String sql="insert into tiger.ImageTable values(?,?)";
        try {
            PreparedStatement ps=(PreparedStatement) ConnectionToMySQL.getConnection()
                    .prepareStatement(sql);
            ps.setString(1, "mySelf");
            ps.setString(2, "image1");

            ps.execute();
            if(ps.execute()){
                flag="成功插入数据!!!";
            }else{
                flag="抱歉,未能 成功插入数据!!!";
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return flag;
    }

}

再然后就是读取图片,或者写入到本地文件下(请注明路径和文件名称,因为等会我们要使用哟),代码如下:

package image;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.ResultSet;
import java.sql.SQLException;

import DBUtils.ConnectionToMySQL;

import com.mysql.jdbc.Blob;
import com.mysql.jdbc.PreparedStatement;

public class GetImage {

    public GetImage() {
        // TODO Auto-generated constructor stub
    }

    /**
     * 这二个方法仅仅是测试我们的数据库中到底有什么值,并没有什么大的用处
     * @return
     */
    public static String getAndRead(){
        String flag="";
        String sql="select * from ImageTable";
        try{
            PreparedStatement ps=(PreparedStatement) ConnectionToMySQL.getConnection()
                .prepareStatement(sql);
            ResultSet rs=ps.executeQuery();

            while(rs.next()){
                System.out.print(rs.getString("name")+"\t");
                System.out.println(rs.getString("image"));
            }
        }catch(SQLException e){
            e.printStackTrace();
        }catch(Exception ee){
            ee.printStackTrace();
        }

        return flag;
    }

    /**
     * 读取数据库中的blob类型的图片文件,并存储到本地
     * @throws SQLException
     */
    public static void SetBlobToFile() throws SQLException{
        InputStream bb=null;
        String sql="select image from ImageTable where name='mySelf';";
        try{
            PreparedStatement ps=(PreparedStatement) ConnectionToMySQL.getConnection()
                .prepareStatement(sql);
            ResultSet rs=ps.executeQuery();
            rs.next();
            bb=rs.getBinaryStream("image");
            FileOutputStream os = new FileOutputStream("F:\\target"+".jpg");
            byte[] buff = new byte[1024];
            os.write(buff);
            rs=null;
            System.out.println("图片文件写入本地成功!");
        }catch(SQLException e){
            e.printStackTrace();
        }catch(Exception ee){
            ee.printStackTrace();
        }
    }

}

下面开始进行整体的存储吧:

package image;

import java.sql.SQLException;

public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) throws SQLException {
        // TODO Auto-generated method stub
        System.out.println("程序开始!");
        SaveImage.insertImage();
        GetImage.getAndRead();
        GetImage.SetBlobToFile();
        System.out.println("程序结束!");
    }

}

运行结果:
Succeed in Connect to your Database!
Doge doge.gif
mySelf image1.jpg
Succeed in Connect to your Database!
图片文件写入本地成功!
程序结束!

好了,完事具备,就差对我们的成果进行检验了,下面请看一个Demo,就是使用我们从数据库中获取到的图片的使用案例,代码如下:

package image;

import java.awt.BorderLayout;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class PictureInstance extends JFrame {

    private JLabel label;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new PictureInstance();
    }

    public PictureInstance(){
        label=new JLabel();

        this.setSize(500,400);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.add(label,BorderLayout.CENTER);
        label.setIcon(new ImageIcon("F:\\target.jpg"));
    }

}

下面就是运行的结果了,

好了,大概就是这样了。虽然这种方式会导致数据的部分丢失,而且方式繁琐冗杂。个人建议使用路径的方式存储以及读取图片更为合理,且更为方便高效。

时间: 2024-07-29 03:42:55

MySQL数据库写入图片并读取图片显示到JLabel上的详解的相关文章

MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下   MySQL数据库insert和update语句引:用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE. 用 于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的S

MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解_Mysql

MySQL数据库insert和update语句引:用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE. 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就 是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UP

关于二进制存储图片和读取图片的问题

问题描述 关于二进制存储图片和读取图片的问题 如何将图片以二进制的形式存入数据库中 在二进制的形式读取出来 求代码 解决方案 以二进制进行存储和读取图片以二进制进行存储和读取图片.NET中二进制图片的存储与读取 解决方案二: public byte[] ImageConvertToByte(string filepath) { //filepath = @"E:/e.jpg"; FileStream fs = new FileStream(filepath, FileMode.Open

各位高手好:小弟有个问题很困惑。Infragistics 中 WebCombo里绑定一个webgrid,webgrid图片默认怎么能显示在WebCombo上。谢谢!!!

问题描述 各位高手好:小弟有个问题很困惑.Infragistics中WebCombo里绑定一个webgrid,webgrid图片默认怎么能显示在WebCombo上.谢谢!!!我是刚来CSDN,手里分数不多,给大家的分也不多,还请理解.

数据库 c#-C#是如何把数据库的数据调用的,显示在网页上

问题描述 C#是如何把数据库的数据调用的,显示在网页上 我的问题是一定是整个表的显示吗?还是可以显示部分列名,现在这点有人解答吗,坐等 解决方案 很简单,你查询的时候可以选指定的类 select * from table这是查询全部数据 select id, name, age from table,这是选择其中的三列 解决方案二: 可参考以下链接 怎么用C#在网页中显示数据库的数据http://zhidao.baidu.com/question/18290402.html C#中如何查询数据库

让picturebox中的图片任意旋转一定角度的方法,求详解!!!!

问题描述 让picturebox中的图片任意旋转一定角度的方法,求详解!!!! 让指针旋转 求大牛指点 !! 谢谢了 解决方案 两种方法:1,指针图片旋转,也就是用图像处理的技术让图片旋转:2,直接旋转pictureBox,设置pictureBox的相关旋转属性. 解决方案二: public Bitmap Rotate(Bitmap b, int angle) { angle = angle % 360; //弧度转换 double radian = angle * Math.PI / 180.

mysql数据库插入速度和读取速度的调整记录_Mysql

(1)提高数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作.这次修改了下面四个配置项: 1)将 innodb_flush_log_at_trx_commit 配置设定为0:按过往经验设定为0,插入速度会有很大提高. 0: Write the log buffer to the log file and flush the log file every second, but do nothing at transaction commit.

Android应用中图片浏览时实现自动切换功能的方法详解_Android

先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com.chenzheng_java; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.V

js显示动态时间的方法详解_javascript技巧

本文实例讲述了js显示动态时间的方法.分享给大家供大家参考,具体如下: Date对象的方法 Date 对象能够使你获得相对于国际标准时间(格林威治标准时间,现在被称为 UTC-Universal Coordinated Time)或者是 Flash 播放器正运行的操作系统的时间和日期.要使用Date对象的方法,你就必须先创建一个Date对象的实体(Instance). Date 对象必须使用 Flash 5 或以后版本的播放器. Date 对象的方法并不是静态的,但是在使用时却可以应用于所指定的