??xml version="1.0" encoding="utf-8" standalone="yes"?>
9.2.1 新的记录集接?ResultSet接口)
1 新定义了若干个常?
q些常数用于指定ResultSet的类?游标Ud的方向等性质 如下所C?
public static final int FETCH_FORWARD;
public static final int FETCH_REVERSE;
public static final int FETCH_UNKNOWN;
public static final int TYPE_FORWARD_ONLY;
public static final int TYPE_SCROLL_INSENSITIVE;
public static final int TYPE_SCROLL_SENSITIVE;
public static final int CONCUR_READ_ONLY;
public static final int CONCUR_UPDATABLE;
FETCH_FORWORD 该常数的作用是指定处理记录集中行的顺序是由前到后 即从W一行开始处?一直到最后一行?
FETCH_REVERSE 该常数的作用是指定处理记录集中行的顺序是由后到前 即从后一行开始处?一直到W一行?
FETCH_UNKNOWN 该常数的作用是不指定处理记录集中行的序 ?JDBC 驱动E序和数据库pȝ军_
TYPE_FORWARD_ONLY 该常数的作用是指定数据库游标的移动方向是向前 不允许向后移?卛_能用ResultSet接口的next()Ҏ(gu) 而不能?previous()Ҏ(gu) 否则会生错误?
TYPE_SCROLL_INSENSITIVE 该常数的作用是指定数据库游标可以在记录集中前?br />Ud q且当前数据库用戯取的记录集对其他用户的操作不敏感 是?当前用户?br />在浏览记录集中的数据 与此同时 其他用户更新了数据库中的数据 但是当前用户所?br />取的记录集中的数据不会受CQ何媄响?
TYPE_SCROLL_SENSITIVE 该常数的作用是指定数据库游标可以在记录集中前后移?q且当前数据库用戯取的记录集对其他用户的操作敏?是?当前用户正在览记录?但是其它用户的操作数据库中的数据发生了变化 当前用户所获取的记录集中的数据也会同步发生变化 q样有可能会D非常严重的错误?慎重使用该常敊W?
CONCUR_READ_ONLY 该常数的作用是指定当前记录集的协作方?concurrency mode)为只?一旦用了q个常数 那么用户׃可以更新记录集中的数据?CONCUR_UPDATABLE 该常数的作用是指定当前记录集的协作方?concurrency mode)为可以更?一旦用了q个常数 那么用户可以?updateXXX(){方法更新记录集中的数据
2 ResultSet接口提供了一整套的定位方?
q些可以在记录集中定位到L一?具体有?
public boolean absolute(int row); 该方法的作用是将记录集中的某一行设定ؓ当前?亦即数据库游标Ud到指定的?参数 row指定了目标行的行?q是l对的行L记录集的W一行开始计?不是相对的行号?
public boolean relative(int rows); 该方法的作用也是记录集中的某一行设定ؓ当前?但是它的参数 rows表示目标行相对于当前行的行号 例如当前行是W??现在需要移动到W?行去 既可以用absolute()Ҏ(gu) 也可以?relative()Ҏ(gu) 代码如下
例?
rs.absolute(5);
或?
rs.relative(2);
其中rs代表ResultSet接口的实例对象?
又如当前行是W??需要移动到W?3行去 代码如下
例?
rs.absolute(3);
或?
rs.relative(-2);
其中rs代表ResultSet接口的实例对象?
读者需要注意的问题?传递给 relative()Ҏ(gu)的参?如果是正?那么数据库游标向前移?如果是负?那么数据库游标向后移动?
注意 在本章中所说的数据库游标向前移动是指向行号增大的方向移?向后Ud是指向行号减的方向Ud
public boolean first(); 该方法的作用是将当前行定位到数据库记录集的第一行?
public boolean last(); 该方法的作用刚好?first()Ҏ(gu)相反 是将当前行定位到数据库记录集的最后一行?
public boolean isFirst(); 该方法的作用是检查当前行是否记录集的W一?如果是返回true 否则 q回false
public boolean isLast(); 该方法的作用是检查当前行是否记录集的最后一?如果?q回true 否则 q回false
public void afterLast(); 该方法的作用是将数据库游标移到记录集的最?位于记录集最后一行的后面 如果该记录集不包含Q何的?该方法不产生作用
public void beforeFirst(); 该方法的作用是将数据库游标移到记录集的最前面 位于记录集第一行的前面 如果记录集不包含M的行 该方法不产生作用
public boolean isAfterLast(); 该方法检查数据库游标是否处于记录集的最后面 如果?q回true 否则 q回false
public boolean isBeforeFirst(); 该方法检查数据库游标是否处于记录集的最前面 如果?q回true 否则 q回false
public boolean next(); 该方法的作用是将数据库游标向前移动一?使得下一行成为当前行 当刚刚打开记录集对象时 数据库游标的位置在记录集的最前面 W一ơ?next()Ҏ(gu) 会使数据库游标定位到记录集的第一?W二ơ?next()Ҏ(gu) 会使数据库游标定位到记录集的第二行 以此cL
注意 如果在当前行打开了一个输入流(Input Stream) 那么再次使用 next()Ҏ(gu)时将会自动关闭该输入?
public boolean previous(); 该方法的作用是将数据库游标向后移动一?使得上一行成为当前行
3 ResultSet接口d了对行操作的支持
使用JDBC API 2.0 不仅可以L数据库游标定位到记录集中的特定?而且q可以用ResultSet接口新定义的一套方法更新当前行的数?在以?如果JavaE序员希望更新记录集中某行的数据 必须发?SQL 语句l数据库 E序员需要在 Java 代码中嵌入冗长的SQL语句 用以执行 UPDATE DELETE INSERT {数据库操作 但是 当JDBC API 2.0 出现?一切就都改变了 E序员已l可以部分抛开 SQL语言 享受Java~程的乐了 ResultSet接口中新d的部分方法如下所C?
public boolean rowDeleted(); 如果当前记录集的某行被删除了 那么记录集中会?br />Z个空?调用rowDeleted()Ҏ(gu) 如果探测到空位的存在 那么p?true 如果没有探测到空位的存在 p回false值?
public boolean rowInserted(); 如果当前记录集中插入了一个新?该方法将q回true 否则q回false
public boolean rowUpdated(); 如果当前记录集的当前行的数据被更?该方法返回true 否则q回false
public void insertRow(); 该方法将执行插入一个新行到当前记录集的操作
public void updateRow(); 该方法将更新当前记录集当前行的数据?
public void deleteRow(); 该方法将删除当前记录集的当前行?
public void updateString(int columnIndex String x); 该方法更新当前记录集当前行某列的?该列的数据类型是 String(?Java 数据cd?String 与之对应?JDBC 数据cd是VARCHAR或NVARCHAR {数据类? 该方法的参数 columnIndex指定所要更新的列的列烦?W一列的列烦引是 1 以此cL W二个参?x 代表新的?q个Ҏ(gu)q不执行数据库操?需要执?insertRow()Ҏ(gu)或?updateRow()Ҏ(gu)以后 记录集和数据库中的数据才能够真正更新
public void updateString(String columnName String x); 该方法和上面介绍的同名方法差不多 不过该方法的W一个参数是 columnName 代表需要更新的列的列名 而不是columnIndex
ResultSet 接口中还定义了很多个 updateXXX()Ҏ(gu) 都和上面的两个方法相cM ׃幅的原?在这里就不详l描qC Ҏ(gu)感兴的读?可以参考相关的文献
往数据库当前记录集插入新行的操作流E如下?
1 调用moveToInsertRow()Ҏ(gu)
2 调用updateXXX()Ҏ(gu) 指定插入行各列的值?
3 调用insertRow()Ҏ(gu) 往数据库中插入新的行?
更新数据库中某个记录的?某行的?的方法是
1 定位到需要修改的?使用 absolute() relative(){方法定?
2 使用相应updateXXX()Ҏ(gu)讑֮某行某列的新?XXX 所代表的Java 数据cd
必须可以映射为某列的JDBC数据cd 如果希望rollback该项操作 请再调用updateRow()Ҏ(gu)以前使用cancelRowUpdates()Ҏ(gu) q个Ҏ(gu)可以某行某列的值复原?
3 使用updateRow()Ҏ(gu) 完成 UPDATE 的操作?
删除记录集中某行(亦即删除某个记录)的方法?
1 定位到需要修改的?使用 absolute() relative(){方法定?
2 使用deleteRow()Ҏ(gu)
4 新的ResultSet接口d了对 SQL3数据cd的支?
5 获取记录集行数的Ҏ(gu)
1 首先使用last()Ҏ(gu) 数据库游标定位到记录集的最后一行?
2 使用 getRow()Ҏ(gu) q回记录集最后一行的行烦?该烦引就{于记录集所?br />含记录的个数 也就是记录集的行?
9.2.2 新的SQL语句接口(Statement 接口)
在JDBC API 2.0 ?SQL语句接口(Statement接口)也有了很大的改进 功能更加强大 PreparedStatement接口和CallableStatement接口都承了 Statement接口 因此本小节也介绍q两个接口相对于 JDBC API 1.0的改q之?因ؓ上述的三个接口都由Connection接口的方法创?所以本节也顺便提一?Connection接口
1 Statement接口 CallableStatement接口 PreparesStatement接口的创?
q三个接口分别由Connection接口的createStatement() prepareStatement() prepareCall(){方法创?q几个方法的定义如下
public Statement createStatement();
public Statement createStatement(int resultSetType int resultSetConcurrency);
public CallableStatement prepareCall(String sql);
public CallableStatement prepareCall(String sql int resultSetType
int resultSetConcurrency);
public PreparedStatement prepareStatement(String sql);
public PreparedStatement prepareStatement(String sql int resultSetType
int resultSetConcurrency);
上面列出的方法中
参数sql代表需要执行的 SQL语句 q些 SQL语句不是完整?br />SQL 语句 一般带?IN/OUT/INOUT 参数 参数 resultSetType 代表该方法创建的 SQL 语句接口执行 SQL 语句所q回?ResultSet 的类?例如 是否允许数据库游标前后移动是否对其他用户的数据库更新操作敏感{?它们都是一些整型的常数 在ResultSet接口中定义了
参数 resultSetConcurrency 代表该方法创建的SQL语句接口执行SQL语句所q回的ResultSet的协同模?如允许更新记录集的数?或者仅仅只?不能更新{?它们也是一些整型的常数 在ResultSet接口中定义了
例?
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE
ResultSet.CONCUR_UPDATABLE);
上面的代码创Z一?SQL语句接口(Statement)的实例对?该实例对象允许它执行
SQL语句所q回的记录集中的数据库游标前后移?允许更新记录集中的数据?
2 支持Ҏ(gu)?
Statement接口 PreparedStatement接口 CallableStatement接口都支持数据库Ҏ(gu)作就是将若干?SQL 语句dC?SQL 语句?Batch)?一q发送到数据库服务器L据库引擎执行?SQL语句块中的语句后 会将所有的l果一q返?q种功能特别适用于大扚w的数据库 INSERT 操作 Z实现q样的功?必须用到?Statement接口的方?br />如下所C?
public void addBatch(String sql); 该方法用于将SQL语句d?SQL语句块中
public void clearBatch(); 该方法用于将SQL语句块中的所有SQL语句全部删除
public int[] executeBatch(); 该方法用于将 SQL语句块发送到数据库服务器?q执
行它 q回的结果是一个整型数l?数组中的元素是数据库服务器执?SQL语句块中SQL语句所q回的更新计?SQL语句块中含有多少?SQL语句 q回的整行数l中含有多个元素
使用JDBC API执行数据库批操作的方法是
1 创徏Statement接口的实例对象?
2 调用addBatch()Ҏ(gu) 往SQL语句块中d若干个SQL语句
3 使用executeBatch()Ҏ(gu) 完成数据库批操作
上面介绍的执行数据库Ҏ(gu)作的Ҏ(gu)仅仅适用?Statement 接口 不适用?br />PreparedStatement接口 CallableStatement接口 后面两个接口定义了新?addBatch()Ҏ(gu)
该方法不需要Q何参?但是在Statement接口中定义的 addBatch()Ҏ(gu)却需要参?参数是一个SQL语句 数据cd是String
?PreparedStatement接口 CallableStatement接口中实现数据库Ҏ(gu)作的Ҏ(gu)是?
1 创徏PreparedStatement接口或者CallableStatement接口的实例对象?
2 使用PreparedStatement 接口中定义的 setXXX()Ҏ(gu)讑֮ SQL语句(?SQL语句是在创徏 PreparedStatement 接口或?CallableStatement 接口的实例对象时初始化的)的IN/OUT/INOUT 参数的?CallableStatement 接口q没有定义Q?setXXX()Ҏ(gu) 它的setXXX()Ҏ(gu)全部l承自PreparedStatement接口)
3 使用executeBatch()Ҏ(gu)该方法在Statement接口中定义不qPreparedStatement
接口和CallableStatement接口都承了q个Ҏ(gu)