• JDBC操作oracle中的大对象


     1 一:操作CLOB
     2 
     3 (1)数据库表结构如下:
     4 
     5  
     6      create table CLOB_TEST
     7      (
     8         ID      VARCHAR2(5) not null,
     9         CONTENT CLOB     
    10     )
    11  
    12 (2)插入CLOB
    13  
    14 方法一:第一步插入一个空值,第二步锁住此行,更新clob字段
    15  
    16 public static void insertClob(Connection conn,String data) throws Exception{      //这句话如没有,9i的驱动下会报 java.sql.SQLException: ORA-01002: 读取违反顺序 的异常。  conn.setAutoCommit(false);
    17   //插入一个空CLOB   String insertSql = "insert into clob_test(id,content) values('1',empty_clob())";   //查询插入的空CLOB   String selectSql = "select content from clob_test where id = '1' for update";   PreparedStatement  stmt = conn.prepareStatement(insertSql);   stmt.executeUpdate();   stmt.close();   // lock this line   PreparedStatement pstmt = conn.prepareStatement(selectSql);   ResultSet rs = pstmt.executeQuery();   if(rs.next()){    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1);    //为CLOB写信息   BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());     BufferedReader in = new BufferedReader(new FileReader(data));     int c;     while ((c=in.read())!=-1) {       out.write(c);     }     in.close();     out.close();    }   conn.commit();   pstmt.close();  }
    18  
    19 注:此方法在jdk1.4、jdk50、jdk6.0和Oracle9i、Oracle10g、Oracle11g驱动下测试通过!
    20  
    21 方法二:通过setString方法
    22  
    23 public static void insertClob(Connection conn,String data) throws Exception{     String insertSql = "insert into clob_test(id,content) values('1',?)";   PreparedStatement  stmt = conn.prepareStatement(insertSql);   stmt.setString(1, data);   stmt.executeUpdate();   stmt.close();   conn.close();
    24  
    25  }
    26  
    27  
    28 注:由于在Oracle9i的驱动下,setString 有2000字符长度的限制,故这个方法只适合Oracle10g以上的驱动(Oracle11g驱动+JDK6.0也测试通过)。
    29  
    30 方法三:通过setClob方法
    31  
    32 public static void insertClob(Connection conn,String filePath) throws Exception{   String insertSql = "insert into clob_test(id,content) values('1',?)";   PreparedStatement  stmt = conn.prepareStatement(insertSql);   stmt.setClob(1, new FileReader(filePath));   stmt.executeUpdate();   stmt.close();   conn.commit();  }
    33  
    34 注:由于setClob(int parameterIndex, Reader reader)这个方法是JDBC4.0规范刚加的内容,是以流的方式为CLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.035  
    36 (3)读取CLOB
    37 
    38 方法一:
    39 
    40 public static String readClob(Connection conn) throws Exception{   PreparedStatement  stmt = conn.prepareStatement("select * from clob_test where id = '1'");   ResultSet rs = stmt.executeQuery();   String str="";   StringBuffer sb = new StringBuffer("");   while(rs.next()){    Clob clob = rs.getClob("content");    Reader is = clob.getCharacterStream();        BufferedReader br = new BufferedReader(is);        str = br.readLine();        while (str != null)       {         sb.append(str);        str = br.readLine();        }    }   return sb.toString();  }
    41  
    42 方法二:
    43 public static String readClob(Connection conn) throws Exception{   PreparedStatement  stmt = conn.prepareStatement("select * from clob_test where id = '1'");   ResultSet rs = stmt.executeQuery();   String str="";   while(rs.next()){    str = rs.getString("content");   }   return str;  }
    44  
    45 注:由于在Oracle9i的驱动下,rs.getString 返回为null,所以此方法只适合Oracle10g及其以上驱动。
    46  
    47 二:操作BLOB
    48  
    49 (1)数据库表结构如下:
    50 
    51  
    52      create table BLOB_TEST
    53      (
    54         ID      VARCHAR2(5) not null,
    55         CONTENT BLOB
    56     )
    57  
    58 (2)插入BLOB
    59  
    60  方法一:第一步插入一个空值,第二步锁住此行,更新blob字段
    61  
    62 public static void writeBlob(Connection con,String filePath) throws Exception{   FileInputStream fis = null;   PreparedStatement psm = null;   File file = new File(filePath);   psm = con.prepareStatement("insert into blob_test(id,content) values('2',empty_blob())");   psm.executeUpdate();   psm = con.prepareStatement("select content from blob_test where id ='2' for update");   ResultSet rs = psm.executeQuery();   if(rs.next()){    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(1);    FileInputStream fin = new FileInputStream(file);    OutputStream out = blob.getBinaryOutputStream();    int count = -1, total = 0;     byte[] data = new byte[blob.getBufferSize()];    while ((count = fin.read(data)) != -1)    {      out.write(data, 0, count);     }     out.flush();    out.close();
    63   }    }
    64  
    65  方法二:通过setBinaryStream方法
    66  
    67 public static void writeBlob(Connection con,String filePath) throws Exception{   FileInputStream fis = null;   PreparedStatement psm = null;   File file = new File(filePath);   try {    fis = new FileInputStream(file);    psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)");    psm.setBinaryStream(1, fis, fis.available());    psm.executeUpdate();     }finally{    if(fis != null) fis.close();    psm.close();    con.close();   }    }
    68  
    69  方法三:通过setBlob(int parameterIndex, InputStream inputStream)方法
    70  
    71 public static void writeBlob(Connection con,String filePath) throws Exception{   FileInputStream fis = null;   PreparedStatement psm = null;   File file = new File(filePath);   try {    fis = new FileInputStream(file);    psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)");    psm.setBlob(1, fis);    psm.executeUpdate();     }finally{    if(fis != null) fis.close();    psm.close();    con.close();   }    }
    72  
    73 
    74 注:由于setBlob(int parameterIndex, InputStream inputStream)这个方法是JDBC4.0规范刚加的内容,是以流的方式为BLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.075  
    76 (3)读取BLOB
    77  
    78 public static void readBlob(Connection con,String outFilePath){   Statement sm = null;   ResultSet rs = null;   try {    sm = con.createStatement();    rs = sm.executeQuery("select * from blob_test where id = 2");    if(rs.next()){     Blob blob = rs.getBlob("content");     File file = new File(outFilePath);                 FileOutputStream sout = new FileOutputStream(file);        InputStream in = blob.getBinaryStream();//获取BLOB数据的输入数据流                 //经BLOB输入数据流读取数据,并将其写入文件                 byte[] b = new byte[256];                  int off = 0;                 int len = b.length;                 for (int i = in.read(b); i != -1;) {                      sout.write(b);                      i = in.read(b);                 }              sout.close();              rs.close();              sm.close();              con.close();    }   } catch (Exception e) {    e.printStackTrace();   }  }
  • 相关阅读:
    结构体怎么组包发送
    开源语音代码eSpeak1.06 的移植到单片机的过程(二)之分析下speak.c 文件
    看看深圳的房价
    开源语音代码eSpeak1.06 的移植到单片机的过程(一)0之分析下espeak.c 文件
    开源语音代码eSpeak1.06 的学习入门
    利尔达模组CAT1 UIS8910指令的 TCP相关中文解释
    将博客搬至CSDN
    【原创】大叔问题定位分享(39)azkaban定期出现fullgc
    【原创】大叔经验分享(129)mac下启动MAT报错
    【原创】大数据基础之Doris(1)编译安装和启动
  • 原文地址:https://www.cnblogs.com/huzi007/p/2874515.html
Copyright © 2020-2023  润新知