Java数据库之管理数据集

一、可滚动、可更新的结果集

可滚动结果集:使用absolute()、previous()、afterLast()、last()等方法自由移动记录指针的ResultSet被称为可滚动的结果集

以默认的方式打来的ResultSet是不可更新的,要想创建可更新的ResultSet,必须在创建Statement或PreparedStatement时传入额外的参数。resultSetType:控制ResultSet的类型,该参数可以取如下三个值:ResultSet.TYPE_FORWARD_ONLY:该常量控制记录指针只能向前移动   

ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制记录指针可以自由移动(可滚动结果集),但底层数据的改变不会影响ResultSet的内容

ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制记录指针可以自由移动(可滚动结果集),而且底层数据的改变会影响ResultSet的内容。

resultSetConcurrency:控制ResultSet的并发类型

ResultSet.CONCUR_READ_ONLY:该常量指示ResultSet是只读的并发模式(默认)

ResultSet.CONCUR_UPDATEBLE:该常量指示ResultSet是可更新的并发模式。

       注意:可更新的结果集需满足两个条件:

  1. 所有数据都来自同一张表
  2. 选出的数据集必须包含主键

程序可调用ResultSet的updateXxx(int  columnIndex,  Xxx  value)方法来修改记录指针所指的值,最后调用R恶俗Set的updateRow()方法提交修改。

示例代码:

Connection  conn = DriverManager.getConnection(url,user,pass);

PreparedStatement  pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENTSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet  rs=pstmt.executeQuery();

rs.last();

int  rowCount=rs.getRow();

for(int  i=rowCount;i>0;i--)

{

       rs.absolute(i);

//修改记录指针所指记录、第2列的值

       rs.updateString(2, “学生名”+i);

       rs.updateRow();

}

             

 

二、处理Blob类型数据

Blob是二进制长对象的意思,Blob列用于存储大文件,典型的内容是一张图片或一个声音文件。使用Blob列可以吧图片、声音等文件的二进制数据保存在数据库里面,并可以从数据库里恢复指定文件。

  1. 将图片插入数据库:将Blob数据插入数据库需要使用PreparedStatement,该对象有一个方法:setBinarySteam(int  parameterIndex,  InputStream  x),该方法   指定参数传入二进制输入流,从而可以实现将Blob数据保存到数据库的功能
  2. 从ResultSet里取出Blob数据:可以调用ResultSet的getBlob(int  columnIndex)方法,该方法将返回一个Blob对象,Blob对象提供了getBinaryStream()方法来获取该Blob数据的输入流,也可以使用Blob对象提供的getBytes()方法直接取出该Blob对象封装的二进制数据。

注:在数据库中建立一个数据表存储图片时,格式为mediumblob

代码示例:

将指定图片放入数据库

//fileName为图片文件的地址

//截取文件名

String  imageName = filename.substring(filename.lastIndexOf(‘\\’)+1,filename.lastIndexOf(‘.’));

File  f=new File(fileName);

try(InputStream  is=new  FileInputStream(f))

{

//设置图片名参数

Insert.setString(1,imageName);

//设置二进制流参数

Insert.setBinaryStream(2,is,(int ) f.length());

Int   affect=insert.executeUpdate();

 

}

catch(Exception  e)

{

e.printStackTrace();

}

 

根据图片ID显示图片

//设置参数

PreparedStatement  query;

query = conn.prepareStatement(“select  image_date  from  img_table”+”where  img_id=?”);

query.setInt(1,id);//将id设为1

try(ResultSet  rs=query.executeQuery())

{

        If(rs.next())

{

               //取出Blob列

               Blob  imgBlob=rs.getBlob(1);

               //取出Blob列的数据

               ImageIcon  icon=new ImageIcon(ImgBlob.getBytes(1L,(int )imgBlob.length()));

               imageLabel.setIcon(icon);

}

}

三、使用ResultSetMetaData分析数据结果集

ResultSetMetaData可以获取关于ResultSet的描述信息。ResultSet里包含一个getMetaData()方法,该方法返回的该ResultSet对应的ResultSetMetaData对象,获得该对象后,就可以通过ResultSetMetaData提供的方法返回ResultSet的描述信息。常用的方法有三个:

int  getColumnCount():返回该ResultSet的列数量

String  getColumnName(int  column):返回指定索引的列名

int  getColumnType(int  column):返回指定索引的列类型。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值