JDBC 操作BLOB类型字段

MySQL BLOB类型

  • MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
  • 插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。
  • MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
    在这里插入图片描述
  • 实际使用中根据需要存入的数据大小定义不同的BLOB类型。
  • 需要注意的是:如果存储的文件过大,数据库的性能会下降。
  • 如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数: max_allowed_packet=16M。同时注意:修改了my.ini文件之后,需要重新启动mysql服务。

创建的表数据类型:
在这里插入图片描述

向数据表中插入大数据类型:

package com.atguigu5.blob;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.atguigu3.bean.Customer;
import com.atguigu3.util.JDBCUtils;

/*
 * 测试使用PreparedStatement操作Blob类型数据
 */
public class BlobTest {
	
	//向customers中插入Blob类型字段
	@Test
	public void testInsert() throws Exception {
		Connection conn = JDBCUtils.getConnectio();
		
		String sql="insert into customers(name,email,birth,photo)values(?,?,?,?)";
		PreparedStatement ps = conn.prepareStatement(sql);
		
		ps.setObject(1,"妲己");
		ps.setObject(2,"daji@163.com");
		ps.setObject(3,"2000-03-01");
		FileInputStream is= new FileInputStream(new File("01.jpg"));
		ps.setBlob(4, is);
		ps.execute();
		JDBCUtils.closeResource(conn, ps);
	}
	
	//查询customers中的Blob字段
	@Test
	public void testQuery()   {
		Connection conn=null;
		PreparedStatement ps=null;
		InputStream is=null;
		FileOutputStream fos=null;
		ResultSet rs=null;
		try {
			conn = JDBCUtils.getConnectio();
			String sql="select id,name,email,birth,photo from customers where id=?";
			ps = conn.prepareStatement(sql);			
			ps.setObject(1,21);
			rs = ps.executeQuery();
			if (rs.next()) {
				//方式一:
//			int id = rs.getInt(1);
//			String name = rs.getString(2);
//			String email = rs.getString(3);
//			Date birth = rs.getDate(4);
				//方式二:(推荐)
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date birth = rs.getDate("birth");
				
				
				Customer cust = new Customer(id,name,email,birth);
				System.out.println(cust);
				
				//将Blob类型字段下载下来,保存本地
				Blob photo = rs.getBlob("photo");
				is = photo.getBinaryStream();
				fos=new FileOutputStream("daji.jpg");
				byte[] buffer=new byte[1024];
				int len;
				while((len=is.read(buffer))!=-1) {
					fos.write(buffer,0,len);
				}
				
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(is!=null)
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			try {
				if(fos!=null)
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			//
			JDBCUtils.closeResource(conn, ps,rs);
		}
		
		
	}
	
}

posted @ 2020-06-04 11:58  秋弦  阅读(402)  评论(0编辑  收藏  举报