SlideShare uma empresa Scribd logo
1 de 14
Baixar para ler offline
RowSet 初步学习
                  Zianed Hou

                 zianed@live.cn




0、javax.sql.RowSet接口
1、JdbcRowSet
2、CachedRowSet
3、WebRowSet
4、JoinRowSet
5、FilteredRowSet
6、数据更新以及事务
7、事件注册监听
8、tomcat自带的连接池,使用dbcp配置




Zianed              Version 1.1   1
0、javax.sql.RowSet接口
    javax.sql.rowset 包在 jdk1.4 的 javax.sql 包中有一个 RowSet 接口;   jdk1.5 后引
入了 javax.sql.rowset 包中的五个子接口和 com.sun.rowset 包中对应的五个实现
类。jdk1.5 中 RowSet 的五个子接口分别是
    JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet 和 FilteredRowSet。
    RowSet 对象可分为两类:有连接的和无连接的。JdbcRowSet 是唯一一个有
连接的实现,        和传统的 ResultSet 一个样,       有连接的实现是基于 Jdbc 驱动的连接,
数据库的连接是贯穿整个对数据库的操作。而无连接的实现是基于 Reader 和
Writer 流的连接,在需要读取数据和写入数据的时候才建立连接,在整个操作过
程中都是断开连接的,后面四个接口都是无连接的实现(Disconnected RowSet)                         。




1、JdbcRowSet
    JdbcRowSet 是唯一一个有连接的实现,和传统的 ResultSet 一样,基于 Jdbc
驱动的连接。
JdbcRowSet 继承了 javax.sql.RowSet 接口,RowSet 接口继承自 ResultSet 接口;
                                                            。
JdbcRowSet 也继承了 javax.sql.rowset.Joinable 可连接的接口。
JdbcRowSet 只是增加了几个方法,它对结果集的操作方法和 ResultSet 都是一样
的 , 他 基 本 上 和 ResultSet 有 类 似 的 功 能 , 它 的 结 果 集 默 认 是
ResultSet.TYPE_SCROLL_INSENSITIVE
和 ResultSet.CONCUR_UPDATABLE 的,即可上下滚动和可更新的。得到该对象
之后就可以使用相应的方法对数据进行遍历,更新,插入或者删除。
它同样也可以链接数据源进行相应操作。

注:虽然 JdbcRowSet 默认是可滚动和可更新的,但需要数据库驱动支持的,如 MySql 驱动
就不支持更新结果集,需要注意文档。
1)采用设置结果集的方式
         String url = "jdbc:mysql://127.0.0.1:3306/zianed";
         String login = "root";
         String password = "";
         Class.forName("com.mysql.jdbc.Driver").newInstance();
         Connection conn = DriverManager.getConnection(url, login, password);
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery("select * from person");
         JdbcRowSet rowSet = new JdbcRowSetImpl(rs);

2)采用设置 URLusernamepasswordcommand 进行执行
        // JdbcRowSet


Zianed                            Version 1.1                               2
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
            JdbcRowSet rowSet = new JdbcRowSetImpl();
            rowSet.setUrl(url);
            rowSet.setUsername(username);
            rowSet.setPassword(password);
            rowSet.setCommand(empSql);
            rowSet.execute();
            printRowSet(rowSet, "JdbcRowSet");
            rowSet.close();


3)绑定到数据源
容器是 tomcat 环境
JNDI 名字是 java:comp/env/jdbc/linary 的话
          JdbcRowSet jrs=new JdbcRowSetImpl();
          jrs.setDataSourceName("java:comp/env/jdbc/linary");
          jrs.setCommand("select * from emp");
          jrs.execute();
          int numcols = jrs.getMetaData().getColumnCount();
          System.out.println("JdbcRowSet Result:");
          out.print("JdbcRowSet Result<br/>");
          while (jrs.next()) {
                for (int i = 1; i <= numcols; i++) {
                      out.print(jrs.getString(i) + "t");
                }
                out.print("<br/>");
          }
          jrs.close();




2、CachedRowSet
CachedRowSet 继承于 RowSet 接口,读入数据保存在缓存进行相应的操作。
JdbcRowSet 也继承了 javax.sql.rowset.Joinable 可连接的接口。

创建接口对象就是在构造方法里面传递一个 SyncProvider。CachedRowSet 对象可以使用任
何已向 SyncFactory 单件注册的 SyncProvider 实现。无连接的 RowSet 都是基于流读写的,
那么这里所说的 SyncProvider 就是提供了特定的 Reader 和 Writer。
jdk1.5 文档的 Sample Coder 有这样的实现:
     String provider= "com.fred.providers.HighAvailabilityProvider";
     CachedRowSet crs=new CachedRowSetImpl(provider);
为 RowSet 设置了特定的 Reader 和 Writer。



Zianed                                 Version 1.1                3
默认的 SyncProvider,CachedRowSet 对象的属性设置为 BaseRowSet 对象的默认属性,此
外,它将 RIOptimisticProvider 对象作为其同步提供者。RIOptimisticProvider(RI 中包含的
两个 SyncProvider 实现之一)    是在没有指定同步提供者时,  SyncFactory 单件 (singleton) 将
提供的默认提供者。 。

