prepareCall和prepareStatement有什么区别?
通常来说createStatement *** 用于简单的SQL语句(不带参数)、prepareStatement *** 用于带一个或多个IN参数的SQL语句或经常被执行的简单SQL语句,而prepareCall *** 用于调用已储存过程。
选项中,用于将参数化的 SQL 语句发送到数据库的 *** 是( ) A: prepareCall(Stringsql)
选项中,用于将参数化的 SQL 语句发送到数据库的 *** 是( ) A: prepareCall(Stringsql)
: prepareStatement(Stringsql)
: registerDriver(Driverdriver)
: createStatement()
填空题
分享相关内容的知识扩展阅读:
JAVA调用存储过程,Oracle自定义类型作参数怎么写法
1. 存储过程以及类型定义如下:--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);
--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procedure(ids IN idArray, exist OUT NUMBER);
END Lib_Package;
--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS
PROCEDURE Book_Check_Procedure( ids IN idArray, exist OUT NUMBER) AS v_Index BINARY_INTEGER; BEGIN v_Index:= ids.FIRST; LOOP SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent' AND book_id=ids(v_Index); EXIT WHEN v_Index=ids.LAST OR exist>0; v_Index:= ids.NEXT(v_Index); END LOOP;END Book_Check_Procedure;
END Lib_Package;
2.在Java中调用上面的存储过程
(1) 在Oracle中定义数组类型idArray (2) 在java构造数组并转换成Oracle中定义的数组类型,调用存储过程
/** * 当要删除图书时,检查是否仍然有图书复本处于借出状态 */ public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false; Connection conn = null; OracleCallableStatement cstmt = null; ArrayDescriptor desc = null; ARRAY bookIdArray = null; int count = 0; String sql = "{call LIB_PACKAGE.Book_Check_Procedure(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance(); conn = dbManager.getConnection(Constants.DATABASE);
try { cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定义oracle中的数组类型 desc = ArrayDescriptor.createDescriptor("IDARRAY", conn); bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.execute(); count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); } catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus-->SQLException: " + e.getMessage()); DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); throw new DataAccessException( "When check the books, there is a SQLException: " + e.getMessage(), e.getCause()); }
if (count > 0) {
flag = true; }
return flag; }
java dependency
java dependency是什么,让我们一起了解一下:dependency是通过JAVA代码对pom.xml文件进行增加与删除操作的一种依赖,当项目A依赖于B,而B又依赖于C的时候,自然的A会依赖于C,这样Maven在建立项目A的时候,会自动加载对C的依赖。
如何通过java代码对pom.xml文件进行操作?
首先需要引入jar包:
org.apache.maven maven-model 3.6.0
对xml文件进行增加操作:代码中的key为:maven-model。
Value为:
org.apache.maven maven-model 3.6.0
而在Maven中,任何依赖(jar包,tomcat等),或项目(自己打包的jar,war等)输出都可成为构件。每个构件都有自己的唯一标识(唯一坐标),由groupId,artifactId,和version等信息构成,由此,Maven就可以对构件进行版本控制,管理。
任何可以被Maven的坐标系统唯一标识的对象都是一个Maven构件,但是,只包含其他POM文件(该文件本身不产生构件,打包方式为pom)使用定义的POM文件也是一个Maven构件。
实战操作: com.oracle ojdbc6 11g import java.sql.*; public class Test { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; ResultSet res = null; try { //Class.forName("oracle.jdbc.driver.OracleDriver"); //String url="jdbc:oracle:thin:@ip:orcl"; Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8"; String user = ""; String pwd = ""; conn = DriverManager.getConnection(url, user, pwd); //query String sql = "select * from student where age = ?"; pstmt = conn.prepareCall(sql); pstmt.setInt(1, 18); res = pstmt.executeQuery(); //getColumnLabel ResultSetMetaData r *** d = res.getMetaData(); for (int i = 0, n = r *** d.getColumnCount(); i
调用oracle存储过程使用ResultSet的last *** 报错:出现对只转发结果集的无效操作: last
调用oracle存储过程返回cursor用ResultSet接收,使用ResultSet的last *** 报错:
出现对只转发结果集的无效操作: last
部分代码:
CallableStatement call = con.prepareCall("{call report_success_rate.showSuccessRate(?, ?, ?)}");
call.setString(1, year);
call.setString(2, areaID);
call.registerOutParameter(3, OracleTypes.CURSOR);
call.execute();
ResultSet set = (ResultSet)call.getObject(3);
set.last();
System.out.println(set.getRow());
在创建Statement的时候需要指定参数允许指针滚动,参考如下:
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ON *** );
各个参数参考如下:
ResultSet.TYPE_FORWARD_ON *** (略)
ResultSet.TYPE_SCROLL_INSENSITIVE 双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。
ResultSet.TYPE_SCROLL_SENSITIVE 双向滚动,并及时跟踪数据库里的更新,以便更改ResultSet中的数据。
ResultSet.CONCUR_READ_ON *** 只读取ResultSet
ResultSet.CONCUR_UPDATABLE 用ResultSet更新数据库