JDBC连接Oracle数据库(blob大文件的存储,存储过程)例子

1.1   Oracle数据库存储blob大文件

首先需要在数据库中创建一个表  例

然后执行代码(将一个图片的地址存入到oracle数据库中)

package com.oracle;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//思想:在数据库中创建一个表,将文件如视频存入到数据库的表中,然后用于需要的时候提取出来
public class TestImage {
     public static void main(String[] args) throws ClassNotFoundException, SQLException, FileNotFoundException {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/ORCL","scott","123456");
		String sql="insert into testimage values(?,?)";
		PreparedStatement  ps=conn.prepareStatement(sql);
		ps.setString(1, "zhangsan");
		InputStream in=new FileInputStream("e:\\1.bmp");
		 ps.setBlob(2, in);  // ps.setBlob(parameterIndex, inputStream);可知in的位置应该是一个  流。
		 //Blob存的一个二进制大型对象;最大4G字节,但是 在存大文件,例如图片,视频的时候一般存的都是视频所存在的地址
		int ret=ps.executeUpdate();
		if(ret>0) {
			System.out.println("添加成功");
		}else {
			System.out.println("添加失败");
		}
		try {
			in.close();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			ps.close();
			conn.close();
			
		}
	}
}

其次在oracle数据库中可以查询到已将图片存入

即:在数据库命令窗口  中select * from  表名ji即可查询得到。但是如果想要查询得到图片内容,需在oracle新建SQL窗口查询,如下然后点击...即可看到图片。

 

1.2   将存储在数据库中的图片读取出来

package com.oracle;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ReadBlob {
     public static void main(String[] args) throws ClassNotFoundException, IOException {
    	 Class.forName("oracle.jdbc.driver.OracleDriver");
 		try {
			Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/ORCL","scott","123456");
		   String sql="select *from testimage";
		   PreparedStatement ps=conn.prepareStatement(sql);
 		   ResultSet rs=ps.executeQuery();
 		   while(rs.next()) {
 			   String name=rs.getString("username");
 			   byte[]bt=rs.getBytes("image");
 			   OutputStream out=new FileOutputStream("d:\\"+name+".jpg");
 			   out.write(bt);
 			   out.close();
 			   System.out.println(name);
 		   }
 		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

2、批处理,即将多个条件同时执行, 如下:

package com.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class pichuliConnection {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/ORCL","scott","123456");
    PreparedStatement ps=null;
	try {
		String sql="update emp set sal=sal+100 where empno=?";
		ps=conn.prepareStatement(sql);
		ps.setInt(1,7499);     
		ps.addBatch();
		 //将部门编号为7499与7369的工资➕100,参考SQL语句
		ps.setInt(1,7369);
		ps.addBatch();
		
		int[] ret=ps.executeBatch();
		System.out.println("修改成功");
	} catch (Exception e) {
		System.out.println("出错..."+e.getMessage());
	}
	finally {
		if(ps!=null)
			ps.close();
		if(conn!=null)
			conn.close();
	}
	
    }
}

3、执行存储过程(以下两个oracle表与eclipse表中的过程名不一样,但是其他都一样,在实际中是需要一样的,(p1和up_getempinfo)见谅)

 

在Oracle数据库中建立一个储存过程表   如下

eclipse中程序如下:

package com.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.jdbc.internal.OracleTypes;

public class ExecuteProc {
  public static void main(String[] args) throws ClassNotFoundException, SQLException {
	  Class.forName("oracle.jdbc.driver.OracleDriver");
		
	  Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/ORCL","scott","123456");

	  CallableStatement call=conn.prepareCall("{call p1(?,?,?)}");
	  //创建一个 CallableStatement 对象来调用数据库存储过程  call ,oracle中如果有包名,需要+包名,过程名(p1) 问号为过程里定义的参数个数
	  //输入直接设置
	  call.setInt(1, 7788);
	  //输出 需要注册输出类型的参数
	  call.registerOutParameter(2, OracleTypes.VARCHAR);
	  call.registerOutParameter(3, OracleTypes.VARCHAR);

	  //执行
	  call.execute();

	  String name=call.getNString(2);
	  String job=call.getNString(3);
	  System.out.println(name+"\t"+job);
}
}

4.1执行储存过程返回多行(需用到游标)

上述图中需要注意:1.as可以改成is   2.在oracle中存储过程的执行要用 / 来完成。

4.2  在eclipse中的代码

package com.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.jdbc.internal.OracleTypes;

public class cursorJdbc {
   public static void main(String[] args) throws ClassNotFoundException {
	Class.forName("oracle.jdbc.driver.OracleDriver");
    try {
		Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/ORCL","scott","123456");
		//创建一个 CallableStatement 对象来调用数据库存储过程
		CallableStatement call=conn.prepareCall("{call getEmp(?,?)}");
		//输入输出
		call.setInt(1, 10);
		call.registerOutParameter(2, OracleTypes.CURSOR);
		//执行
		call.execute();
		//收集数据
		ResultSet rs=(ResultSet) call.getObject(2);
		while(rs.next()) {
			int empno=rs.getInt("empno");
			String ename=rs.getString("ename");
			System.out.println(empno+"\t"+ename);
		}
	} catch (SQLException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
	}
}     //下面应有finally 释放资源
}

如果有什么疑问或者错误,请留言,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值