CachedRowSet 提供分页功能。
crs.setPageSize(5);
设置每页显示的行数。在 Reader 读取数据的时候就只读取指定的行数的数据即可。
测试代码:
              // CachedRowSet
              CachedRowSet crs = new CachedRowSetImpl();
              crs.setUrl(url);
              crs.setUsername(username);
              crs.setPassword(password);
              crs.setCommand(empSql);
              crs.setPageSize(5);
              crs.execute();
              System.out.println("CachedRowSet Result:");
              while (crs.nextPage())
              {
                   System.out.println("Next page:");
                   while (crs.next())
                   {
                      System.out.println(crs.getString(1) + "t"
                             + crs.getString(2));
                   }
              }
              crs.close();




3、WebRowSet
   WebRowSet 继承自 CachedRowSet.
   封装了读写 XML 的方法,      可以把数据库的数据持久化到 XML 文件或者从 XML 文件读
取数据写入数据库中。
1) 属性
XML Schema 定义的公共标示符
public static String PUBLIC_XML_SCHEMA =
    "--//Sun Microsystems, Inc.//XSD Schema//EN";
标准的 WebRowSet XML 模式定义位于以下 URI 中:
  public static String SCHEMA_SYSTEM_ID =
  "http://java.sun.com/xml/ns/jdbc/webrowset.xsd";

Zianed                         Version 1.1                         4
2)写入到文件或流中:通过以下方法
public void writeXml(ResultSet rs, java.io.Writer writer)
public void writeXml(ResultSet rs, java.io.OutputStream oStream)
public void writeXml(java.io.Writer writer)
public void writeXml(java.io.OutputStream oStream)
写入到 XML 文件的方法是 wrs.writeXML(new FileOutputStream("data.xml"));把内存中行集数
据写入到文件 data.xml 中。该文件记录了以下三类数据:
properties:包括 setXXX()方法所有的属性,没有设置的就是默认属性
metadata: 包括数据库表的相关元数据,     对应 ResultSetMetaData 里的信息。     包括 column-count
    和 column-definition
data:结果集的全部数据。包括 currentRow 的数据

3)从文件或流中读入到 WebRowSet 中
public void readXml(java.io.Reader reader)
public void readXml(java.io.InputStream iStream)
从 xml 文件读取数据装载到 WebRowSet 的方法是 readXML(…);只要是按照规范的格式写的
xml 都可以装载进来。

测试代码:
          // WebRowSet
          WebRowSet wrs = new WebRowSetImpl();
          wrs.setUrl(url);
          wrs.setUsername(username);
          wrs.setPassword(password);
          wrs.setCommand(empSql);
          wrs.execute();
          wrs.writeXml(new FileOutputStream("c:emp.xml"));
          wrs.beforeFirst();
          printRowSet(wrs, "WebRowSet");
          wrs.close();


          // WebRowSet File
          WebRowSet wrs2 = new WebRowSetImpl();
          wrs2.readXml(new FileInputStream("c:emp.xml"));
          printRowSet(wrs2, "WebRowSet File");
          wrs2.close();




4、JoinRowSet
在无连接的状态下直接对结果集进行 Join。
JoinRowSet 继承于 WebRowSet 接口

Zianed                           Version 1.1                             5
默认的 Join 是 inner join 的,还支持 cross join,full join,left outer join 和 right outer join,使用
setJoinType()方法来进行设置,但是需要数据库的支持。


 五种联合方式
                                                        判断是否支持的方法(返回
         联合方式                    对应的常数
                                                                布尔值)
内连接(INNER JOIN)JoinRowSet.INNER_JOIN                    supportsInnerJoin()
左外连接(LEFT
               JoinRowSet.LEFT_OUTER_JOIN supportsLeftOuterJoin()
OUTER JOIN)
右外连接(RIGHT
               JoinRowSet.RIGHT_OUTER_JOINsupportsRightOuterJoin()
OUTER JOIN)
全外连接(FULL
               JoinRowSet.FULL_JOIN       supportsFullJoin()
OUTER JOIN)
交叉连接(CROSS
               JoinRowSet.CROSS_JOIN      supportsCrossJoin()
JOIN)

设置匹配列的另外的方法:
jdbcRS.setMatchColumn(“ID”);
joinRS.addRowSet(jdbcRS);


测试代码:
             // JoinRowSet
            CachedRowSet crs1 = new CachedRowSetImpl();
            crs1.setUrl(url);
            crs1.setUsername(username);
            crs1.setPassword(password);
            crs1.setCommand(empSql);
            crs1.execute();
            CachedRowSet crs2 = new CachedRowSetImpl();
            crs2.setUrl(url);
            crs2.setUsername(username);
            crs2.setPassword(password);
            crs2.setCommand(deptSql);
            crs2.execute();
            JoinRowSet jrs = new JoinRowSetImpl();
            jrs.setJoinType(JoinRowSet.INNER_JOIN);
            jrs.addRowSet(crs1, "deptno");
            jrs.addRowSet(crs2, "deptno");
            printRowSet(jrs, "JoinRowSet");
            crs1.close();
            crs2.close();
            jrs.close();




Zianed                                Version 1.1                                    6
5、FilteredRowSet
采用实现 Predicate 来实现在无连接的情况下的 RowSet 的过滤,仅显示某些满足条件的数
据。
FilteredRowSet 继承于 WebRowSet 接口
增加了两个方法:
public void setFilter(Predicate p)
public Predicate getFilter()
设置和取得过滤条件。


