Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26254439
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-06-09 13:26:50

JDBC数据集高级特性

时间:2010-6-9

示例数据表结构

CREATE TABLE `test` (

  `sid` varchar(20) NOT NULL default '',

  `s1` varchar(50) default NULL,

  `s2` varchar(50) default NULL,

  PRIMARY KEY  (`sid`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

三个字段。现在来测试一下

背景资料介绍

Statement stmt =

con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

通用格式为:Statement stmt=con.createStatement(int typeint concurrency);我们在访问数据库的时候,在读取返回结果的时候,可能要前后移动指针,比如我们先计算有多少条信息,这是我们就需要把指针移到 最后来计算,然后再把指针移到最前面,逐条读取,有时我们只需要逐条读取就可以了。还有就是有只我们只需要读取数据,为了不破坏数据,我们可采用只读模 式,有时我们需要望数据库里添加记录,这是我们就要采用可更新数据库的模式。下面我们就对其参数进行说明:

笔记:那我想这两个参数的意思应该是一个控制是否可前后滚动。另外一个应该是控制这个结果集是否可以被破坏。

参数 int type

ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。(这样的话就不可以再往前滚了!)

ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。(与数据库脱离关系)

ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。(与数据库保持关系)


结论:这个参数就是用来控制结果集的前后滚动情况了
参数 int concurrency

ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。(这样的话就可以保护我们的数据表。只读 注意ResultSet与数据表是独立开来的。)

ResultSet.CONCUR_UPDATETABLE 能用结果集更新数据库中的表。

查询语句

ResultSet re=stmt.executeUpdate(SQL语句);用来更新数据库信息或插入数据

ResultSet re=stmt.executeQuery(SQL语句);用来查询数据库信息

当我们使用ResultSet re=stmt.executeQuery(SQL语句)查询后,我们可以使用下列方法获得信息:

public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时,返回false

public void beforeFirst 将游标移动到结果集的初始位置,即在第一行之前。

public void afterLast() 将游标移到结果集最后一行之后。

public void first() 将游标移到结果集的第一行。

public void last() 将游标移到结果集的最后一行。

public boolean isAfterLast() 判断游标是否在最后一行之后。

public boolean isBeforeFirst() 判断游标是否在第一行之前。

public boolean ifFirst() 判断游标是否指向结果集的第一行。

public boolean isLast() 判断游标是否指向结果集的最后一行。

public int getRow() 得到当前游标所指向行的行号,行号从1开始,如果结果集没有行,返回0

public boolean absolute(int row) 将游标移到参数row指定的行号。如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数 第2行。当移动到第一行前面或最后一行的后面时,该方法返回false

示例:

1、  通过在结果集ResultSet里面操作同步变更到数据表!

private void testUpdateResultSet() {

    String sql = "select * from test";

    Connection conn = getConnection();

    try {

        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

        ResultSet rs = stmt.executeQuery(sql);

        System.out.println("-------原结果集---------");

        while(rs.next()) {

            System.out.println("行号:"+rs.getRow()+"\t" + rs.getString(1)+"\t"+rs.getString(2));

        }

        System.out.println("------插入一条记录-------");

        rs.first();

        //将光标移到要插入的行

        rs.moveToInsertRow();

        //构建要插入的数据

        rs.updateString(1, "0000");

        rs.updateString(2, "55555555555");

        rs.updateString(3, "w55555555555o");

        //开始插入一行

        rs.insertRow();

        rs.close();

        stmt.close();

    } catch (Exception e) {

        // TODO: handle exception

        e.printStackTrace();

    }

注意:

1、当前操作的表必须要有主键!如果没有主键的话这样写就不行了!

2、  下标元素从1开始的。

3、  这里面我们有first() 所以这条新记录其实被插入到行首位置!

 

我们可以这样

rs.absolute(3);             //采用这种绝对定位的方法。直接定位到第四条记录处(0开始)

//将光标移到要插入的行

rs.moveToInsertRow();       //我的理解是这个命令相当于打开一个插入的命令

//构建要插入的数据

rs.updateString(1, "helloss");

rs.updateString(2, "sr");

rs.updateString(3, "sddd");

//开始插入一行

rs.insertRow();             //提交

 

以上是依据数据集进行变更。这样的好处是什么呢?准确定位想要插入的记录位置。传统的插入的办法是从后面追加进来的。有了这个机制之后就可以方便在中间做插入操作。

rs.absolute(2);

        rs.updateString(1, "dd");

        rs.updateString(2, "woeeeeeee");

        rs.updateString(3, "rr");

        rs.updateRow();

准确定位哪个结果行。然后变更过来!

以下是移动结果集的游标情况

try {

        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

        ResultSet rs = stmt.executeQuery(sql);

        System.out.println("-------原结果集---------");

        while(rs.next()) {

            System.out.println("行号:"+rs.getRow()+"\t" + rs.getString(1)+"\t"+rs.getString(2));

        }

        System.out.println("------前滚操作-----");

        rs.previous();          //向前滚动

        rs.previous();

        System.out.println("行号:"+rs.getRow()+"\t" + rs.getString(1)+"\t"+rs.getString(2));    

        System.out.println("------绝对定位-----");

        //将光标移动到此 ResultSet 对象的给定行编号。

        rs.absolute(3);

        System.out.println("[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" );       

        System.out.println("------移动到第一行-----");

        //将光标移动到此 ResultSet 对象的第一行。rs.first() 移动到第一行

        if (rs.first()) {    //移到第一行

                System.out.println("[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" );

        }

        System.out.println("------移动到最后一行-----");

        //将光标移动到此 ResultSet 对象的第一行。

        if (rs.last()) {

                System.out.println("[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t");

        }       

        System.out.println("------移动到第一行之前-----");

        //将光标移动到此 ResultSet 对象的开头,正好位于第一行之前

        rs.beforeFirst();

        rs.next();

        System.out.println("[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));

        System.out.println("------移动到最后一行之后-----");

        //将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。

        rs.afterLast();

        rs.previous();

        System.out.println("[行号:" + rs.getRow() + "]\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));

        rs.close();

        stmt.close();

    } catch (Exception e) {

        // TODO: handle exception

        e.printStackTrace();

    }

阅读(860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~