JDBC 2.0比1.0有了一些不同,体现在四个比较明显的方面:
1>. ResutlSet对象中的Cursor能够自由上下移动
2>. 能直接使用Java程序语言来更新DB表里的内容,而不需要额外写SQL语法
3>. 可以一次传送许多SQL语句到DB执行----Batch
4>. 新增2个数据类型(BLOB和CLOB)
我们知道在JDBC 1.0时,只要用 connection.createStatement()就能取得Statement()对象.不过在2.0中多的createStatement()
多了两个参数值,需要我们自己来定义它.
public Statement createStatement(int resultSetType,
int resultSetConcurrency)throws SQLException
第一个参数resultSetType用来设定ResultSet对象中的光标是否可以自由上下移动,它的值有三种,TYPE_FORWARD_ONLY,TYPE_SCROLL_SENSITIVE,
TYPE_SCROLL_INSENSITIVE.若为TYPE_FORWARD_ONLY就表示和1.0一样只能用next()方法;然后后两者可以让Cursor随便的自由移动,不过,
它们两者最大的区别在于:当ResutlSet中的值有改变时,TYPE_SCROLL_SENSITIVE能取得修改后的值,而TYPE_SCROLL_INSENSITIVE则不能.
第而个参数resultSetConcurrentcy,主要是设定ResultSet对象是只读(read-only)还是可以改变的(updateable),它可能的值有两种,
CONCUR_READ_ONLY或者是CONCUR_UPDATE.若设置为CONCUR_READ_ONLY,ResultSet对象和1.0一样;若为CONCUR_UPDATEABLE,那么就可以用
ResultSet对象执行数据库的修改,增加和移除功能.for example:
先看功能和1.0一样的写法:
Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
RestultSet rs=stmt.executeQuery("select ename,empno from emp");
while(rs.next())
{
String name=rs.getString("ename");
int empno=rs.getInt("empno");
System.out.println("name="+name+","+"number="+empno);
}
输出结果为:
name=feiyang,number=1190
name=jack, number=1230
name=BillGates number=12
...........
再看看下面这个:
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
RestultSet rs=stmt.executeQuery("select ename,empno from emp");
rs.afterLast();
while(rs.previous())
{
String name=rs.getString("ename");
int empno=rs.getInt("empno");
System.out.println("name="+name+","+"number="+empno);
}
输出结果为:
name=BillGates number=12
name=jack, number=1230
name=feiyang,number=1190
.............
这和上面第一有点不同的是顺序颠倒了,这是因为我们使用了rs.afterLast()这个方法.其实2.0中还有很多方法,如下:
rs.absolute(-1); //表示cursor在最后一笔数据,即 rs.last()
rs.absolute(1); //表示cursor在第一笔数据,即rs.first()
rs.absolute(n); //表示cursor在第N笔数据
假使我们目前有1000笔数据,取得第997笔
rs.absolute(-4);
还有一个方法和absolute很相像,那就是relative(),
rs.absolute(5); //表示第五笔数据
......
rs.relative(-3); //表示cursor目前在第二笔数据
.......
rs.relative(1); //cursor目前在第三笔数据
看看怎么用ResultSet对象执行更新数据库动作
要让ResultSet对象执行更新数据库的动作,首先在声明Statement对象时,参数必须设置为TYPE_SCROLL_SENSITIVE和
CUNCOR_UPDATEABLE.
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select ename,empno from emp);
rs.last();
rs.updateInt("empno",2230);
rs.cancelRowUpdates();
rs.updateInt("empno",1213);
rs.updateRow();
新增数据到数据库
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select * from emp);
rs.moveToInsertRow();
rs.updateInt("empno",2230);
rs.updateString("ename","feiyang");
rs.updateString("job","clerk");
rs.updateFloat("sal",123456.5);
rs.insertRow();
删除数据
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select * from emp);
rs.absolute(4);
rs.deleteRow();
依次执行多条SQL语句
Statement stmt=con.createStatment();
int[] rows;
stmt.addBatch("insert into emp values('feiyang','123456')");
stmt.addBatch("insert into offcie values('employee','Shanghai')");
rows=stmt.executeBatch();
当执行大量数据的时候为了数据的完整性,建议使用Transaction
eg:
con.setAutoCommit(false);
Statement stmt=con.createStatement();
int[] rows;
stmt.addBatch("1...........");
stmt.addBatch("2...........");
stmt.addBatch("3...........");
stmt.addBatch("4...........");
stmt.addBatch("5...........");
stmt.addBatch("6...........");
rows=stmt.executeBatch();
con.commit();
在JDBC2.0中新增加BLOB和CLOB两个数据类型
BOLB指的是二进制大型对象(Binary Large Object),CLOB指的是字符大型对象(Character Large Object).它们用来处理大型
的数据类型,他们分别代表大量的二进制数据和文字数据.