JDBC基础(8)_JDBC大数据


JDBC 对大数据的处理

什么是大数据

  1. 所谓大数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:
    在这里插入图片描述
  2. 在 mysql 中没有提供 tinyclob、clob、mediumclob、longclob 四种类型,而是使用如下四种类型来处理文本大数据:
    在这里插入图片描述
  3. 首先我们需要创建一张表
    在这里插入图片描述
  4. 同样我们生成脚本文件后再 PL_SQL 当中执行
    在这里插入图片描述
  5. 向数据库插入二进制数据需要使用 PreparedStatement 为原 setBinaryStream(int, InputSteam)方法来完成(完整代码见文末)
    在这里插入图片描述
  6. 结果图
    在这里插入图片描述
  7. 读取二进制数据,需要在查询后使用 ResultSet 类的 getBinaryStream() 方法来获取输入流对象。也就是说,PreparedStatement 有 setXXX(),那么 ResultSet 就有 getXXX()。(完整代码见文末)
    在这里插入图片描述
  8. 还有一种方法,就是把要存储的数据包装成 Blob 类型,然后调用 PreparedStatement 的setBlob() 方法来设置数据,此处不再介绍。

源码

package com.wyx;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCUpdate2
{

	public static void main(String[] args)
	{
		// saveLob();
		getLob();
	}

	public static void saveLob()
	{
		// 定义oracle数据库的驱动的类
		String driverClass = "oracle.jdbc.OracleDriver";
		// 定义连接的oracle的url
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		// 用户名
		String username = "scott";
		// 密码
		String password = "tiger";

		// 定义Connection连接
		Connection conn = null;
		// 定义数据库的sql执行对象
		PreparedStatement ps = null;
		// 定义要执行的sql
		String addSql = "insert into  lob_test values(?,?)";

		try
		{
			// 注册数据库的驱动程序
			Class.forName(driverClass);
			// 获得数据库的连接
			conn = DriverManager.getConnection(url, username, password);
			// 创建sql执行对象
			ps = conn.prepareStatement(addSql);
			// 定义二进制文件输入流
			InputStream in = new FileInputStream("F:/administrator/Desktop/wyx.jpg");
			// 定义大文本的文件的输入流
			Reader reader = new FileReader("F:/administrator/Desktop/wyx.txt");
			// 设置二进制参数
			ps.setBinaryStream(1, in);
			// 设置大文本的参数
			ps.setClob(2, reader);

			int count = ps.executeUpdate();
			System.out.println("数据响应条数:" + count);

		} catch (Exception e)
		{
			e.printStackTrace();
		} finally
		{
			try
			{
				if (ps != null)
				{
					ps.close();
				}
				if (conn != null)
				{
					conn.close();
				}
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	public static void getLob()
	{
		// 定义oracle数据库的驱动的类
		String driverClass = "oracle.jdbc.OracleDriver";
		// 定义连接的oracle的url
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		// 用户名
		String username = "scott";
		// 密码
		String password = "tiger";

		// 定义Connection连接
		Connection conn = null;
		// 定义数据库的sql执行对象
		PreparedStatement ps = null;

		// 定义结果集对象
		ResultSet rs = null;
		// 定义要执行的sql
		String sql = "select * from lob_test";

		InputStream in = null;
		Reader reader = null;
		OutputStream out = null;
		Writer writer = null;
		try
		{

			// 注册数据库的驱动程序
			Class.forName(driverClass);
			// 获得数据库的连接
			conn = DriverManager.getConnection(url, username, password);
			// 创建sql执行对象
			ps = conn.prepareStatement(sql);
			// 查询
			rs = ps.executeQuery();
			// 让游标向下移动
			rs.next();
			// 获得二进制的输入流
			in = rs.getBinaryStream(1);
			// 获得大文本对象
			Clob clob = rs.getClob(2);
			// 获得reader对象
			reader = clob.getCharacterStream();

			// 把图片写入到硬盘上
			out = new FileOutputStream("F:/administrator/Desktop/wyx[副本].jpg");
			byte[] bytes = new byte[1024];
			int length = 0;			
			while ((length = in.read(bytes)) != -1)
			{
				out.write(bytes, 0, length);
			}
			out.flush();

			writer = new FileWriter("F:/administrator/Desktop/wyx[副本].txt");
			char[] cs = new char[1024];
			int length1 = 0;
			while ((length1 = reader.read(cs)) != -1)
			{
				writer.write(cs, 0, length1);
			}
			writer.flush();

		} catch (Exception e)
		{
			e.printStackTrace();
		} finally
		{
			try
			{
				if (writer != null)
				{
					writer.close();
				}
				if (out != null)
				{
					out.close();
				}
				if (reader != null)
				{
					reader.close();
				}
				if (in != null)
				{
					in.close();
				}
				if (ps != null)
				{
					ps.close();
				}
				if (conn != null)
				{
					conn.close();
				}
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值