package com.demo.jdbc;
import com.demo.utils.JdbcUtils2;
import org.junit.Test;
import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* Jdbc 中大文本数据的处理
* <p>
* Oracle 中大文本数据类型是:
* Clob:长文本数据类型;(Mysql 中不支持,使用的是 text)
* Blob:二进制数据类型;
* <p>
* Mysql 中大文本数据类型:
* Text:长文本数据类型;
* Bloc:二进制数据类型;
* <p>
* -- 测试大数据类型数据库
* CREATE TABLE test(
* id INT PRIMARY KEY AUTO_INCREMENT,
* content LONGTEXT,
* img LONGBLOB
* );
*/
public class JdbcDemo8 {
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
/**
* 保存 长文本 数据
*/
@Test
public void testSaveText() {
try {
// 1、获取数据库连接对象
conn = JdbcUtils2.getConnection();
// 2、准备预编译 sql 语句
String sql = "insert into test(content) values(?)";
// 3、创建 pstmt 对象,预编译 sql 语句
pstmt = conn.prepareStatement(sql);
// 4、读取 大文本数据
String path = JdbcDemo8.class.getResource("/test.txt").getPath(); // test.txt 文件放在项目 src 下
System.out.println("path:" + path);
FileReader reader = new FileReader(new File(path));
// 5、设置参数:使用 setCharacterStream 方法;
pstmt.setCharacterStream(1, reader);
// 6、执行 sql 语句
pstmt.executeUpdate();
// 7、关闭
reader.close();
System.out.println("保存成功!");
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils2.close(conn, pstmt, rs);
}
}
/**
* 读取 长文本 数据
*/
@Test
public void testGetText() {
try {
// 1、获取数据库连接对象
conn = JdbcUtils2.getConnection();
// 2、准备预编译 sql 语句
String sql = "select * from test";
// 3、创建 pstmt 对象,预编译 sql 语句
pstmt = conn.prepareStatement(sql);
// 4、执行 sql 语句
rs = pstmt.executeQuery();
if (rs.next()) {
// 读取字符串数据
String content = rs.getString("content");
System.out.println(content);
// 读取数据转换成 Reader 对象
Reader reader = rs.getCharacterStream("content");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils2.close(conn, pstmt, rs);
}
}
/**
* 保存 二进制 数据
*/
@Test
public void testSaveImg() {
try {
// 1、获取数据库连接对象
conn = JdbcUtils2.getConnection();
// 2、准备预编译 sql 语句
String sql = "insert into test(img) values(?)";
// 3、创建 pstmt 对象,预编译 sql 语句
pstmt = conn.prepareStatement(sql);
// 4、获取文件的输入流
InputStream in = JdbcDemo8.class.getResourceAsStream("/11.jpg"); // 11.jpg 在项目 src 目录下
if (in != null) {
// 5、设置参数
pstmt.setBinaryStream(1, in);
// 6、执行 sql 语句
pstmt.executeUpdate();
// 7、关闭流
in.close();
System.out.println("保存成功");
} else {
System.out.println("读取文件失败!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils2.close(conn, pstmt, rs);
}
}
/**
* 读取 二进制 数据
*/
@Test
public void testGetImg() {
try {
// 1、获取数据库连接对象
conn = JdbcUtils2.getConnection();
// 2、准备预编译 sql 语句
String sql = "select * from test where id=3";
// 3、创建 pstmt 对象,预编译 sql 语句
pstmt = conn.prepareStatement(sql);
// 4、执行 sql 语句
rs = pstmt.executeQuery();
if (rs.next()) {
// 获取图片流
InputStream in = rs.getBinaryStream("img");
// 图片输出流
FileOutputStream out = new FileOutputStream(new File("D://11.jpg"));
int len = -1;
byte[] buf = new byte[1024];
while((len = in.read(buf)) != -1){
out.write(buf, 0, len);
}
// 关闭流
out.close();
in.close();
System.out.println("读取成功!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils2.close(conn, pstmt, rs);
}
}
}
其中 JdbcUtils2.java 工具类为:https://blog.csdn.net/qq_29331365/article/details/95166514