我下面介绍下java中怎么实现对oracle数据库的clob字段增删改查的问题。我也本人也是首次接触那个类型,研究了一天,现在应该说是会用了,其实我看了别人的文章,实现同样的功能还有别的方法,这里我就不介绍了,因为我没有区试。我就介绍下我使用过的。经过了几天的测试没有发现什么错误。注意:标记了颜色的都是死的,没有什么“为什么”可言,就是要那么写,除非你用别的方法了 ^_^ 。
import java.io.Reader;
import java.io.Writer;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.CLOB;
/**
* 因为使用了oracle数据库,其中有个clob类型的字段操作相对困然。
* 为此,这个类专门对大字段字符型的做操作,把大字符型数据保存到
* text表中,其他表中使用了大字符串的地方,改成text表中内容相应
* id。
* @author Administrator
*
*/
public class TextDao {
private Connection conn;
public TextDao(Connection conn) {
this.conn=conn;
}
/**
* 向text表中插入一条新的记录
* @param context 插入的内容
* @return 是否插入成功的,成功为true
*/
public int insertText(String context){
if(context==null){
return -1;
}
PreparedStatement stmt=null;
ResultSet rs=null;
CLOB clob=null;
Writer write=null;
if(conn==null){
return -1;
}
int id=-1;
try {
String sql="insert into text (id,context) values(text_id.nextval,empty_clob())";
conn.setAutoCommit(false);
stmt=conn.prepareStatement(sql);
stmt.executeUpdate();
sql="select * from text where id=(select max(id) from text)";
rs=stmt.executeQuery(sql);
if(rs.next()){
id=rs.getInt("id");
clob=((OracleResultSet)rs).getCLOB("context");
write=clob.getCharacterOutputStream();
write.write(context);
write.flush();
}
conn.commit();
return id;
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(write!=null){
write.close();
}
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
clob=null;//清空clob变量
} catch (Exception e) {
e.printStackTrace();
}
}
return -1;
}
/**
* 查询由id指定的记录
* @param id 指定的记录的id
* @return 由id指定的内容
*/
public String selectText(int id){
if(id<=0){
return null;
}
PreparedStatement stmt=null;
ResultSet rs=null;
CLOB clob=null;
Reader reader=null;
if(conn==null){
return null;
}
String context="";
try {
String sql="select * from text where id=?";
conn.setAutoCommit(false);
stmt=conn.prepareStatement(sql);
stmt.setInt(1, id);
rs=stmt.executeQuery();
if(rs.next()){
clob=((OracleResultSet)rs).getCLOB("context");
reader=clob.getCharacterStream();
char ch[]=new char[clob.getBufferSize()];
while(reader.read(ch)!=-1){
context+=String.valueOf(ch);
}
}
conn.commit();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(reader!=null){
reader.close();
}
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return context;
}
/**
* 更新text表中由id指定的记录
* @param id 需要被更新的记录的id
* @param context 需要被更新的内容
* @return 更新是否成功,成功为true
*/
public boolean updateText(int id,String context){
if(id<=0){
return false;
}
if(context==null){
return false;
}
PreparedStatement stmt=null;
ResultSet rs=null;
CLOB clob=null;
Writer write=null;
if(conn==null){
return false;
}
try {
conn.setAutoCommit(false);
String sql="update text set context=empty_clob() where id="+id;
stmt=conn.prepareStatement(sql);
stmt.executeUpdate();
sql="select * from text where id="+id;
rs=stmt.executeQuery(sql);
if(rs.next()){
clob=((OracleResultSet)rs).getCLOB("context");
write = clob.getCharacterOutputStream();
write.write(context);
write.flush();
}
conn.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(write!=null){
write.close();
}
clob=null;//清空clob变量
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 删除text表中由id指定的记录
* @param id 需要被删除的记录的id
* @return 删除是否成功 删除成功为true
*/
public boolean deleteText(int id){
if(id<=0){
return false;
}
PreparedStatement stmt=null;
if(conn==null){
return false;
}
try {
String sql="delete from text where id="+id;
stmt=conn.prepareStatement(sql);
int i=stmt.executeUpdate();
if(i>0){
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.commit();
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 关闭数据库链接
*/
public void close(){
if(conn!=null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}