您的位置:首页 > 其它

JDBC第三讲:jdbc2.0新特征和Updatability结果更新

2014-02-23 16:22 411 查看

一、JDBC 2.0新特性:

    1、 Scrollability 结果集可滚动

        滚动:可双向支持绝对与相对滚动,对结果集可进行多次迭代。

            Con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

            //上句的 SCROLL 再到 CONCUR;不可以写反,编译器无法检测到,因为他们都是int类型的。

        TYPE_FORWARD_ONLY:(单向,一般不用)该常量指示指针只能向前移动的 ResultSet 对象的类型。

        TYPE_SCROOL_INSENSITIVE:(双向、不敏感)可滚动但不受其他更改影响的 ResultSet 对象的类型。

        TYPE_SCROLL_SENSITIVE:(双向、敏感)该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。

        CONCUR_READ_ONLY:(只读)该常量指示只可以读取的 ResultSet 对象的并发模式。

        CONCUR_UPDATABLE:(可更新)该常量指示可以更新的 ResultSet 对象的并发模式。

        绝对定位:boolean absolute(int row)将游标移动到指定位置。(row指记录的序号,没有这位置则返回false) 

                void afterLast() 将游标指向最后一条记录的后一位(有这位置,但记录为空)。

                void beforeFirst()将游标指向最前一条记录的前一位。

                boolean first()将游标移动到结果集最前。

                boolean last()将游标移动到结果集末尾。

        相对定位:boolean next()指向下一个。

                boolean previous()指向前一个。

                boolean relative(int) 向next()方向移动 int 位(int 可负)。

        判位函数:boolean isAfterLast() 是否在最后一条的后一位。

                boolean isBeforeFirst() 是否最前一条记录的前一位。

                boolean isFirst() 是否最前位置。

                boolean isLast() 是否最后位置。

    2、 Updatability 结果集可更新。(主要应用于桌面应用)

        更新:rs.updateString(“name”,”Tony”);//前面一个是字段的名字或者序号

        rs.updateInt(1,”122323”);修改

        rs.deleteRow();删除

        rs.updateRow();

     注:只有在必要的时候(如桌面应用)才用结果集更新数据库,因为使用结果集更新数据库效率低下。

        可更新结果集还要看数据库驱动程序是否支持,如Oracle就支持,MySql不支持。

        并且只能针对一张表做结果集更新(不能子查询)。而且不能有join操作。

        必须有主健,必须把所有非空没有默认值的字段查出。

        处理可更新结果集时不能用select *来查询语句,必须指出具体要查询的字段。(不能使用通配符) 

    3、 Batch updates 可批量更新。

        将多组对数据库的更新操作发送到数据库统一执行(数据库支持并发执行操作),以提高效率。

        主要是通过减少数据(Sql语句或参数)在网络上传输的次数来节省时间。//数据有两组以上都应该用这批量更新

        (1)对于Statement的批量更新处理:

            stm.addBatch(Sql);

            int[] ResultSet=stm.executeBatch();    

