服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jdbc2/3.0的特征点滴

最近写程序已经很少直接用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(); //插入新记录


jdbc2.0提供的还有一个功能就是数据库的批量操作:

  con.setautocommit(false);
  statement stmt3 = con.createstatement();
  stmt3.addbatch("insert .....");
  stmt3.addbatch("insert .....");
  int[] rows = stmt3.executebatch();
  con.commit();

但是有一点要注意,stmt3.executebatch()他不会自动给你回滚数据操作,当你有5条update语句的时候,如果第三条发生错误,那么将无法自动回滚前两条update语句的影响,所以一定要自己手工进行事务管理。

扫描关注微信公众号