你的意思是向程序传入SQL语句然后根据传入的SQL语句进行查询
如果这样,我建议是这样的,写一个单饿独的类来进行数据库CRUD
例如:
package comassetscommon;
import javasqlConnection;
import javasqlDriverManager;
import javasqlPreparedStatement;
import javasqlResultSet;
import javasqlSQLException;
import javasqlStatement;
public class DBUtil {
private static final String user = "assets";
private static final String password = "assets";
private static final String url = "jdbc:oracle:thin:@localhost:1521:assetsdb";
static {
try {
ClassforName("oraclejdbcdriverOracleDriver")newInstance();
} catch (InstantiationException e) {
eprintStackTrace();
} catch (IllegalAccessException e) {
eprintStackTrace();
} catch (ClassNotFoundException e) {
eprintStackTrace();
}
}
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManagergetConnection(url, user, password);
} catch (SQLException e) {
eprintStackTrace();
}
return conn;
}
// 执行数据库的数据更新
public static int executeUpdata(Connection conn, String sql,
Object parame) {
int rst = -1;
PreparedStatement pstmt = null;
try {
// 设置为手动提交更新
connsetAutoCommit(false);
pstmt = connprepareStatement(sql);
// 循环设置参数
for (int i = 0; i < paramelength; i++) {
pstmtsetObject(i + 1, parame[i]);
}
rst = pstmtexecuteUpdate();
conncommit();
} catch (SQLException e) {
eprintStackTrace();
try {
// 异常时,数据回滚
connrollback();
} catch (SQLException e1) {
e1printStackTrace();
}
}
return rst;
}
// 执行查询
public static ResultSet executeQuery(Connection conn, String sql,
Object parame) {
ResultSet rs = null;
try {
PreparedStatement pstmt = connprepareStatement(sql,
ResultSetTYPE_SCROLL_INSENSITIVE,
ResultSetCONCUR_READ_ONLY);
for (int i = 0; i < paramelength; i++) {
pstmtsetObject(i + 1, parame[i]);
}
rs = pstmtexecuteQuery();
} catch (SQLException e) {
eprintStackTrace();
}
return rs;
}
// 关闭
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null)
rsclose();
rs = null;
} catch (SQLException e) {
eprintStackTrace();
}
try {
if (stmt != null)
stmtclose();
stmt = null;
} catch (SQLException e) {
eprintStackTrace();
}
try {
if (conn != null)
connclose();
conn = null;
} catch (SQLException e) {
eprintStackTrace();
}
}
public static int getCount(Connection conn, String sql, Object params) {
ResultSet rs = null;
try {
PreparedStatement pstmt = connprepareStatement(sql);
// 循环设置参数
for (int i = 0; i < paramslength; i++) {
pstmtsetObject(i + 1, params[i]);
}
rs = pstmtexecuteQuery();
if (rsnext()) {// 如果有结果返回记录条数
return rsgetInt(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
return -1;
}
}
在oracle新建一个job 这个job可以设定时间 自动运行的!~
创建
variable job_feeid_create NUMBER;
begin
sysdbms_jobsubmit(:job_feeid_create,'wlk_check_fee;',sysdate,'TRUNC(SYSDATE+1)');
commit;
end;
在命令控制台中这样就可以建产一个作业了。sysdate表示当前作业将来执行的时间,sysdate+1表示调用频率。
描述 INTERVAL参数值
每天午夜12点 'TRUNC(SYSDATE + 1)'
每天早上8点30分 'TRUNC(SYSDATE + 1) + (860+30)/(2460)'
每星期二中午12点 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12点 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6点10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
运行
begin
dbms_jobrun(:job_feeid_create);
end;
查询作业记录
select from user_jobs
具体讲解:
1.确保Oracle的工作模式允许启动任务队列管理器
Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以 DBA的身份去执行如下命令:
svrmgrl>; alter system enable restricted session;
或sql>; alter system disenable restricted session;
利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。
2.确保Oracle的系统已经配置了任务队列管理器的启动参数
SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是 initmyora8ora,在文件中对SNP启动参数的描述部分如下:
job_queue_process=n
job_queue_interval=N
第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。
第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状 态,睡眠一段时间后,由系统的总控负责将其唤醒。
如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的 话,N的配置也要相应地小一点。
3.将任务加入到数据库的任务队列中
用Oracle的dbms_job包中的存储过程,将任务加入到任务队列中:
dbms_jobsubmit( job out binary_integer,
what in archar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
其中:
●job:输出变量,是此任务在任务队列中的编号;
●what:执行的任务的名称及其输入参数;
●next_date:任务执行的时间;
●interval:任务执行的时间间隔。
下面详细讨论一下dbms_jobsubmit中的参数interval。严格地讲,interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null 时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。
将任务加入到任务队列之前,要确定执行任务的数据库用户,若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限;若没有,需要以 DBA的身份将权利授予scott用户:
svrmgrl>; grant execute on dbms_job to scott;
4.将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段
例如,我们已经建立了一个存储过程,其名称为my_job,在sql/plus中以scott用户身份登录,执行如下命令:
sql>; variable n number;
sql>; begin
dbms_jobsubmit(:n‘my_job;’,sysdate,
‘sysdate+1/360’);
commit;
end;
/
系统提示执行成功。
Sql>; print :n;
系统打印此任务的编号,例如结果为300。
如上,我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况:
sql>; select job,next_date,next_sec,failures,broken from user_jobs;
执行结果如下:
job next_date next_sec failures broken
300 2000/10/10 11:45:15 0 N
这表示任务号为300的任务,下一次将在2000/10/10 11:45:15执行,此任务的执行失败记录为0次。注意:当执行job出现错误时,Oracle将其记录在日志里,失败次数每次自动加1。当执行失败次数达到16时,Oracle就将该job标志为broken。此后,Oracle不再继续执行它,直到用户调用过程dbms_jobbroken,重新设置为not broken,或强制调用dbms_jobrun来重新执行它。
除了以上我们讨论的submit存储过程之外,Oracle还提供了其他许多存储过程来 *** 作任务。例如:dbms_jobchange 、 dbms_jobwhat、dbms_jobinterval可以用来修改提交的任务。要想删除该任务,只需运行dbms_jobremove(n)即可,其中n为任务号。
例如 从第 万条开始取出 条记录 代码: Query q = session createQuery( from Cat as c ); q setFirstResult( ); q setMaxResults( ); List l = q list();那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询定义在net sf hibernate loader Loader这个类里面 仔细阅读该类代码 就可以把问题彻底搞清楚 Hibernate 的Loader源代码第 行以下代码: if (useLimit) sql = dialect getLimitString(sql); PreparedStatement st = session getBatcher() prepareQueryStatement(sql scrollable);如果相应的数据库定义了限定查询记录的sql语句 那么直接使用特定数据库的sql语句 然后来看net sf hibernate dialect MySQLDialect: 代码: public boolean supportsLimit() {return true; } public String getLimitString(String sql) {StringBuffer pagingSelect = new StringBuffer( );pagingSelect append(sql);pagingSelect append( limit );return pagingSelect toString(); }这是MySQL的专用分页语句 再来看net sf hibernate dialect Oracle Dialect: 代码: public boolean supportsLimit() {return true; } public String getLimitString(String sql) {StringBuffer pagingSelect = new StringBuffer( );pagingSelect append( select from ( select row_ rownum rownum_from ( );pagingSelect append(sql);pagingSelect append( ) row_ where rownum <= ) where rownum_ > );return pagingSelect toString(); }Oracle采用嵌套 层的查询语句结合rownum来实现分页 这在Oracle上是最快的方式 如果只是一层或者两层的查询语句的rownum不能支持order by 除此之外 Interbase PostgreSQL HSQL也支持分页的sql语句 在相应的Dialect里面 大家自行参考 如果数据库不支持分页的SQL语句 那么根据在配置文件里面#hibernate jdbc use_scrollable_resultset true默认是true 如果你不指定为false 那么Hibernate会使用JDBC 的scrollableresult来实现分页 看Loader第 行以下代码: if ( session getFactory() useScrollableResultSets() ) {// we can go straight to the first required rowrs absolute(firstRow); } else {// we need to step through the rows one row at a time (slow)for ( int m= ; m<firstRow; m++ ) rs next(); }如果支持scrollable result 使用ResultSet的absolute方法直接移到查询起点 如果不支持的话 使用循环语句 rs next一点点的移过去 可见使用Hibernate 在进行查询分页的 *** 作上 是具有非常大的灵活性 Hibernate会首先尝试用特定数据库的分页sql 如果没用 再尝试Scrollable 如果不行 最后采用rset next()移动的办法 在查询分页代码中使用Hibernate的一大好处是 既兼顾了查询分页的性能 同时又保证了代码在不同的数据库之间的可移植性 lishixinzhi/Article/program/Java/ky/201311/28262
以上就是关于java如何从oracle中读取的全部结果集里面动态的读取字段全部的内容,包括:java如何从oracle中读取的全部结果集里面动态的读取字段、求 Oracle 大神指教,更具时间自动更新状态、如何用 Hibernate 实现分页查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)