第25章 JDBC核心技术第4节:操作BLOB类型字段

4.1 MySQL BLOB类型

  • MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。

  • 插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。

  • MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
    在这里插入图片描述

  • 实际使用中根据需要存入的数据大小定义不同的BLOB类型。

  • 需要注意的是:如果存储的文件过大,数据库的性能会下降。

  • 如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数: max_allowed_packet=16M。同时注意:修改了my.ini文件之后,需要重新启动mysql服务。

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

PreparedStatement对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如CLOB大文本类型和BLOB大二进制数据类型。

有以下方法可用于流式传输数据
setAsciiStream():此方法用于提供大的ASCII值。
setCharacterStream():此方法用于提供较大的UNICODE值。
setBinaryStream():此方法用于提供较大的二进制值。
setXXXStream()方法除了参数占位符之外还需要额外的参数和文件大小。此参数通知驱动程序使用流向数据库发送多少数据。需要说明的是:图片在项目的存储:专门的图片服务器,整个服务器存储都是图片, 华为云服务器,购买华为云服务器可以直接使用, 提供一套API,我们调用这些API就可以存储到华为云,存储成功之后返回一个HTTP地址,可以通过http访问整个图片.当然阿里云也有类似的存储.业界里还有一个公司提供存储服务器,七牛云,提供存储服务,特别是图片服务器.

//获取连接
Connection conn = JDBCUtils.getConnection();	
String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
// 填充占位符
ps.setString(1, "徐海强");
ps.setString(2, "[email protected]");
ps.setDate(3, new Date(new java.util.Date().getTime()));
// 操作Blob类型的变量
FileInputStream fis = new FileInputStream("xhq.png");
ps.setBlob(4, fis);
//执行
ps.execute();
fis.close();
JDBCUtils.closeResource(conn, ps);

4.3 修改数据表中的Blob类型字段

Connection conn = JDBCUtils.getConnection();
String sql = "update customers set photo = ? where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
// 填充占位符
// 操作Blob类型的变量
FileInputStream fis = new FileInputStream("coffee.png");
ps.setBlob(1, fis);
ps.setInt(2, 25);
ps.execute();
fis.close();
JDBCUtils.closeResource(conn, ps);

4.4 从数据表中读取大数据类型

String sql = "SELECT id, name, email, birth, photo FROM customer WHERE id = ?";
conn = getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, 8);
rs = ps.executeQuery();
if(rs.next()){
	Integer id = rs.getInt(1);
    String name = rs.getString(2);
	String email = rs.getString(3);
    Date birth = rs.getDate(4);
	Customer cust = new Customer(id, name, email, birth);
    System.out.println(cust); 
    //读取Blob类型的字段
	Blob photo = rs.getBlob(5);
	InputStream is = photo.getBinaryStream();
	OutputStream os = new FileOutputStream("c.jpg");
	byte [] buffer = new byte[1024];
	int len = 0;
	while((len = is.read(buffer)) != -1){
		os.write(buffer, 0, len);
	}
    JDBCUtils.closeResource(conn, ps, rs);	
	if(is != null){is.close();}
	if(os !=  null){os.close();}
}

4.5 操作大文本对象

//读取大文本数据,了解知识
public static void readCLOB() {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql="select * from student where s_id=?";
    try {
        conn = DBUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, "11");
        rs = pstmt.executeQuery();
        if(rs.next()) {
            String sname = rs.getString("s_name");
            String sid = rs.getString(1);
            Date sbirth = rs.getDate("s_birth");
            System.out.println(sid+"\t"+sname+"\t"+sbirth);
            Reader reader = rs.getCharacterStream("s_resume");
            //保存读取到数据
            FileWriter writer = new FileWriter("d:\\test.txt");
            char [] txt = new char[1024];
            int len = 0;
            while(  (len=reader.read(txt))!= -1 ) {
                writer.write(txt, 0, len);
            }
            writer.close();
            reader.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        DBUtil.closeAll(null, pstmt, conn);
    }
}
//存储大文本数据,了解知识
public static void saveCLOB() {
    Connection conn = null;
    PreparedStatement pstmt = null;
    String sql="update student set s_resume=? where s_id=?";
    try {
        conn = DBUtil.getConnection();
        pstmt = conn.prepareStatement(sql);
        //根据提供的文件创建输入流
        FileReader reader  =new FileReader("d:\\data.txt");
        pstmt.setCharacterStream(1, reader);

        pstmt.setString(2, "11");
        int rows = pstmt.executeUpdate();
        if (rows>0) {
            System.out.println("操作成功");
        } else {
            System.out.println("操作失败");
        }
    } catch (SQLException | FileNotFoundException e) {
        e.printStackTrace();
    }finally {
        DBUtil.closeAll(null, pstmt, conn);
    }
}
发布了91 篇原创文章 · 获赞 43 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/kongfanyu/article/details/105167964