Javax.sql.rowset.Predicate 接口的三个未实现方法
public boolean evaluate(RowSet rs)
public boolean evaluate(Object value, int column)
public boolean evaluate(Object value, String columnName)
evaluate(RowSet rs)方法:
此方法通常称为 FilteredRowSet 对象内部方法(非公共),它控制 RowSet 对象的指针
从一行移动到下一行。此外,如果此内部方法将指针移动到一个已删除的行上,则其将继续
移动指针,直到找到一个有效行为止。

evaluate(Object value, int column)方法和 public boolean evaluate(Object
value, String columnName)方法判断插入时,插入的数据是否在有效的 RowSet 范围之
内。


测试代码:
         // FilteredRowSet
         FilteredRowSet frsRowSet = new FilteredRowSetImpl();
         frsRowSet.setUrl(url);
         frsRowSet.setUsername(username);
         frsRowSet.setPassword(password);
         frsRowSet.setCommand(empSql);
         frsRowSet.execute();
         frsRowSet.beforeFirst();
         frsRowSet.setFilter(new Filter());


         System.out.println("FilteredRowSet Result:");
          int index = 1;
          while (frsRowSet.next())
         {
              System.out.println(frsRowSet.getString(1) + "t"
                    + frsRowSet.getString(2) + "t"
                    + frsRowSet.getString(4));
              index++;
          }

