周建儒
(四川信息职业技术学院信息工程系,广元,628040)
图片存储有两种方式:一种是将图片单独存放在固定文件夹里,数据库表中对应的字段仅保存该图片的路径和名字;这种方式实现简单,数据表中无大数据,访问速度快,但是不安全,数据维护不方便。另一种是先对图片进行编码,再将编码后的数据写到数据库表中,需要时再从数据库表中读出,然后解码生成图片文件;这种方式比较安全,数据维护方便灵活。本文针对这两种方式,用程序实例进行分析和比较。
MySQL是一个小型关系型数据库管理系统,体积小,速度快,开放源码。Mysql支持存储二进制文件的BLOB字段类型;BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,它们可容纳的最大字节数分别是255B,65K,16M,4G。
预编译语句PreparedStatement是java.sql的一个接口,也是Statement的子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS进行编译后再执行。而预编译语句是在创建PreparedStatement 对象时就指定了SQL语句,并发送给DBMS进行编译,当该编译语句被执行时,DBMS直接运行编译后的SQL语句,而不需要像其它SQL语句那样先进行编译。
预编译语句可以提高访问数据库的性能,数据库在处理SQL语句时都有一个预编译的过程,而预编译对象就是把一些格式固定的SQL语句编译后存放在数据库缓冲池中。当需要再次执行相同的SQL语句时就不再进行编译了,直接由DBMS运行SQL语句。所以当需要多次执行Statement对象的时候,使用PreparedStatement对象可以大大降低运行时间,特别是大型数据库,它可以有效地提高访问数据库的速度。
3.1.1 以二进制格式将图片写入photo表中
3.1.2 从photo表中读出图片数据,并生成图片文件
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编码,解码后重新生成图片文件
用以上两种方法在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.