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 释放资源
}
如果有什么疑问或者错误,请留言,谢谢!