Zianed                          Version 1.1                        7
System.out.println("FilteredRowSet Result " + index + "
rows.");
             frsRowSet.close();


Filter 类如下进行数据过滤操作:
class Filter implements Predicate {


     public Filter() {
     }


     public boolean evaluate(RowSet rs) {
         // 此判断是必须的,否则在循环中,有时间到最后一个的时间会报错
         //
         if (rs == null) {
             return false;
         }
         FilteredRowSet frs = (FilteredRowSet) rs;
         boolean evaluation = false;
         try {
             int columnValue = frs.getInt(4);
             if (columnValue >= 2000) {
                 evaluation = true;
             }
             return evaluation;
         } catch (SQLException e) {
             //此处抛出异常是正常行为
             //不必进行处理,直接返回flase即可
             e.printStackTrace();
             return false;
         }


     }


     @Override
     public boolean evaluate(Object value, int column) throws SQLException
{
         return false;
     }


     @Override
     public boolean evaluate(Object value, String columnName)
             throws SQLException {
         return false;
     }


Zianed                            Version 1.1                            8
}




6、数据更新以及事务
insertRow()、deleteRow()、updateRow()只是在内存中更新了该行,同步到数据库需
要调用方法 acceptChanges() 或 acceptChanges(Connection)。如果 CachedRowSet
中保存着原数据库连接信息,则可以调用 acceptChanges();否则,则应该传入可用的
数据库连接或重新设置数据库连接参数。
增加
         cachedRS.last();
         cachedRS.moveToInsertRow();//转到要增加的那一行
         cachedRS.updateInt(1, 3);
         cachedRS.updateString(2, "Bob"); //$NON-NLS-1$
         cachedRS.updateString(3, "A new user"); //$NON-NLS-1$
         cachedRS.insertRow();//只是在内存中处理
         cachedRS.moveToCurrentRow();
         cachedRS.acceptChanges();//在数据库中更改
更新
         cachedRS.next();//找到要更新的数据
         cachedRS.updateString(2, "Terry");//更新数据
         cachedRS.updateRow();//只是在内存中处理
         conn.setAutoCommit(false);
         try {
             cachedRS.acceptChanges(conn);//在数据库中更改
             cachedRS.commit();
         } catch (SyncProviderException e) {
             // expected
             cachedRS.rollback();
         }
删除
         cachedRS.absolute(2);//删除第二行数据
         cachedRS.deleteRow();//只是在内存中处理
         cachedRS.acceptChanges();//在数据库中更改



处理事务,在不成功时回滚数据。
         cachedRS.updateRow();
         conn.setAutoCommit(false);
         try {
             cachedRS.acceptChanges(conn);
             cachedRS.commit();
         } catch (SyncProviderException e) {

Zianed                        Version 1.1                        9
// expected
             cachedRS.rollback();
         }
          conn.setAutoCommit(true);




7、事件注册监听
一个监听器需要实现 RowSetListener 接口。RowSetListener 支持三种事件监听:cursor
moved、row changed 和 rowSet changed。
Javax.sql.RowSetListener
public interface RowSetListener extends java.util.EventListener
给 RowSet 注册事件:RowSet.addRowSetListener
以通过相应的处理来监控对数据的操作。
监控三种事件
 void rowSetChanged(RowSetEvent event);//监控rowSet的改变
 void rowChanged(RowSetEvent event);//监控row的改变
 void cursorMoved(RowSetEvent event);//监控游标的移动


CachedRowSet 中会触发监听器的方法
                          cursor moved row changed rowSet changed
absolute()                √
relative()                √
next()                    √
previous()                √
first()                   √
last()                    √
beforeFirst()             √
afterLast()               √
updateRow()                           √
deleteRow()                           √
insertRow()                           √
undoDelete()                          √
undoUpdate()                          √
undoInsert()                          √
populate()                                         √
acceptChanges()                                    √
acceptChanges(Connection)                          √
execute()                                          √
execute(Connection)                                √
nextPage()                                         √
previousPage()                                     √

Zianed                        Version 1.1                      10
restoreOriginal()                                         √
release()                                                 √




8、tomcat自带的连接池,使用dbcp配置
  Tomcat6 本身集成了 dbcp 连接池${CATALINA_HOME}libtomcat-dbcp.jar,
通过该包可以构造 dbcp 连接池。如下所示:

     测试代码:
public static DataSource initDataSource(String url, String username,
             String password)
    {
          BasicDataSource bds = new BasicDataSource();
          bds.setUrl(url);
          bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
          bds.setUsername(username);
          bds.setPassword(password);
          bds.setMaxActive(5);
          return bds;
    }


    public static void closeDataSource(DataSource ds) throws SQLException
    {
          BasicDataSource bds = (BasicDataSource) ds;
          bds.close();
    }


    /**
     * @param args
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static void main(String[] args) throws InstantiationException,
             IllegalAccessException, ClassNotFoundException
    {
          String url = "jdbc:oracle:thin:@testdb:1521:orcl";
          String username = "scott";
          String password = "tiger";
          String empSql = "select empno,ename,mgr,sal,deptno from emp";
          String deptSql = "select deptno,dname,loc from dept";

Zianed                            Version 1.1                             11
// 创建BasicDataSource
         DataSource dataSource = initDataSource(url, username, password);


Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
         // 创建JDBC对象
         Connection conn = null;
         Statement st = null;
         ResultSet rs = null;


         try
         {


               conn = dataSource.getConnection();
               st = conn.createStatement();
               rs = st.executeQuery(empSql);


               System.out.println("ResultSet Results:");
               int numcols = rs.getMetaData().getColumnCount();
               while (rs.next())
               {
                     for (int i = 1; i <= numcols; i++)
                     {
                         System.out.print(rs.getString(i) + "t");
                     }
                     System.out.println();
               }
         }
         catch (SQLException e)
         {
               e.printStackTrace();
         }
         finally
         {
               try
               {
                     if (rs != null)
                     {
                         rs.close();
                     }
                     if (st != null)
                     {
                         st.close();
                     }


Zianed                                 Version 1.1                     12
if (conn != null)
                 {
                     conn.close();
                 }
                 if (dataSource != null)
                 {
                     closeDataSource(dataSource);
                 }
             }
             catch (SQLException e)
             {
                 e.printStackTrace();
             }


         }   }




References
Rowset
http://www.ibm.com/developerworks/cn/java/j-lo-java6rowset/
http://hi.baidu.com/li_zhongnan/blog/item/52f43b9460aaa818d31b705f.html
http://blog.csdn.net/zglluck/archive/2008/10/25/3144793.aspx
Dbcp
http://commons.apache.org/dbcp/
Apache-SVN
http://svn.apache.org/viewvc/




Zianed                                   Version 1.1                      13
Zianed
Homepage:http://my.unix-center.net/~Zianed/
Mail: hxuanzhe86@sina.com
MSN:zianed@live.cn
QQ:1196123432
QQGroup: 50457022
Date:2009-10-24




Zianed                        Version 1.1     14

Mais conteúdo relacionado

Mais procurados

Hibernate查询
Hibernate查询Hibernate查询
Hibernate查询llying
 
Mysql 高级优化之 逻辑处理
Mysql 高级优化之 逻辑处理Mysql 高级优化之 逻辑处理
Mysql 高级优化之 逻辑处理nigel889
 
網站設計100步
網站設計100步網站設計100步
網站設計100步evercislide
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1yiditushe
 
107个常用javascript语句 oss 计算技术 - ossez info of tech
107个常用javascript语句   oss 计算技术 - ossez info of tech107个常用javascript语句   oss 计算技术 - ossez info of tech
107个常用javascript语句 oss 计算技术 - ossez info of techYUCHENG HU
 
iOS程序设计-数据持久化
iOS程序设计-数据持久化iOS程序设计-数据持久化
iOS程序设计-数据持久化qiyutan
 
Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作zhubin885
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
实时任务调度
实时任务调度实时任务调度
实时任务调度Tony Deng
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获maclean liu
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题WASecurity
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptxjames tong
 
Sql语句的优化
Sql语句的优化Sql语句的优化
Sql语句的优化abszhanghe
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
Mysql 高级优化之 理解查询执行
Mysql 高级优化之 理解查询执行Mysql 高级优化之 理解查询执行
Mysql 高级优化之 理解查询执行nigel889
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二yiditushe
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例maclean liu
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程Lixun Peng
 

Mais procurados (20)

Hibernate查询
Hibernate查询Hibernate查询
Hibernate查询
 
Mysql 高级优化之 逻辑处理
Mysql 高级优化之 逻辑处理Mysql 高级优化之 逻辑处理
Mysql 高级优化之 逻辑处理
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
 
Zoo keeper
Zoo keeperZoo keeper
Zoo keeper
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1
 
107个常用javascript语句 oss 计算技术 - ossez info of tech
107个常用javascript语句   oss 计算技术 - ossez info of tech107个常用javascript语句   oss 计算技术 - ossez info of tech
107个常用javascript语句 oss 计算技术 - ossez info of tech
 
iOS程序设计-数据持久化
iOS程序设计-数据持久化iOS程序设计-数据持久化
iOS程序设计-数据持久化
 
Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
实时任务调度
实时任务调度实时任务调度
实时任务调度
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx
 
Sql语句的优化
Sql语句的优化Sql语句的优化
Sql语句的优化
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
Mysql 高级优化之 理解查询执行
Mysql 高级优化之 理解查询执行Mysql 高级优化之 理解查询执行
Mysql 高级优化之 理解查询执行
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程
 

Semelhante a Row Set初步学习V1.1

Jdbc中驱动加载的过程分析(下)
Jdbc中驱动加载的过程分析(下)Jdbc中驱动加载的过程分析(下)
Jdbc中驱动加载的过程分析(下)yiditushe
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developerdianming.song
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發koji lin
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫建興 王
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记yiditushe
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制maclean liu
 
Jdbc Odbc使用Excel作数据源
Jdbc Odbc使用Excel作数据源Jdbc Odbc使用Excel作数据源
Jdbc Odbc使用Excel作数据源yiditushe
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Justin Lin
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解zany_hui
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Servicesjavatwo2011
 
Hadoop基础及hive入门
Hadoop基础及hive入门Hadoop基础及hive入门
Hadoop基础及hive入门haiwang
 
Java并发核心编程
Java并发核心编程Java并发核心编程
Java并发核心编程wavefly
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训lotusprince
 

Semelhante a Row Set初步学习V1.1 (20)

Jdbc中驱动加载的过程分析(下)
Jdbc中驱动加载的过程分析(下)Jdbc中驱动加载的过程分析(下)
Jdbc中驱动加载的过程分析(下)
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developer
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
Optimzing mysql
Optimzing mysqlOptimzing mysql
Optimzing mysql
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 
Jdbc Odbc使用Excel作数据源
Jdbc Odbc使用Excel作数据源Jdbc Odbc使用Excel作数据源
Jdbc Odbc使用Excel作数据源
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)
 
Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
Sun java
Sun javaSun java
Sun java
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
Hadoop基础及hive入门
Hadoop基础及hive入门Hadoop基础及hive入门
Hadoop基础及hive入门
 
Java并发核心编程
Java并发核心编程Java并发核心编程
Java并发核心编程
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训
 

Mais de Zianed Hou

Oracle数据库日志满导致错误
Oracle数据库日志满导致错误Oracle数据库日志满导致错误
Oracle数据库日志满导致错误Zianed Hou
 
Jvm的最小使用内存测试
Jvm的最小使用内存测试Jvm的最小使用内存测试
Jvm的最小使用内存测试Zianed Hou
 
Oracle中Sql解析过程
Oracle中Sql解析过程Oracle中Sql解析过程
Oracle中Sql解析过程Zianed Hou
 
Java设置环境变量
Java设置环境变量Java设置环境变量
Java设置环境变量Zianed Hou
 
Arrays的Sort算法分析
Arrays的Sort算法分析Arrays的Sort算法分析
Arrays的Sort算法分析Zianed Hou
 
Java中的Float&Double以及Ieee754研究V1.0
Java中的Float&Double以及Ieee754研究V1.0Java中的Float&Double以及Ieee754研究V1.0
Java中的Float&Double以及Ieee754研究V1.0Zianed Hou
 
Oracle的Constraint约束V1.1
Oracle的Constraint约束V1.1Oracle的Constraint约束V1.1
Oracle的Constraint约束V1.1Zianed Hou
 
Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1Zianed Hou
 
Oracle试题Exam Adminv1.1
Oracle试题Exam Adminv1.1Oracle试题Exam Adminv1.1
Oracle试题Exam Adminv1.1Zianed Hou
 
Java中编码以及Unicode总结V1.1
Java中编码以及Unicode总结V1.1Java中编码以及Unicode总结V1.1
Java中编码以及Unicode总结V1.1Zianed Hou
 

Mais de Zianed Hou (10)

Oracle数据库日志满导致错误
Oracle数据库日志满导致错误Oracle数据库日志满导致错误
Oracle数据库日志满导致错误
 
Jvm的最小使用内存测试
Jvm的最小使用内存测试Jvm的最小使用内存测试
Jvm的最小使用内存测试
 
Oracle中Sql解析过程
Oracle中Sql解析过程Oracle中Sql解析过程
Oracle中Sql解析过程
 
Java设置环境变量
Java设置环境变量Java设置环境变量
Java设置环境变量
 
Arrays的Sort算法分析
Arrays的Sort算法分析Arrays的Sort算法分析
Arrays的Sort算法分析
 
Java中的Float&Double以及Ieee754研究V1.0
Java中的Float&Double以及Ieee754研究V1.0Java中的Float&Double以及Ieee754研究V1.0
Java中的Float&Double以及Ieee754研究V1.0
 
Oracle的Constraint约束V1.1
Oracle的Constraint约束V1.1Oracle的Constraint约束V1.1
Oracle的Constraint约束V1.1
 
Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1Tomcat连接池配置方法V2.1
Tomcat连接池配置方法V2.1
 
Oracle试题Exam Adminv1.1
Oracle试题Exam Adminv1.1Oracle试题Exam Adminv1.1
Oracle试题Exam Adminv1.1
 
Java中编码以及Unicode总结V1.1
Java中编码以及Unicode总结V1.1Java中编码以及Unicode总结V1.1
Java中编码以及Unicode总结V1.1
 

Row Set初步学习V1.1

  • 1. RowSet 初步学习 Zianed Hou zianed@live.cn 0、javax.sql.RowSet接口 1、JdbcRowSet 2、CachedRowSet 3、WebRowSet 4、JoinRowSet 5、FilteredRowSet 6、数据更新以及事务 7、事件注册监听 8、tomcat自带的连接池,使用dbcp配置 Zianed Version 1.1 1
  • 2. 0、javax.sql.RowSet接口 javax.sql.rowset 包在 jdk1.4 的 javax.sql 包中有一个 RowSet 接口; jdk1.5 后引 入了 javax.sql.rowset 包中的五个子接口和 com.sun.rowset 包中对应的五个实现 类。jdk1.5 中 RowSet 的五个子接口分别是 JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet 和 FilteredRowSet。 RowSet 对象可分为两类:有连接的和无连接的。JdbcRowSet 是唯一一个有 连接的实现, 和传统的 ResultSet 一个样, 有连接的实现是基于 Jdbc 驱动的连接, 数据库的连接是贯穿整个对数据库的操作。而无连接的实现是基于 Reader 和 Writer 流的连接,在需要读取数据和写入数据的时候才建立连接,在整个操作过 程中都是断开连接的,后面四个接口都是无连接的实现(Disconnected RowSet) 。 1、JdbcRowSet JdbcRowSet 是唯一一个有连接的实现,和传统的 ResultSet 一样,基于 Jdbc 驱动的连接。 JdbcRowSet 继承了 javax.sql.RowSet 接口,RowSet 接口继承自 ResultSet 接口; 。 JdbcRowSet 也继承了 javax.sql.rowset.Joinable 可连接的接口。 JdbcRowSet 只是增加了几个方法,它对结果集的操作方法和 ResultSet 都是一样 的 , 他 基 本 上 和 ResultSet 有 类 似 的 功 能 , 它 的 结 果 集 默 认 是 ResultSet.TYPE_SCROLL_INSENSITIVE 和 ResultSet.CONCUR_UPDATABLE 的,即可上下滚动和可更新的。得到该对象 之后就可以使用相应的方法对数据进行遍历,更新,插入或者删除。 它同样也可以链接数据源进行相应操作。 注:虽然 JdbcRowSet 默认是可滚动和可更新的,但需要数据库驱动支持的,如 MySql 驱动 就不支持更新结果集,需要注意文档。 1)采用设置结果集的方式 String url = "jdbc:mysql://127.0.0.1:3306/zianed"; String login = "root"; String password = ""; Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn = DriverManager.getConnection(url, login, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from person"); JdbcRowSet rowSet = new JdbcRowSetImpl(rs); 2)采用设置 URLusernamepasswordcommand 进行执行 // JdbcRowSet Zianed Version 1.1 2
  • 3. Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); JdbcRowSet rowSet = new JdbcRowSetImpl(); rowSet.setUrl(url); rowSet.setUsername(username); rowSet.setPassword(password); rowSet.setCommand(empSql); rowSet.execute(); printRowSet(rowSet, "JdbcRowSet"); rowSet.close(); 3)绑定到数据源 容器是 tomcat 环境 JNDI 名字是 java:comp/env/jdbc/linary 的话 JdbcRowSet jrs=new JdbcRowSetImpl(); jrs.setDataSourceName("java:comp/env/jdbc/linary"); jrs.setCommand("select * from emp"); jrs.execute(); int numcols = jrs.getMetaData().getColumnCount(); System.out.println("JdbcRowSet Result:"); out.print("JdbcRowSet Result<br/>"); while (jrs.next()) { for (int i = 1; i <= numcols; i++) { out.print(jrs.getString(i) + "t"); } out.print("<br/>"); } jrs.close(); 2、CachedRowSet CachedRowSet 继承于 RowSet 接口,读入数据保存在缓存进行相应的操作。 JdbcRowSet 也继承了 javax.sql.rowset.Joinable 可连接的接口。 创建接口对象就是在构造方法里面传递一个 SyncProvider。CachedRowSet 对象可以使用任 何已向 SyncFactory 单件注册的 SyncProvider 实现。无连接的 RowSet 都是基于流读写的, 那么这里所说的 SyncProvider 就是提供了特定的 Reader 和 Writer。 jdk1.5 文档的 Sample Coder 有这样的实现: String provider= "com.fred.providers.HighAvailabilityProvider"; CachedRowSet crs=new CachedRowSetImpl(provider); 为 RowSet 设置了特定的 Reader 和 Writer。 Zianed Version 1.1 3
  • 4. 默认的 SyncProvider,CachedRowSet 对象的属性设置为 BaseRowSet 对象的默认属性,此 外,它将 RIOptimisticProvider 对象作为其同步提供者。RIOptimisticProvider(RI 中包含的 两个 SyncProvider 实现之一) 是在没有指定同步提供者时, SyncFactory 单件 (singleton) 将 提供的默认提供者。 。 CachedRowSet 提供分页功能。 crs.setPageSize(5); 设置每页显示的行数。在 Reader 读取数据的时候就只读取指定的行数的数据即可。 测试代码: // CachedRowSet CachedRowSet crs = new CachedRowSetImpl(); crs.setUrl(url); crs.setUsername(username); crs.setPassword(password); crs.setCommand(empSql); crs.setPageSize(5); crs.execute(); System.out.println("CachedRowSet Result:"); while (crs.nextPage()) { System.out.println("Next page:"); while (crs.next()) { System.out.println(crs.getString(1) + "t" + crs.getString(2)); } } crs.close(); 3、WebRowSet WebRowSet 继承自 CachedRowSet. 封装了读写 XML 的方法, 可以把数据库的数据持久化到 XML 文件或者从 XML 文件读 取数据写入数据库中。 1) 属性 XML Schema 定义的公共标示符 public static String PUBLIC_XML_SCHEMA = "--//Sun Microsystems, Inc.//XSD Schema//EN"; 标准的 WebRowSet XML 模式定义位于以下 URI 中: public static String SCHEMA_SYSTEM_ID = "http://java.sun.com/xml/ns/jdbc/webrowset.xsd"; Zianed Version 1.1 4
  • 5. 2)写入到文件或流中:通过以下方法 public void writeXml(ResultSet rs, java.io.Writer writer) public void writeXml(ResultSet rs, java.io.OutputStream oStream) public void writeXml(java.io.Writer writer) public void writeXml(java.io.OutputStream oStream) 写入到 XML 文件的方法是 wrs.writeXML(new FileOutputStream("data.xml"));把内存中行集数 据写入到文件 data.xml 中。该文件记录了以下三类数据: properties:包括 setXXX()方法所有的属性,没有设置的就是默认属性 metadata: 包括数据库表的相关元数据, 对应 ResultSetMetaData 里的信息。 包括 column-count 和 column-definition data:结果集的全部数据。包括 currentRow 的数据 3)从文件或流中读入到 WebRowSet 中 public void readXml(java.io.Reader reader) public void readXml(java.io.InputStream iStream) 从 xml 文件读取数据装载到 WebRowSet 的方法是 readXML(…);只要是按照规范的格式写的 xml 都可以装载进来。 测试代码: // WebRowSet WebRowSet wrs = new WebRowSetImpl(); wrs.setUrl(url); wrs.setUsername(username); wrs.setPassword(password); wrs.setCommand(empSql); wrs.execute(); wrs.writeXml(new FileOutputStream("c:emp.xml")); wrs.beforeFirst(); printRowSet(wrs, "WebRowSet"); wrs.close(); // WebRowSet File WebRowSet wrs2 = new WebRowSetImpl(); wrs2.readXml(new FileInputStream("c:emp.xml")); printRowSet(wrs2, "WebRowSet File"); wrs2.close(); 4、JoinRowSet 在无连接的状态下直接对结果集进行 Join。 JoinRowSet 继承于 WebRowSet 接口 Zianed Version 1.1 5
  • 6. 默认的 Join 是 inner join 的,还支持 cross join,full join,left outer join 和 right outer join,使用 setJoinType()方法来进行设置,但是需要数据库的支持。 五种联合方式 判断是否支持的方法(返回 联合方式 对应的常数 布尔值) 内连接(INNER JOIN)JoinRowSet.INNER_JOIN supportsInnerJoin() 左外连接(LEFT JoinRowSet.LEFT_OUTER_JOIN supportsLeftOuterJoin() OUTER JOIN) 右外连接(RIGHT JoinRowSet.RIGHT_OUTER_JOINsupportsRightOuterJoin() OUTER JOIN) 全外连接(FULL JoinRowSet.FULL_JOIN supportsFullJoin() OUTER JOIN) 交叉连接(CROSS JoinRowSet.CROSS_JOIN supportsCrossJoin() JOIN) 设置匹配列的另外的方法: jdbcRS.setMatchColumn(“ID”); joinRS.addRowSet(jdbcRS); 测试代码: // JoinRowSet CachedRowSet crs1 = new CachedRowSetImpl(); crs1.setUrl(url); crs1.setUsername(username); crs1.setPassword(password); crs1.setCommand(empSql); crs1.execute(); CachedRowSet crs2 = new CachedRowSetImpl(); crs2.setUrl(url); crs2.setUsername(username); crs2.setPassword(password); crs2.setCommand(deptSql); crs2.execute(); JoinRowSet jrs = new JoinRowSetImpl(); jrs.setJoinType(JoinRowSet.INNER_JOIN); jrs.addRowSet(crs1, "deptno"); jrs.addRowSet(crs2, "deptno"); printRowSet(jrs, "JoinRowSet"); crs1.close(); crs2.close(); jrs.close(); Zianed Version 1.1 6
  • 7. 5、FilteredRowSet 采用实现 Predicate 来实现在无连接的情况下的 RowSet 的过滤,仅显示某些满足条件的数 据。 FilteredRowSet 继承于 WebRowSet 接口 增加了两个方法: public void setFilter(Predicate p) public Predicate getFilter() 设置和取得过滤条件。 Javax.sql.rowset.Predicate 接口的三个未实现方法 public boolean evaluate(RowSet rs) public boolean evaluate(Object value, int column) public boolean evaluate(Object value, String columnName) evaluate(RowSet rs)方法: 此方法通常称为 FilteredRowSet 对象内部方法(非公共),它控制 RowSet 对象的指针 从一行移动到下一行。此外,如果此内部方法将指针移动到一个已删除的行上,则其将继续 移动指针,直到找到一个有效行为止。 evaluate(Object value, int column)方法和 public boolean evaluate(Object value, String columnName)方法判断插入时,插入的数据是否在有效的 RowSet 范围之 内。 测试代码: // FilteredRowSet FilteredRowSet frsRowSet = new FilteredRowSetImpl(); frsRowSet.setUrl(url); frsRowSet.setUsername(username); frsRowSet.setPassword(password); frsRowSet.setCommand(empSql); frsRowSet.execute(); frsRowSet.beforeFirst(); frsRowSet.setFilter(new Filter()); System.out.println("FilteredRowSet Result:"); int index = 1; while (frsRowSet.next()) { System.out.println(frsRowSet.getString(1) + "t" + frsRowSet.getString(2) + "t" + frsRowSet.getString(4)); index++; } Zianed Version 1.1 7
  • 8. System.out.println("FilteredRowSet Result " + index + " rows."); frsRowSet.close(); Filter 类如下进行数据过滤操作: class Filter implements Predicate { public Filter() { } public boolean evaluate(RowSet rs) { // 此判断是必须的,否则在循环中,有时间到最后一个的时间会报错 // if (rs == null) { return false; } FilteredRowSet frs = (FilteredRowSet) rs; boolean evaluation = false; try { int columnValue = frs.getInt(4); if (columnValue >= 2000) { evaluation = true; } return evaluation; } catch (SQLException e) { //此处抛出异常是正常行为 //不必进行处理,直接返回flase即可 e.printStackTrace(); return false; } } @Override public boolean evaluate(Object value, int column) throws SQLException { return false; } @Override public boolean evaluate(Object value, String columnName) throws SQLException { return false; } Zianed Version 1.1 8
  • 9. } 6、数据更新以及事务 insertRow()、deleteRow()、updateRow()只是在内存中更新了该行,同步到数据库需 要调用方法 acceptChanges() 或 acceptChanges(Connection)。如果 CachedRowSet 中保存着原数据库连接信息,则可以调用 acceptChanges();否则,则应该传入可用的 数据库连接或重新设置数据库连接参数。 增加 cachedRS.last(); cachedRS.moveToInsertRow();//转到要增加的那一行 cachedRS.updateInt(1, 3); cachedRS.updateString(2, "Bob"); //$NON-NLS-1$ cachedRS.updateString(3, "A new user"); //$NON-NLS-1$ cachedRS.insertRow();//只是在内存中处理 cachedRS.moveToCurrentRow(); cachedRS.acceptChanges();//在数据库中更改 更新 cachedRS.next();//找到要更新的数据 cachedRS.updateString(2, "Terry");//更新数据 cachedRS.updateRow();//只是在内存中处理 conn.setAutoCommit(false); try { cachedRS.acceptChanges(conn);//在数据库中更改 cachedRS.commit(); } catch (SyncProviderException e) { // expected cachedRS.rollback(); } 删除 cachedRS.absolute(2);//删除第二行数据 cachedRS.deleteRow();//只是在内存中处理 cachedRS.acceptChanges();//在数据库中更改 处理事务,在不成功时回滚数据。 cachedRS.updateRow(); conn.setAutoCommit(false); try { cachedRS.acceptChanges(conn); cachedRS.commit(); } catch (SyncProviderException e) { Zianed Version 1.1 9
  • 10. // expected cachedRS.rollback(); } conn.setAutoCommit(true); 7、事件注册监听 一个监听器需要实现 RowSetListener 接口。RowSetListener 支持三种事件监听:cursor moved、row changed 和 rowSet changed。 Javax.sql.RowSetListener public interface RowSetListener extends java.util.EventListener 给 RowSet 注册事件:RowSet.addRowSetListener 以通过相应的处理来监控对数据的操作。 监控三种事件 void rowSetChanged(RowSetEvent event);//监控rowSet的改变 void rowChanged(RowSetEvent event);//监控row的改变 void cursorMoved(RowSetEvent event);//监控游标的移动 CachedRowSet 中会触发监听器的方法 cursor moved row changed rowSet changed absolute() √ relative() √ next() √ previous() √ first() √ last() √ beforeFirst() √ afterLast() √ updateRow() √ deleteRow() √ insertRow() √ undoDelete() √ undoUpdate() √ undoInsert() √ populate() √ acceptChanges() √ acceptChanges(Connection) √ execute() √ execute(Connection) √ nextPage() √ previousPage() √ Zianed Version 1.1 10
  • 11. restoreOriginal() √ release() √ 8、tomcat自带的连接池,使用dbcp配置 Tomcat6 本身集成了 dbcp 连接池${CATALINA_HOME}libtomcat-dbcp.jar, 通过该包可以构造 dbcp 连接池。如下所示: 测试代码: public static DataSource initDataSource(String url, String username, String password) { BasicDataSource bds = new BasicDataSource(); bds.setUrl(url); bds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); bds.setUsername(username); bds.setPassword(password); bds.setMaxActive(5); return bds; } public static void closeDataSource(DataSource ds) throws SQLException { BasicDataSource bds = (BasicDataSource) ds; bds.close(); } /** * @param args * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { String url = "jdbc:oracle:thin:@testdb:1521:orcl"; String username = "scott"; String password = "tiger"; String empSql = "select empno,ename,mgr,sal,deptno from emp"; String deptSql = "select deptno,dname,loc from dept"; Zianed Version 1.1 11
  • 12. // 创建BasicDataSource DataSource dataSource = initDataSource(url, username, password); Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); // 创建JDBC对象 Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = dataSource.getConnection(); st = conn.createStatement(); rs = st.executeQuery(empSql); System.out.println("ResultSet Results:"); int numcols = rs.getMetaData().getColumnCount(); while (rs.next()) { for (int i = 1; i <= numcols; i++) { System.out.print(rs.getString(i) + "t"); } System.out.println(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } Zianed Version 1.1 12
  • 13. if (conn != null) { conn.close(); } if (dataSource != null) { closeDataSource(dataSource); } } catch (SQLException e) { e.printStackTrace(); } } } References Rowset http://www.ibm.com/developerworks/cn/java/j-lo-java6rowset/ http://hi.baidu.com/li_zhongnan/blog/item/52f43b9460aaa818d31b705f.html http://blog.csdn.net/zglluck/archive/2008/10/25/3144793.aspx Dbcp http://commons.apache.org/dbcp/ Apache-SVN http://svn.apache.org/viewvc/ Zianed Version 1.1 13