`

        (2)对于PreparedStatement的批量跟新处理

             pstm.setInt(1,12);pstm.setString(2,”gaga”);……..

             pstm.addBatch();

             if(i%100==0) int[] ResultSet=pstm.executeBatch();//每个包50~200组数据,包太大也影响速度

        注:int[] 中每一个数表示该Sql语句影响到的记录条数。

        PreparedStatement的更新操作比Statement的更新操作多了一个设置参数的过程。

二、SQL 3.0规范中的新类型:

        Blob,大的二进制数据文件,最多存储2G。

        Clob,大文本文件对象,最多存储2G。

    在使用上述大对象的时候,在使用JDBC插入记录时要先插入一个空的占位对象,

        "insert into tableName valuse(?,?,empty_blob())"//在数据库制造一个空的blob对象字段值

        然后使用"select blobdata from t_blob where id = ? for update"对获得的大对象进行实际的写入操作

        Blod通过getBinaryOutputStream()方法获取流进行写入。

        getBinaryStream()方法获得流来获取Blob中存储的数据。 

    Clob的操作也和、Blob相同。

        getAsciiStream()用于读取存储的文本对象,getAsciiOutputStream()方法之获得流用来向文件对象写入的。

    BLOB与CLOB的异同点:

        ① 都可以存储大量超长的数据;

        ② BLOB (Binary Large Object) 以二进制格式保存,特别适合保存图片、视频文件、音频文件、程序文件等;

        ③ CLOB (Character Large Object) 以Character格式保存于数据库中,适合保存比较长的文本文件。

三、JDBC 2.0扩展

    (一)JNDI(命名目录服务器):

        定义:是Java的命名目录服务器。而JDBC是Java的数据库访问接口。

            跟JDBC是平级的关系,是两个独立的JNDI;JDBC存储的数据都是以二维表的接口来大规模存储数据。

            而JNDI存储的是差异性比较大的Java对象。JDBC取数据时用Sql语言访问数据。JNDI只用lookup和bind读写

            JDBC API依赖于驱动程序,而JNDI依赖于服务提供者。

            JDBC一般把数据存储到关系型数据库,而JNDI一般把数据存储到小型数据库、文件、甚至是注册表中。

            JNDI相当于一个电话本。允许程序将一个对象和一个命名绑定到目录树上。

               (JNDI的方法是在javax.naming包下,接口是Context实现类是InitialContext)

        bind(String name, Object obj) 将名称绑定到对象资源,建立指定的字符串和对象资源的关联

        lookup(String name) ,通过指定的字符串获得先前绑定的资源

        /*********以下是将资源和JNDI命名绑定的方法**************/

        public static void bind(String context, Object obj) throws NamingException{

            Properties pro = new Properties();

            //Weblogic的JNDI服务器参数

        pro.put(InitialContext.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");

            pro.put(InitialContext.PROVIDER_URL, "t3://localhost:7001");

            Context ctx = new InitialContext(pro);//连接服务器

            ctx.bind(context, obj);//存储

        }

    (二)DataSourse(数据源)

        1、包含了连接数据库所需的信息,可以通过数据源获得数据库连接,

           有时由于某些连接数据库的信息会变更,所以经常使用包含数据库连接信息的数据源。

        2、一个标准的数据库连接工厂,作为DriverManager的替代项,保存与数据库相关的信息,

           可以将数据库的连接信息放在一个共享的空间进行提取,不用在本地安装。

           支持JNDI的绑定,支持连接池,支持分布式服务,用getConnection方法可获得与数据库的连接。

           数据源应该由管理员创建(目的是为了保证数据库的安全)。所以数据源对象一般放在JNDI服务器中。

        /*********通过JNDI获得绑定的资源**************/

        public static Object lookup(String context) throws NamingException{

            Properties pro = new Properties();

            //Weblogic的JNDI服务器参数

        pro.put(InitialContext.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");

            pro.put(InitialContext.PROVIDER_URL, "t3://localhost:7001");

            Context ctx = new InitialContext(pro);

            return ctx.lookup(context);//查找;通过指定的字符串获得先前绑定的资源。

        }

    (三)连接池:

        在内存中用来保存一个个数据库连接的对象。

        访问数据库时,建立连接和拆连接需要花费较长时间,通过以连接池直连的方式获取连接,不需要注册驱动程序,可以大量

        的节省销毁和创建连接的资源消耗,提高访问数据库的效率。

     注:通过连接池获得的Connection,当执行con.close()时,不是关闭连接,而是表示将连接释放回连接池。

         连接池是一个很复杂的算法,由服务器厂商实现。

    (四)分布式的事务管理器JTA

        分布式事务是通过多个异地数据库执行一组相关的操作,要保证原子操作的不可分,

        也不用再自己写commit,和rollback,全部都交给中间服务器(TM)来处理。

        (两阶段提交),也就是在中间服务器发送sql语句等待数据库回应,都回应操作成功才提交,否则同时回滚。

                         ----------------   commit

            con1 ------->| TM(事务管理器) | -----------> DB1

            con2 ------->|    commit    | -----------> DB2

                         ----------------   commit

        1、regester  

        2、TM->execute()  

        3、commit->TM 

        4、TM->commit->DB 

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: