相较于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"));
    }

}

下面就是运行的结果了,



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

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

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

    本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下   MySQL数据库insert和update语句引:用于操作数 ...

  2. 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

    转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...

  3. 历史上的今天mysql数据库包含详情分类以及图片

    历史上的今天mysql数据库包含详情分类以及图片 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debo71iaJ& ...

  4. .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程

    本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...

  5. saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入

    saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入salt的返回值写入mysql数据库:可参考:https://docs.saltstack.com/en/lat ...

  6. Mysql数据库写入数据速度优化

    Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1:设置为0,可以提高写入速度.  值为0:提升写入速度,但是安全方面较差,mysql服务器 ...

  7. 访问远程mysql数据库,出现报错,显示“1130 - Host'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server“

    在使用Navicat for MySQl访问远程mysql数据库,出现报错,显示“1130 - Host'xxx.xxx.xxx.xxx' is not allowed to connect to t ...

  8. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  9. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

随机推荐

  1. Python中and(逻辑与)计算法则

    在程序设计中,and称为逻辑与运算,也称布尔运算:1.and是在布尔上下文中从左到右计算表达式的值:2.0.''.[].().{}.None.False在布尔上下文中为假:其它任何东西都为真:3.如果 ...

  2. COCO 数据集的使用

    Windows 10 编译 Pycocotools 踩坑记 COCO数据库简介 微软发布的COCO数据库, 除了图片以外还提供物体检测, 分割(segmentation)和对图像的语义文本描述信息. ...

  3. Django URL (路由系统)

    URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那 ...

  4. Python3 标准库概览

    操作系统接口 os模块提供了不少与操作系统相关联的函数. >>> import os >>> os.getcwd() # 返回当前的工作目录 'C:\\Python ...

  5. Dubbo框架应用之(一)--服务体系

    Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成,也是一个非常全面的SOA基础框架.其是阿里巴巴SO ...

  6. 用Netty开发中间件:网络编程基础

    用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...

  7. Android 实现串口的移植

    安卓串口的实现,需要底层C++配合,不过这次我们根据framework中的思想,直接用API修改提供给JAVA层调用,这个就比较简单了. DEV项目需要,要实现在Android中实现串口的收发功能,有 ...

  8. PGM:部分有向模型之条件随机场与链图模型

    http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...

  9. Android开发之Path类使用详解,自绘各种各样的图形!

    玩过自定义View的小伙伴都知道,在View的绘制过程中,有一个类叫做Path,Path可以帮助我们实现很多自定义形状的View,特别是配合xfermode属性来使用的时候.OK,那我们今天就来看看P ...

  10. pandas小记:pandas数据输入输出

    http://blog.csdn.net/pipisorry/article/details/52208727 数据输入输出 数据pickling pandas数据pickling比保存和读取csv文 ...