一、可滚动、可更新的结果集
可滚动结果集:使用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是可更新的并发模式。
注意:可更新的结果集需满足两个条件:
- 所有数据都来自同一张表
- 选出的数据集必须包含主键
程序可调用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列可以吧图片、声音等文件的二进制数据保存在数据库里面,并可以从数据库里恢复指定文件。
- 将图片插入数据库:将Blob数据插入数据库需要使用PreparedStatement,该对象有一个方法:setBinarySteam(int parameterIndex, InputStream x),该方法 指定参数传入二进制输入流,从而可以实现将Blob数据保存到数据库的功能
- 从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):返回指定索引的列类型。