Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 从大字段(blob,clob)的读、写认识JDBC操作数据库全攻略
【标  题】:从大字段(blob,clob)的读、写认识JDBC操作数据库全攻略
【关键字】:blob,clob,JDBC
【来  源】:http://www.cublog.cn/u/22374/showart.php?id=155346

从大字段(blob,clob)的读、写认识JDBC操作数据库全攻略

Your Ad Here
JDBC(Java Database Connectivity) 是 Sun 公司提供的一套通过对各个数据库厂商提供的函数进行整合和抽象的一族数据库操作类。
它们是Java2标准平台版本的一部分。JDBC 把对数据库的连接大致分成了两大类:
                
                 1.通过 JDBC-ODBC 桥连接数据库
                 2.通过 JDBC 连接数据库
 
由于 JDBC-ODBC 连接数据库效率低下,因此,在大多数项目中 JDBC-ODBC 一般不是项目的开发首选,除非你的库用的是 M$ 的 Access ,没办法 M$ 就是这么霸道!哈哈。
 
组成 JDBC API 的类和接口包含在java.sql和java.text包中。
 
(1)建立连接:
 
首先必须使用Class.forName(String dbDriverClassname)方法检查是否安装了适当的JDBC驱动程序。这个方法是用来动态加载类的,dbDriverClassname是驱动程序类的名称。加载了驱动程序后,使用java.sql包中的DriverManager类中的getConnection()方法可以建立数据库连接,这个方法有三种形式:
 

public static synchronized Connection getConnection(String url) throws SQLException
public static synchronized Connection getConnection(String url,String user,String pwd)  throws SQLException
public static synchronized Connection getConnection(String url, java.util.Properties info) throws SQLException

 
(2)执行SQL语句并取回结果:
 
创建了数据库连接后,当我向数据库库发出一个SQL查询时,首先要做的事情是使用Connection对象的方法创建一个Statement、PreparedStatement或者CallableStatemet;一旦有了这些语句(statement)对象中的任一个,就可以执行该语句并通过ResultSet对象读出查询结果(如果查询有返回结果的话)。
 

Statement createStatement() throws SQLException
Statement createStatement(int resultSetType , int resultSetConcurrency) throws SQLException
PreparedStatement prepareStatement(String sql) throws SQLException
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException
CallableStatement prepareCall(String sql) throws SQLException
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException

 
在对 BLob 和 Clob 型字段进行读写操作时,需要一个可以生成可滚动和/或可更新的 ResultSet 对象,否则 JRE 会告诉你“记录没有锁定”。但是,默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。因此,你需要使用下面的方式产生一个 ResultSet 对象:
 

       Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE
);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
       // rs will be scrollable, will not show changes made by others,
       // and will be updatable


 
 
 
你可能对上面加粗的代码感到疑惑,没关系,我这里将其所有的可用参数做了一个总结:
 

CLOSE_CURSORS_AT_COMMIT
          该常量指示调用 Connection.commit 方法时应该关闭 ResultSet 对象。

CONCUR_READ_ONLY
          该常量指示不可以更新的 ResultSet 对象的并发模式。

CONCUR_UPDATABLE
          该常量指示可以更新的 ResultSet 对象的并发模式。

FETCH_FORWARD
          该常量指示将按正向(即从第一个到最后一个)处理结果集中的行。

FETCH_REVERSE
          该常量指示将按反向(即从最后一个到第一个)处理结果集中的行处理。

FETCH_UNKNOWN
          该常量指示结果集中的行的处理顺序未知。

HOLD_CURSORS_OVER_COMMIT
          该常量指示调用 Connection.commit 方法时不应关闭 ResultSet 对象。

TYPE_FORWARD_ONLY
          该常量指示指针只能向前移动的 ResultSet 对象的类型。

TYPE_SCROLL_INSENSITIVE
          该常量指示可滚动但通常不受其他的更改影响的 ResultSet 对象的类型。

TYPE_SCROLL_SENSITIVE
          该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。

 
这些常量都属于 ResultSet 类为:static int型。
有了上面的这些基础,接下来我们就可以利用 Java 代码在 Oracle 库中记录 CLob / BLob 型数据了。
 
首先来说明 BLob 型数据和 CLob 型数据的差别:在 Oracle 中 BLob 型的字段主要用来记录二进制数据,如:图片、媒体、音乐以及压缩文件等等等等……。而 Clob 主要用来记录大字段的文本信息。
 
我首先想说明一下如何来写入 CLob 型数据之后说明如何往 BLob 中写值。
 
1.为了数据量足够大,因此我生成一个大约 2.5MB 的随机字母序列用以写入数据库:
 

            char mychar='A';
            char thechar;
            StringBuffer strB=new StringBuffer();
            for(int i=0;i<=100000;i++){
                for(int j=0;j<26;j++){
                    int myRandom=(int)((100*(Math.random()))%26);
                    thechar=(char)(myRandom+mychar);
                    strB.append(thechar);
                }
            }

 
 
 
2.开始入库:
 

public void setClob(String values) throws Exception{
        try{
                conn=DBConnection.getConn();
                ps=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                conn.setAutoCommit(false);
                rs=ps.executeQuery("select clobid, mydata from myclob where clobid='1111' for update");
                java.sql.Clob clob=null;
                if(rs.next()){
                        clob=rs.getClob("mydata");
                        CLOB myclob=(CLOB)clob;
                        Writer outStream=myclob.getCharacterOutputStream();
                        char[] c=values.toCharArray();
                        outStream.write(c,0,c.length);
                        outStream.flush();
                        outStream.close();
                }
                conn.commit();
        } catch(Exception e){
                e.printStackTrace();
                conn.rollback();
                e.getMessage();
                throw new Exception(e);
        } finally{
                DBConnection.close(rs);
                DBConnection.close(ps);
                DBConnection.freeConn(conn);
        }
}

接下来,我对 setClob(String values) 方法开始进行分析:
 
 
………………………………………………未完待续!
 
 
(mysql+struts+hibernate)loginStruts工程情况:【上一篇】
TopCoder--计算矩形的公有面积2:【下一篇】
【相关文章】
  • JSP+JDBC(Thin模式)连接Oracle
  • 快速一次性读取ORACLE CLOB的方法
  • 利用JDBC显示数据库详细信息---JSP实现
  • JDBC学习笔记
  • 求救:jdbc访问本地mssqlserver 端口号是多少呀?1433不对吗?
  • 四种类型的 JDBC 驱动
  • JAVA完全控制Oracle中BLOB、CLOB说明
  • Java JDBC 实现反思
  • Hibernate终于搞定了CLOB字段得存取代码和大家分享
  • JDBC连接Oracle数据库常见问题及解决方法
  • 【随机文章】
  • MBA十八个故事
  • Access中使用自定义函数(菜鸟级)
  • 关于学习ASP和编程的28个观点
  • 发现一个.Net中动态加载控件时关于焦点方面的Bug
  • Windows和Linux多操作系统的安装
  • scim的配置脚
  • Flash中的变量及几个ActionScript实例讲解(一)
  • 如何编译boost
  • MPlayer安装指南
  • Photoshop惊魂—制作诡异的面具
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.