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

可滚动结果集:使用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):返回指定索引的列类型。