Mysql数据库中存取图片的Java实现
周建儒
【摘 要】摘要:在应用程序设计中经常会遇到需要在数据库中存取图片的情况,以java和Mysql数据库为例,分别介绍了图片文件以二进制和Base64编码的数据格式在Mysql数据库中存取的方法。 【期刊名称】电子测试 【年(卷),期】2013(000)020 【总页数】2
【关键词】图片存储;Base64编码;编码与解码;预编译
图片存储有两种方式:一种是将图片单独存放在固定文件夹里,数据库表中对应的字段仅保存该图片的路径和名字;这种方式实现简单,数据表中无大数据,访问速度快,但是不安全,数据维护不方便。另一种是先对图片进行编码,再将编码后的数据写到数据库表中,需要时再从数据库表中读出,然后解码生成图片文件;这种方式比较安全,数据维护方便灵活。本文针对这两种方式,用程序实例进行分析和比较。
1 Mysql数据库
MySQL是一个小型关系型数据库管理系统,体积小,速度快,开放源码。Mysql支持存储二进制文件的BLOB字段类型;BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,它们可容纳的最大字节数分别是255B,65K,16M,4G。
2 预编译语句
预编译语句PreparedStatement是java.sql的一个接口,也是Statement的
子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS进行编译后再执行。而预编译语句是在创建PreparedStatement 对象时就指定了SQL语句,并发送给DBMS进行编译,当该编译语句被执行时,DBMS直接运行编译后的SQL语句,而不需要像其它SQL语句那样先进行编译。
预编译语句可以提高访问数据库的性能,数据库在处理SQL语句时都有一个预编译的过程,而预编译对象就是把一些格式固定的SQL语句编译后存放在数据库缓冲池中。当需要再次执行相同的SQL语句时就不再进行编译了,直接由DBMS运行SQL语句。所以当需要多次执行Statement对象的时候,使用PreparedStatement对象可以大大降低运行时间,特别是大型数据库,它可以有效地提高访问数据库的速度。
3 在Mysql数据库中存取图片的方法
3.1 以二进制格式存取图片
3.1.1 以二进制格式将图片写入photo表中
3.1.2 从photo表中读出图片数据,并生成图片文件 3.2 以Base64编码格式存取图片
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。Base64编码的基本原理是:将字符串按每3个8位(3*8=24bit)字节分为一组,把每个字符的ASCII码转换成8位二进制数,就是一组24位的字节,再把这24位分为4个6位(4*6=24bit)字节,并在每个6位的高位添加两个0,得到4个8位的字节,然后将这4个8位的字节转换成十进制数,然后对照Base64编码表得到对应的编码字符。
3.2.1 先对图片进行Base64编码,再将其写入photo表中
3.2.2 从photo表中读出图片文件的base64编码,解码后重新生成图片文件
4 总结
用以上两种方法在Mysql数据库表中存储同一个jpg格式的图片,以二进制数据格式存储占用了2562个字节,以Base64编码格式存储占用了3504个字节。可见,Base64编码后的图片数据增大,这是因为Base64编码的数据冗余比较多,编码后的数据长度是编码前长度的三分之四倍。把图片文件用base64编码后再存入数据库,会增大存储空间,延长图片访问时间,减慢系统的响应速度。Base64编码可用于HTTP环境下传递较长的标识信息。例如:在Hibernate中就把UUID编码为一个字符串,用作HTTP表单和HTTPGETURL中的参数。 参考文献
[1]Y.Daniel Liang,Java语言程序设计基础篇[M].北京:机械工业出版社,2009. [2]Paul DuBois,MySQL技术内幕(第4版)[M].北京:人民邮电出版社,2011. [3]尹继平,Java范例大全[M].北京:机械工业出版社,2009.[4]刘书伦,Java程序设计[M].北京:国防科技大学出版社,2011.
周建儒 (1980 )男,汉族,硕士,讲师,研究方向:应用程序设计与开发,软件工程
Mysql数据库中存取图片的Java实现
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)