oracle数据库插入二进制文件

本文介绍Oracle数据库中LOB数据类型的使用方法,包括Clob、Nclob、Blob和BFile的特点与应用场景,并提供了一个使用Java JDBC进行表创建和数据插入的例子。此外,还解决了在使用较旧JDBC驱动时出现的setBlob方法调用异常问题。

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官网;

Downloadojdbc6.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










评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值