prepareCall和prepareStatement有什么区别?

bk2898 83 0

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更新数据库

抱歉,评论功能暂时关闭!