oracle数据库插入二进制文件

时间:2021-06-15 20:58:35

1.创建表


大型对象(LOB)数据类型

Clob

最大4G,存储单字节字符型数据。适用于存储超长文本。

Nclob

最大4G,存储多字节国家字符型数据。适用于存储超长文本。

Blob

最大4G,存储二进制数据。适用于存储图像、视频、音频等。

BFile

最大长度是4GB,在数据库外部保存的大型二进制对象文件,最大长度是4GB。这种外部的LOB类型,通过数据库记录变化情况,但是数据的具体保存是在数据库外部进行的。 Oracle  可以读取、查询BFILE,但是不能写入,不参与事务。

 


CREATE TABLE F_STUDENT
(
  ID            NUMBER,
  NAME          VARCHAR2(12 BYTE),
  HEADERPIC     BLOB,
  STU_BIRTHDAY  DATE
)

2.jdbc连接数据库并写入数据

需要jar包:ojdbc6.jar
package com.bs.message;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.ParseException;


public class test {
public static void main(String[] args) throws ParseException {
try {

// 调用Class.forName()方法加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (Exception e) {

e.printStackTrace();

}

String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";

// 调用DriverManager对象的getConnection()方法,获得一个Connection对象
Connection conn;
String tableName="f_student";
FileInputStream fi = null;
try {
fi = new FileInputStream(new File("F:\\img\\7.jpg"));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {

conn = DriverManager.getConnection(url, "briup", "briup");

conn.setAutoCommit(false);
//创建一个Statement对象
PreparedStatement ps = conn.prepareStatement("insert into " +
tableName + " (id,name,headerPic,stu_birthday) values (?,?,?,?)");
ps.setLong(1, 1);
ps.setString(2, "venbill");
ps.setBlob(3, fi);
//1900.1.0
ps.setDate(4, new Date(94, 8, 19));
ps.addBatch();
ps.executeBatch();
conn.commit();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();

}
}
}


3.异常处理

 java.lang.AbstractMethodError: oracle.jdbc.driver.T4CPreparedStatement.setBlob(ILjava/io/InputStream;)

原因:

setBlob(int, InputStream) was only added in Java 6. Your JDBC driver probably is out of date. Check if there's an updated version. 

oracle官网;

oracle数据库插入二进制文件 ojdbc6.jar (2,739,670 bytes) - (SHA1 Checksum: a483a046eee2f404d864a6ff5b09dc0e1be3fe6c)
Certified with JDK 8, JDK 7 and JDK 6: It contains the JDBC driver classes except classes for NLS support in Oracle Object and Collection types.

刚开始用的ojdbc14,查看源码里面没有setBlob(int index,InputStream is)方法,换成ojdbc6完美解决。ojdbc6对应的是jdk6 、7、 8,而ojdbc14对应的是jdk1.5