MYSQL网页设计经由过程JDBC利用Oracle数据库LOB字段的几种...
越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。oracle|数据|数据库经由过程JDBC利用Oracle数据库LOB字段的几种情形剖析纵横软件制造中央雨亦奇2003-6-1015:14:19在Oracle中,LOB(LargeObject,年夜型工具)范例的字段如今用得愈来愈多了。由于这类范例的字段,容量年夜(最多能包容4GB的数据),且一个表中能够有多个这类范例的字段,很天真,合用于数据量十分年夜的营业范畴(如图像、档案等)。而LONG、LONGRAW等范例的字段,固然存储容量也不小(可达2GB),但因为一个表中只能有一个如许范例的字段的限定,如今已很少利用了。
LOB范例分为BLOB和CLOB两种:BLOB即二进制年夜型工具(BinaryLargeObject),合用于存贮非文本的字撙节数据(如程序、图像、影音等)。而CLOB,即字符型年夜型工具(CharacterLargeObject),则与字符集相干,适于存贮文本型的数据(如汗青档案、年夜部头著作等)。
上面以程序实例申明经由过程JDBC利用Oracle数据库LOB范例字段的几种情形。
先创建以下两个测试用的数据库表,PowerDesignerPD模子以下:
建表SQL语句为:
CREATETABLETEST_CLOB(IDNUMBER(3),CLOBCOLCLOB)
CREATETABLETEST_BLOB(IDNUMBER(3),BLOBCOLBLOB)
1、CLOB工具的存取
1、往数据库中拔出一个新的CLOB工具
publicstaticvoidclobInsert(Stringinfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*拔出一个空的CLOB工具*/
stmt.executeUpdate("INSERTINTOTEST_CLOBVALUES(111,EMPTY_CLOB())");
/*查询此CLOB工具并锁定*/
ResultSetrs=stmt.executeQuery("SELECTCLOBCOLFROMTEST_CLOBWHEREID=111FORUPDATE");
while(rs.next()){
/*掏出此CLOB工具*/
oracle.sql.CLOBclob=(oracle.sql.CLOB)rs.getClob("CLOBCOL");
/*向CLOB工具中写进数据*/
BufferedWriterout=newBufferedWriter(clob.getCharacterOutputStream());
BufferedReaderin=newBufferedReader(newFileReader(infile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
2、修正CLOB工具(是在原CLOB工具基本长进行掩盖式的修正)
publicstaticvoidclobModify(Stringinfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*查询CLOB工具并锁定*/
ResultSetrs=stmt.executeQuery("SELECTCLOBCOLFROMTEST_CLOBWHEREID=111FORUPDATE");
while(rs.next()){
/*猎取此CLOB工具*/
oracle.sql.CLOBclob=(oracle.sql.CLOB)rs.getClob("CLOBCOL");
/*举行掩盖式修正*/
BufferedWriterout=newBufferedWriter(clob.getCharacterOutputStream());
BufferedReaderin=newBufferedReader(newFileReader(infile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
3、交换CLOB工具(将原CLOB工具扫除,换成一个全新的CLOB工具)
publicstaticvoidclobReplace(Stringinfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*清空原CLOB工具*/
stmt.executeUpdate("UPDATETEST_CLOBSETCLOBCOL=EMPTY_CLOB()WHEREID=111");
/*查询CLOB工具并锁定*/
ResultSetrs=stmt.executeQuery("SELECTCLOBCOLFROMTEST_CLOBWHEREID=111FORUPDATE");
while(rs.next()){
/*猎取此CLOB工具*/
oracle.sql.CLOBclob=(oracle.sql.CLOB)rs.getClob("CLOBCOL");
/*更新数据*/
BufferedWriterout=newBufferedWriter(clob.getCharacterOutputStream());
BufferedReaderin=newBufferedReader(newFileReader(infile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
4、CLOB工具读取
publicstaticvoidclobRead(Stringoutfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*查询CLOB工具*/
ResultSetrs=stmt.executeQuery("SELECT*FROMTEST_CLOBWHEREID=111");
while(rs.next()){
/*猎取CLOB工具*/
oracle.sql.CLOBclob=(oracle.sql.CLOB)rs.getClob("CLOBCOL");
/*以字符情势输入*/
BufferedReaderin=newBufferedReader(clob.getCharacterStream());
BufferedWriterout=newBufferedWriter(newFileWriter(outfile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
out.close();
in.close();
}
}catch(Exceptionex){
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
2、BLOB工具的存取
1、向数据库中拔出一个新的BLOB工具
publicstaticvoidblobInsert(Stringinfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*拔出一个空的BLOB工具*/
stmt.executeUpdate("INSERTINTOTEST_BLOBVALUES(222,EMPTY_BLOB())");
/*查询此BLOB工具并锁定*/
ResultSetrs=stmt.executeQuery("SELECTBLOBCOLFROMTEST_BLOBWHEREID=222FORUPDATE");
while(rs.next()){
/*掏出此BLOB工具*/
oracle.sql.BLOBblob=(oracle.sql.BLOB)rs.getBlob("BLOBCOL");
/*向BLOB工具中写进数据*/
BufferedOutputStreamout=newBufferedOutputStream(blob.getBinaryOutputStream());
BufferedInputStreamin=newBufferedInputStream(newFileInputStream(infile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
2、修正BLOB工具(是在原BLOB工具基本长进行掩盖式的修正)
publicstaticvoidblobModify(Stringinfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*查询BLOB工具并锁定*/
ResultSetrs=stmt.executeQuery("SELECTBLOBCOLFROMTEST_BLOBWHEREID=222FORUPDATE");
while(rs.next()){
/*掏出此BLOB工具*/
oracle.sql.BLOBblob=(oracle.sql.BLOB)rs.getBlob("BLOBCOL");
/*向BLOB工具中写进数据*/
BufferedOutputStreamout=newBufferedOutputStream(blob.getBinaryOutputStream());
BufferedInputStreamin=newBufferedInputStream(newFileInputStream(infile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
3、交换BLOB工具(将原BLOB工具扫除,换成一个全新的BLOB工具)
publicstaticvoidblobReplace(Stringinfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*清空原BLOB工具*/
stmt.executeUpdate("UPDATETEST_BLOBSETBLOBCOL=EMPTY_BLOB()WHEREID=222");
/*查询此BLOB工具并锁定*/
ResultSetrs=stmt.executeQuery("SELECTBLOBCOLFROMTEST_BLOBWHEREID=222FORUPDATE");
while(rs.next()){
/*掏出此BLOB工具*/
oracle.sql.BLOBblob=(oracle.sql.BLOB)rs.getBlob("BLOBCOL");
/*向BLOB工具中写进数据*/
BufferedOutputStreamout=newBufferedOutputStream(blob.getBinaryOutputStream());
BufferedInputStreamin=newBufferedInputStream(newFileInputStream(infile));
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
4、BLOB工具读取
publicstaticvoidblobRead(Stringoutfile)throwsException
{
/*设定不主动提交*/
booleandefaultCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
try{
/*查询BLOB工具*/
ResultSetrs=stmt.executeQuery("SELECTBLOBCOLFROMTEST_BLOBWHEREID=222");
while(rs.next()){
/*掏出此BLOB工具*/
oracle.sql.BLOBblob=(oracle.sql.BLOB)rs.getBlob("BLOBCOL");
/*以二进制情势输入*/
BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(outfile));
BufferedInputStreamin=newBufferedInputStream(blob.getBinaryStream());
intc;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
out.close();
}
/*正式提交*/
conn.commit();
}catch(Exceptionex){
/*堕落回滚*/
conn.rollback();
throwex;
}
/*恢回复提交形态*/
conn.setAutoCommit(defaultCommit);
}
察看上述程序对LOB范例字段的存取,我们能够看出,较之别的范例字段,有上面几个明显分歧的特性:
一是必需作废主动提交。
存取操纵入手下手前,必需用setAutoCommit(false)作废主动提交。别的范例字段则无此特别请求。这是由于存取LOB范例字段时,一般要举行屡次操纵能够完成。不如许的话,Oracle将抛出“读取违背按次”的毛病。
二是拔出体例分歧。
LOB数据不克不及象别的范例数据一样间接拔出(INSERT)。拔出前必需先拔出一个空的LOB工具,CLOB范例的空工具为EMPTY_CLOB(),BLOB范例的空工具为EMPTY_BLOB()。以后经由过程SELECT命令查询失掉先前拔出的纪录并锁定,继而将空工具修正为所要拔出的LOB工具。
三是修正体例分歧。
别的范例的字段修正时,用UPDATE…SET…命令便可。而LOB范例字段,则只能用SELECT…FORUPDATE命令将纪录查询出来并锁定,然后才干修正。且修正也有两种改法:一是在原数据基本上的修正(即掩盖式修正),实行SELECT…FORUPDATE后再改数据;二是交换(先将原数据清失落,再修正),先实行UPDATE命令将LOB字段之值设为空的LOB工具,然落后行第一种改法。倡议利用交换的办法,以完成与别的字段UPDATE操纵后一样的效果。
四是存取时应利用由数据库JDBC驱动程序供应的LOB操纵类。
关于Oracle数据库,应利用oracle.sql.CLOB和oracle.sql.BLOB。不利用由数据库JDBC驱动程序供应的LOB类时,程序运转时易于呈现“笼统办法挪用”的毛病,这是由于JDBC所界说的java.sql.Clob与java.sql.Blob接口,个中的一些办法并未在数据库厂家供应的驱动程序中真正完成。
五是存取手腕与文件操纵相仿。
关于BLOB范例,使用InputStream/OutputStream类,此类不举行编码转换,逐一字节存取。oracle.sql.BLOB类响应供应了getBinaryStream()和getBinaryOutputStream()两个办法,前一个办法用于读取Oracle的BLOB字段,后一个办法用于将数据写进Oracle的BLOB字段。
关于CLOB范例,使用Reader/Writer类,此类举行编码转换。oracle.sql.CLOB类响应供应了getCharacterStream()和getCharacterOutputStream()两个办法,前一个办法用于读取Oracle的CLOB字段,后一个办法用于将数据写进Oracle的CLOB字段。
必要申明的是,为了年夜幅进步程序实行效力,对BLOB/CLOB字段的读写操纵,应当利用缓冲操纵类(带Buffered前缀),即:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。例程中全体利用了缓冲操纵类。
小结:经由过程JDBC利用Oracle数据库的LOB字段,不过乎拔出、修正、交换、读取四种体例,把握起来其实不难。在实践操纵中要注重下面所说的几点,分离浏览例程源程序,用户会很快分明LOB范例字段的利用的,也势必意会到这类范例字段的妙处!源文件下载>>
(网页编纂:编程荡子)应用程序需要使用数据库,数据库本身需要设计、开发和部署。还有MySQL学习教程,客户怎样实施混合系统,或者需要帮助管理多个云服务? having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 是要和操作系统进行Socket通讯的场景。否则建议慎重! 另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程); 对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。 是要和操作系统进行Socket通讯的场景。否则建议慎重! 我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过! 原来公司用过MYSQL自己也只是建个表写个SQL 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
页:
[1]