如何使用Java中的RowSet

如何使用Java中的RowSet,第1张

ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES")CachedRowSet crs = new CachedRowSetImpl()//也可以是WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl,因为他们均继承自CachedRowSetImpl crs.populate(rs)运行populate()方法后,ResultSet对象rs中的数据就被填充到crs对象中了。 (3)用XML填充 如果您打算将XML作为数据交换格式在客户端和你的服务器之间传输数据并且向实现数据离线编辑、或者向使用XML格式的数据的话,可以使用WebRowSet接口来用XML填充数据。 WebRowSet wrs = new WebRowSetImpl()wrs.readXml(new FileReader(new File("D:\\employees.xml")))运行readXml()方法后,employees.xml文件的数据就被填充到wrs对象中了。employees.xml 文件的格式参见附录。 (4)用其他方法填充 如果形用其他方式填充,比如csv、excel、text、http等格式或方法填充数据,那么就需要自己编写代码实现RowSet。 4、 *** 作RowSet中的数据及元数据 除了ResultSet提供的 *** 作数据和元数据方法外,RowSet接口没有提供太多额外的方法。 1)更新数据 rs.absolute(5)rs.updateInt(1, 10)rs.updateInt(2, 1000)rs.updateString(3, "John")rs.updateRow()(2)插入数据 rs.moveToInsertRow()rs.updateInt(1, 10)rs.updateInt(2, 1000)rs.updateString(3, "John")rs.insertRow()(3)删除数据 rs.absolute(5)rs.deleteRow()(4)设置属性 rs.setCommand("select id, salary, name from employees where id = ?")rs.setInt(1, 1)rs.execute()(5)元数据 RowSetMetaData rsmd = (RowSetMetaData)rs.getMetaData()int count = rsmd.getColumnCount()int type = rsmd.getColumnType(2)5、事务与更新底层数据源 RowSet本身只代表具体数据,事务以及底层数据源的更新是与底层数据源密切相关的概念。对于JDBC数据源,相应的标准接口JdbcRowSet通过与数据库相关的方法来来实现,如commit(),rollback()等。对于标准接口的中非连接rowset,如CachedRowSet,则在对RowSet中的数据改动后,通过运行acceptChanges()方法,在内部调用 RowSet 对象的 writer 将这些更改写入数据源,从而将 CachedRowSet 对象中的更改传播回底层数据源。 6、可序列化非连接RowSet 使用CachedRowSet 对象的主要原因之一是要在应用程序的不同组件之间传递数据。因为 CachedRowSet 对象是可序列化的,所以可使用它(举例来说)将运行于服务器环境的企业 JavaBeans 组件执行查询的结果通过网络发送到运行于 web 浏览器的客户端。 由于CachedRowSet 对象是非连接的,所以和具有相同数据的 ResultSet 对象相比更为简洁。

一、准备工作

源数据库ORACLE 目标数据库MongoDB,在源数据库添加删除、更新触发器

二、 *** 作步骤

添加表输入组件,连接ORACLE触发器记录表

添加JAVA代码组件,进行步骤跳转,根据输入的数据判断是删除或者更新,如果是删除,则跳转至MongoDB Delete步骤中,如果是更新的话,跳转至字段选择步骤中。JAVA代码中的详细信息如下:

import java.util.List

import org.pentaho.di.core.exception.KettleException

import org.pentaho.di.core.row.RowDataUtil

import org.pentaho.di.core.row.RowMeta

import org.pentaho.di.core.row.RowMetaInterface

import org.pentaho.di.core.row.ValueMeta

import org.pentaho.di.trans.Trans

import org.pentaho.di.trans.TransMeta

private Object[] previousRow//上一行

private RowSet t1 = null//业务表步骤

private RowSet t2 = null//删除步骤

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException

{

Object[] r = getRow()//获取输入行

if ( first ) {

if ( getInputRowMeta() == null ) {

setOutputDone()//设置输出完成

return false

}

今天使用kettle从mysql导数到oracle,发现只导了7行后,数据传输就终止了,查看日志信息,报错如下:

image

报:Couldn't get row from result set问题。

发现从这行开始这个时间字段除了正常的时间数据以外还有NULL值,难道这类的值引起的错误,在查询了相关资料后,才知道jdbc(默认行为)认为null或'0000-00-00'这样的日期时间值是无效的。如果想避开这个问题,需要编辑jdbc的连接属性,添加如下属性值:

zeroDateTimeBehavior=convertToNull

image

设置之后导数成功进行。

image

所以,设计生产系统中的相关表时,默认值最好不要使用'0000-00-00'或null这样的值。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7893946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存