Java存取Clob对象

1.刚开始接触Clob对象,简单的实现了对Clob对象的存取,Blob对象的存取跟它差不多,写入的时候有三部,第一先插入一个空的empty_clob(),然后获得这个cursor,然后再修改,这要牵涉到IO流的操作。。。
贴一下我的代码,写得比较懒,见谅啊各位。。石头轻砸。。。
package com.mj.utils;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.sql.CLOB;

/**
 * 
 * @author M.J
 *
 */
public class ClobTest {
	
	private static Connection conn=null;
	
	private static PreparedStatement ps=null;
	
	private static ResultSet rst=null;
	
	static{
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:WMG", "hibernate","hibernate");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 插入Clob数据
	 * @param strClob
	 * @return
	 */
	public boolean inserClob(String userid, String strClob){
		boolean suc=false;
		//CLOB使用的是oracle.sql.CLOB貌似JDBC接口的java.sql.Clob支持读入,但不支持写入Clob对象,Blob也是。。。
		//这里需要注意的是,在给HH调试bug的时候,它出的错误是,无法把oracle.sql.CLOB对象转换成oracle.sql.CLOB,因为它连接数据库是用
		//了Tomcat配置的数据源,所以在tomcat的common/lib目录下面有一个classes12.jar或者是ojdbc.jar,它的项目里面因为要引用oracle.sql.jar
		//所以在项目lib目录下它也放了一个jar,这样造成了jar包之间的冲突,解决方法就是,将Web应用lib目录下的oracle驱动给移除掉(不是从构建路径上给
		//remove掉,而是删除,如果remove不起作用,试过。。。),然后外部引用common/lib目录下面的oracle驱动
		CLOB clob=null;
		//插入一个空的Clob对象,这是一个Cursor
		String sql="INSERT into test_clob(userid,clob_test) VALUES(?,empty_clob())";
		try {
			//禁用自动提交事务
			conn.setAutoCommit(false);
			ps=conn.prepareStatement(sql);
			ps.setString(1, userid);
			ps.executeUpdate();
			ps.close();
			
			//查询并获得这个cursor,并且加锁
			sql="SELECT clob_test FROM test_clob WHERE userid=? for update";
			ps=conn.prepareStatement(sql);
			ps.setString(1, userid);
			rst=ps.executeQuery();
			if(rst.next()){
				clob=(CLOB)rst.getClob(1);
			}

			
			//获得clob对象的输出流
			PrintWriter pw=new PrintWriter(clob.getCharacterOutputStream());
			pw.write(strClob);
			//一定要flush(),否则不会将String对象写入到Clob当中去。。。
			pw.flush();
			ps.close();
			
			//更新clob对象
			sql="UPDATE test_clob set clob_test =? where userid=?";
			ps=conn.prepareStatement(sql);
			ps.setClob(1, clob);
			ps.setString(2, userid);
			ps.executeUpdate();
			ps.close();
			conn.commit();
			pw.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return suc;
	}
	/**
	 * 输出Clob对象
	 * @param userid
	 */
	public String readClob(String userid){
		String test_clob="";
		CLOB clob=null;
		StringBuffer sb=new StringBuffer();
		String sql="SELECT * FROM test_clob WHERE userid='"+userid+"'";
		try {
			ps=conn.prepareStatement(sql);
			rst=ps.executeQuery();
			if(rst.next()){
				clob=(CLOB)rst.getClob(2);
			}
			Reader reader=clob.getCharacterStream();
			char[] buffer=new char[1024];
			int length=0;
			while((length=reader.read(buffer))!=-1){
				sb.append(buffer, 0, length);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		test_clob=sb.toString();
		return test_clob;
	}
	public static void main(String[] args){
		new ClobTest().inserClob("4","我是Clob,哈哈");
		String test=new ClobTest().readClob("4");
		System.out.println(test);
	}
}

你可能感兴趣的:(java,oracle,sql,tomcat,Hibernate)