JDBC:数据库操作:BLOB数据处理
CLOB主要保存海量文字,而BLOB是专门保存二进制数据:包括,图片,音乐,影片。等。
在MYSQL中,BLOB类型使用LONGBLOB声明,最高可存储4G内容。
创建一个表:
create table userblob ( id int(4) primary key not null auto_increment, name varchar(30), photo longblob );
代码:
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileInputStream ; import java.io.InputStream ; public class BlobDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 PreparedStatement pstmt = null ; String name = "小华" ; String sql = "INSERT INTO userblob(name,photo) VALUES (?,?) " ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; File f = new File("d:" + File.separator + "图片1.JPG") ; // 图片文件 InputStream input = null ; input = new FileInputStream(f) ; pstmt.setString(1,name) ; // 设置第一个“?”的内容 pstmt.setBinaryStream(2,input,(int)f.length()) ; // 设置输入流 pstmt.executeUpdate() ; // 更新数据库 pstmt.close() ; conn.close() ; // 数据库关闭 } };
查询执行结果:
图片肯定是无法查询出来的,所以应该将图片读取出来,另存一个其他文件。
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileOutputStream ; import java.sql.ResultSet ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 PreparedStatement pstmt = null ; ResultSet rs = null ; int id = 1 ; String sql = "SELECT name,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 执行查询 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; InputStream input = rs.getBinaryStream(2) ; File f = new File("d:" + File.separator + "load图片1.gif") ; // 图片文件 OutputStream out = null ; out = new FileOutputStream(f) ; int temp = 0 ; while((temp=input.read())!=-1){ // 边读边写 out.write(temp) ; } input.close() ; out.close() ; } pstmt.close() ; conn.close() ; // 数据库关闭 } };
处理后,在D文件夹中发现文件,表示,读取成功。
以上程序是通过IO的操作流读取的
为了方便读取,JAVA专门的提供了BLOB类进行二进制文件的读取操作。
BLOB类
BLOB类提供了以下方法:
操作范例代码如下:
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.sql.Blob ; import java.sql.ResultSet ; import java.io.File ; import java.io.FileOutputStream ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 PreparedStatement pstmt = null ; ResultSet rs = null ; int id = 1 ; String sql = "SELECT name,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 执行查询 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; Blob b = rs.getBlob(2) ; File f = new File("d:" + File.separator + "load图片2.gif") ; // 图片文件 OutputStream out = null ; out = new FileOutputStream(f) ; out.write(b.getBytes(1,(int)b.length())) ; out.close() ; } pstmt.close() ; conn.close() ; // 数据库关闭 } };
操作结果:
发现成功读取并创建了文件。
使用BLOB会比较简单一些,但是从实际角度,把大文件存在数据库中是很不明智行为。往往采用映射路径方式完成。