SQL小结(四)

数据库还可以储存大对象——图片或其他数据,二进制大对象为BOLB,字符型大对象为CLOB,以下为获取图像:
    PreparedStatement stat = conn.prepareStatement("SELECT Cover FROM BookCovers WHERE ISBN =?");
    stat.set(1.isbn);
    ResultSet result = stat.executeQuery();
    if(result.next()){
         Blob coverBlob = result.getBlob(1);
         Image coverImage = ImageIO.read(coverBlob.getBinaryStream());
    }//CLOB调用getSubString或getCharacterStream方法
将该对象存储到数据库中:
    Blob coverBlob = connection.createBlob();
    in offset = 0;
    OutputStream out = coverBlob.setBinaryStream(offset);
    ImageIO.write(coverImage, "PNG", out);
    PreparedStatement stat = conn.prepareStatement("INSERT INTO Cover VALUES (?, ?)");
    stat.set(1,isbn);
    stat.set(2,coverBlob);
    stat.executeUpdate();
获取多结果集的步骤:
(1)使用execute方法来执行SQL语句
(2)获取第一个结果集或更新计数
(3)重复调用getMoreResults方法以移动到下一个结果集
(4)当不存在更多的结果集或更新计数时,完成操作
若果由多结果集构成的链中的下一项是结果集,execute和getMoreResults方法将返回true,而结果在链中的下一项不是更新计数,getUpdateCount方法讲返回-1
    boolean isResult = stat.execute(command);
    boolean done = false;
    while(!done)
    {
        if(isResult)
        {
            ResultSet result = stat.getResultSet();
            do something with result
        }else{
            int updateCount = stat.getUpdateCount();
            if(updateCount >= 0)
                do something with updateCount
            else
                done = ture;
            }
        if(!done) isResult = stat.getMoreReuslt();
    }
可以通过如下方法创建不同的对象,得到滚动和更新结果集:
    Statement stat = conn.createStatement(type, concurrency);
    或PreparedStatement stat = conn.prepareStatement(command, type, concurrency);
(参数具体见图片解释)
如果涉及多个表的链接操作,那么他所产生的结果集将不可更新。可以调用ResultSet接口中的getConcurrency方法来确定结果集是否可更新
普通的更新操作:
    Result rs = stat.executeQuery(query);
    while(rs.next()){
        if(```){
            double price = rs.getDouble("Price");
            rs.updateDouble("Price", price + increase);
            rs.updateRow();//将信息更新到数据库
            }
    }
想在结果集中插入行:
    rs.moveToInsertRow(); //将游标移动到特定位置——插入行
    rs.updateString("Title",title);
    rs.updateString("ISBN",isbn);
    rs.updateString("Publisher_Id",pubid);
    rs.updateDouble("Price",price);
    rs.insertRow();
    rs.moveToCurrentRow(); //将游标移动回原来的位置
行集无需像结果集一样时刻连接数据库,其中RowSet接口扩展自ResultSet接口,JAVA 7中获取行集方法
    RowSetFactory factory = RowSetProvider.newFactory();
    CachedRowSet crs = factory.createCachedRowSet();
通过行集建立数据库的链接:
    crs.setURL("````");
    crs.setUsername("```");
    crs.setPassword("````");
设置语句和参数:
    crs.setCommand("SELECT ```` ?");
    crs.setString(1.publisherName);
    crs.execute(); //这个方法会建立数据库连接,从而进行各种操作
在填充了行集后,数据中的数据发生了变化,造成数据不一致。参考实现会首先检查行集中的原始值是否与数据库中的一致。一致则修改,否则抛出SyncProviderException异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值