龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

JDBC2/3.0的特征点滴

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
最近写程序已经很少直接用JDBC了,一直都是用Hibernate来招呼,因为现在的集成框架已经很稳定了。不过对JDBC的直接使用还是不可以忽略的,JDBC3.0提供的n多的新特征还是要熟悉了解的,

最近写程序已经很少直接用JDBC了,一直都是用Hibernate来招呼,因为现在的集成框架已经很稳定了。不过对JDBC的直接使用还是不可以忽略的,JDBC3.0提供的n多的新特征还是要熟悉了解的,以前学jdbc的时候就是上网找些demo和介绍来学,使用很单一,对JDBC3.0的好多新的特征都忽略了,比如下面一个例子:

Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT * FROM user WHERE username='aa'");
  stmt.executeUpdate("UPDATE user SET lastdatetime=now() where username='aa'");

这是一个用户登录时,经常用到的代码,先是根据用户名aa查找该用户的具体信息,然后再更新该用户的最后登录时间(lastdatetime)。这这个里面,我们用了两个sql语句,这个是我一直用的方法,但是假如用JDBC2.0给我们提供的便利,我们只要写一条sql就够了,其他的都交给jdbc,看下面的代码:

Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
  ResultSet rs2 = stmt.executeQuery("SELECT * FROM user WHERE username='aa'");
  rs2.next();
  rs2.updateDate("lastdatetime", new Date(Calendar.getInstance().getTimeInMillis()));
  rs2.updateRow();

这里面最主要的特征就是ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_UPDATABLE,通过初始化Statement时传不同的参数,可以对ResultSet进行不用的错作限制。con.createStatement的时候,有三种可以掉用的函数:

1、createStatement();
  2、createStatement(int resultSetType, int resultSetConcurrency)
  3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)

其中resultSetType可选值是:
     1、ResultSet.TYPE_FORWARD_ONLY  在ResultSet中只能先前移动游标,
     2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标,
     3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标,同时ResultSet的值有所改变的时候,他可以得到改变后的最新的值
  其中resultSetConcurrency可选值是:
     1、ResultSet.CONCUR_READ_ONLY  在ResultSet中的数据记录是只读的,可以修改
     2、ResultSet.CONCUR_UPDATABLE  在ResultSet中的数据记录可以任意修改,然后更新会数据库
  其中resultSetHoldability可选值是:
     1、ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交时,不关闭ResultSet的游标
     2、ResultSet.CLOSE_CURSORS_AT_COMMIT  表示修改提交时,关闭ResultSet的游标

对于查询操作第一种初始化方法createStatement(),相当于第二种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY),第三种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT)

下面写一段demo的代码,我把一些特征函数都用出来,但是只是用来查考和说明名灵活性的。

 Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
   ResultSet rs2 = stmt.executeQuery("SELECT * FROM user");
   rs2.next();
   rs2.updateDate("lastdatetime", new Date(Calendar.getInstance().getTimeInMillis()));
   rs2.updateRow();
   rs2.afterLast();
   while(rs2.previous()){ /**....*/ }
   rs.beforeFirst();
   while(rs2.next()){  /**....*/ }
   rs.last();
   rs.first();
   rs.absolute(5); //游标移动到第5条
   rs.absolute(-1);  //游标移动到最后一条
   rs.relative(-5);  //游标向上移动5条
   rs.relative(2);   //游标向下移动2条
   rs.deleteRow(); //删除当前行
   rs.last();  //游标移动到最后
   rs.updateString("summary", "This is ..."); //设置更新的字段值
   rs.cancelRowUpdates();  //取消刚才输入的更新
   rs.getRow(); //得到当前行号
   rs.moveToInsertRow();  //游标移动到要新增的那条记录上
   rs.updateInt("id", 1);
   rs.updateString(2, "my name");
   rs.insertRow(); //插入新记录


  

精彩图集

赞助商链接