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"));
}
}
下面就是运行的结果了,
好了,大概就是这样了。虽然这种方式会导致数据的部分丢失,而且方式繁琐冗杂。个人建议使用路径的方式存储以及读取图片更为合理,且更为方便高效。
MySQL数据库写入图片并读取图片显示到JLabel上的详解的更多相关文章
- MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下 MySQL数据库insert和update语句引:用于操作数 ...
- 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...
- 历史上的今天mysql数据库包含详情分类以及图片
历史上的今天mysql数据库包含详情分类以及图片 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debo71iaJ& ...
- .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程
本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...
- saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入salt的返回值写入mysql数据库:可参考:https://docs.saltstack.com/en/lat ...
- Mysql数据库写入数据速度优化
Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1:设置为0,可以提高写入速度. 值为0:提升写入速度,但是安全方面较差,mysql服务器 ...
- 访问远程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 ...
- MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动
MVC图片上传详解 MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
随机推荐
- 含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解
版权声明:本文为博主原创文章,博客地址:,欢迎大家相互转载交流. 使用R语言做逻辑回归的时候,当自变量中有分类变量(大于两个)的时候,对于回归模型的结果有一点困惑,搜索相关知识发现不少人也有相同的疑问 ...
- JavaScript中的事件模型
JS中的事件 1.鼠标事件 onclick ondbclick onmouseover onmouseout 2.HTML事件 onload onunload onsubmit ...
- Java第4次实验提纲(面向对象2-继承、多态、抽象类与接口与Swing)
PTA 题集面向对象2-进阶-多态接口内部类 第1次实验 1.1 题集5-1(Comparable) 难点:如果传入对象为null,或者传入对象的某个属性为null,怎么处理? 1.2 题集5-2(C ...
- 【java集合系列】---HashSet
在前面的博文中,小编主要简单介绍了java集合中的总体框架,以及list接口中典型的集合ArrayList和LinkedList,接着,我们来看set的部分集合,set集合和数学意义上的集合没有差别, ...
- Android开发技巧——Camera拍照功能
本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...
- Mac入门
Mac入门 桌面 windows桌面有图标罗列 Mac桌面有Dock 菜单栏 感觉上和Windows系统的底部菜单栏有点像,但是却略有不同,Mac的菜单栏默认在顶部 左侧的一些功能是固定不变的,跟随当 ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
- 为什么函数式编程可以没有while?
以前想不通,今天在写代码时不知怎么的,偶然就发现了答案.. 比如说把某个字符串s中所有"00"及更长的'00'统统换为'0'.最后结果中不能包含'00'. 00001100--&g ...
- ORACLE时间日期格式使用总结(参考网上资料汇总)
Oracle时间日期操作 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟 ...
- svn数据仓库配置,权限配置
svn服务的开启有两种方式, · 自带的svnserve服务(访问地址类似于svn://192.168.80.18/repos/) · 与Apache配合使用 (访问地址 ...