Java对Oracle中Clob类型数据的读取和写入

来源:互联网 发布:java设计模式实现 编辑:程序博客网 时间:2024/05/29 04:47


Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的也不是很清楚,我对网上资料进行了整理和总结,具体看代码:

写入clob数据import java.io.Writer;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class TestClobIn {  public static void main(String args[]){  String data="this is a long passage!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";  Writer outStream = null; //通过JDBC获得数据库连接  try {  Class.forName("oracle.jdbc.driver.OracleDriver");  Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ewins", "scott", "tiger");  con.setAutoCommit(false);  Statement st = con.createStatement();  //插入一个空对象empty_clob(),这个是必须的  st.executeUpdate("insert into TESTCLOB(ID, NAME, CLOBATTR)values(2,'thename', empty_clob())");  //锁定数据行进行更新,注意“for update”语句,这里不用for update锁定不可以插入clob  ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");  if (rs.next())  {  //得到java.sql.Clob对象后强制转换为oracle.sql.CLOB  oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");  outStream = clob.getCharacterOutputStream();  //data是传入的字符串,定义:String data  char[] c = data.toCharArray();  outStream.write(c, 0, c.length);  }  outStream.flush();  outStream.close();  con.commit();  con.close();  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  }}读取clob数据import java.io.InputStream;import java.io.Reader;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;public class TestClobOut {  public static void main(String args[]){  String data;  Reader inStream=null;  //获得数据库连接  Connection con = ConnectionFactory.getConnection();//ConnectionFactory类是另外定义的,不必纠结  con.setAutoCommit(false);  Statement st = con.createStatement();  //不需要“for update”  ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");  if (rs.next())  {  java.sql.Clob clob = rs.getClob("CLOBATTR");  inStream = clob.getCharacterStream();  char[] c = new char[(int) clob.length()];  inStream.read(c);  //data是读出并需要返回的数据,类型是String  data = new String(c);  inStream.close();  }  inStream.close();  con.commit();  con.close();  }}

对比我们可以看出,无论出库入库,都要对clob数据类型进行查询操作,写入clob数据相对来说更复杂一点,需要先插入empty_clob()值,然后使用带“for update”的查询语句锁定更新行,最后实例化输出流并对clob类型字段数据进行写入操作;读取clob相对轻松一些,利用getCharacterStream方法得到输入流,从数据库中clob字段下,直接将数据读取出来。


0 0
原创粉丝点击