Oracle一条SQL插入Blob类型数据_JAVA

网上查询的往oracle插入blob数据大多都是需要先insert一个空对象,然后再select出来,获取blob对象之后在往里面写数据,这样就涉及到两条sql语句的执行和事务。
经过一段时间的搜索找到一种方式可以和普通字段一样直接插入blob类型数据,废话不多说直接上代码。

Connection conn = null;
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String userName = "yuanyuan";// 登陆名
String password = "yuanyuan";// 密码
try {
    //加载驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //创建数据库连接
    conn = DriverManager.getConnection(url, userName, password);
    String sql = "insert into test(testblob,blob2) values(?,?)";
    PreparedStatement pres = conn.prepareStatement(sql);
    //往数据库创建一个临时Blob
    Blob blob = oracle.sql.BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
    //往临时Blob写入数据
    OutputStream os = blob.setBinaryStream(1L);  
    os.write(readToByte(new File("D:\\1.jpg")));
    os.flush();
    //设置参数执行sql
    pres.setBlob(1, blob);
    pres.setBlob(2, blob);
    pres.executeUpdate();
} catch (Exception e) {
    e.printStackTrace();
}

经过测试,这种方式对于update也是一样适用的,核心在于创建这个Blob对象,就是调用oracle驱动的Blob类来创建一个Blob对象,只要创建出来这个对象,那就和我们操作普通的字段一样了。
后来又研究了一下,发现其实很很很很很很很很很很简单,直接插入了一个流就可以啦,唉搞了好久,怪就怪自己没看JAVA API!!!!但是注意了,这样操作,每个流只能用一次,因为流只能读一次,除非重置,所以如果只有一个流可以先读出来包装一下,再复用。

String sql = "insert into test(testblob,blob2) values(?,?)";
PreparedStatement pres = conn.prepareStatement(sql);
//创建两个流
ByteArrayInputStream in = new ByteArrayInputStream(readToByte(new File("D:\\1.jpg")));
InputStream in2 = new FileInputStream("D:\\1.jpg");
//直接setBlob完工
pres.setBlob(1, in);
pres.setBlob(2, in2);
pres.executeUpdate();

猜你喜欢

转载自blog.csdn.net/yy417168602/article/details/79957820