- 浏览: 114635 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
shenzhongji:
不错 对于我来说有很大的帮助谢谢了
绝对定位和相对定位 -
水果硬糖:
果然不报这个错误了
解决tomcat启动产生[SetPropertiesRule]警告问题 -
fjjiaboming:
还是不行.
解决tomcat启动产生[SetPropertiesRule]警告问题 -
ppm10103:
ClassLoader
遗留问题 -
pop1030123:
解析以下面这个字符串命名的目录名是不是就会出错了
~!@#$% ...
file协议
http://www.blogjava.net/19851985lili/articles/203809.html
简介:JDBC 中的语句处理
在 JDBC 应用程序中,JDBC 语句对象用于将 SQL 语句发送到数据库服务器。一个语句对象与一个连接相关联,应用程序与数据库服务器之间的通信由语句对象来处理。
JDBC 中有三种类型的语句对象:
1. 常规语句(General statement)
2. 预置语句(Prepared statement)
3. 可调用语句(Callable statement)
语句对象与一个连接相关联,所以要创建一个语句对象,首先应该建立一个数据库连接。
创建连接
清单 1 中的代码示例演示了如何创建连接:
清单 1.装载 Informix 驱动程序并创建一个连接的代码示例
Connection con = null;
try {
Class.forName("com.informix.jdbc.IfxDriver");
String url = "jdbc:informix-sqli://hostname:port_number/dbname:
informixserver=servername; userid=userid;password=pwd;";
con = DriverManager.getConnection(url);
}
现在逐个考察这三种类型的语句对象。
常规语句
可以使用连接的 createStatement 方法创建这种语句。这种语句专用于不需要传递任何值作为参数的 SQL 语句。
清单 2. 演示创建语句的示例代码
Statement stmt = con.createStatement();
cmd = "create database testDB;";
rc = stmt.executeUpdate(cmd);
stmt.close();
预置语句
预置语句是 statement 类的一个子类。预置语句与 statement 类的主要区别在于,前者可以只编译和优化一次,然后通过设置不同的参数值多次使用。所以,如果想多次执行一条语句,那么预置语句是更好的选择。由于已经预先编译好,所以减少了执行时间。因此,预置语句的优点是,它不仅包含一条 SQL 语句,而且还是一条预先编译好的 SQL 语句。另一个区别是,SQL 语句在创建后就被提供给预置语句。
清单 3. 解释预置语句的示例代码
PreparedStatement pstmt = con.prepareStatement("UPDATE tab1 "+
"set col1 = ? where key = 1");
pstmt.setShort(1, (short)2);
int rowcount = pstmt.executeUpdate();
在此,同一个预置语句可用于不同的 col1 值。参数一旦设定,它的值将保持不变,直到被重新设置或者 clearParameters 被调用。这项特性使得预置语句可以用于批量处理 INSERT/UPDATE。
批量更新
通过设置多个值,批量更新特性提高了需要多次执行的语句的性能。这样可以将多个更新操作提交到一个数据源并进行一次性处理。语句对象也可以使用批量更新。但语句对象提交不同的 SQL 语句进行批处理,而预置语句提交的是一组参数。
清单 4 显示了如何使用预置语句进行批量插入:
清单 4. 演示批量更新的示例代码
PreparedStatement pst = conn.prepareStatement("insert into tab1 values (?)");
for loop....
{
pst.setInt (1, i);
pst.addBatch();
}
pst.executeBatch();
addBatch 方法将语句添加到一个缓存中,然后使用 executeBatch() 方法转储到数据库中。所以它节省了语句的编译/优化,因为它只编译一次(对于预置语句),而且还节省了与服务器之间的往返,因为它一次性发送了批量插入。
可调用语句
这是调用 SQL 语句的第三种方法,它提供了一种从 Java™ 程序中调用服务器上的存储过程的方式。可调用语句也需要先作准备,然后使用 set 方法设置它们的参数。可以通过以下两种方式设置参数值:
1. 顺序位置
2. 命名参数
顺序位置是传统的参数设置方式,它根据参数在 CallableStatements 中的位置来设置参数。但是,命名参数则提供了更大的灵活性,它允许根据名称而不是顺序位置来设置参数。在调用例程时,必须以名称或顺序格式指定 CallableStatement 的参数。例如,如果对一个参数使用了参数名称,那么对所有其他参数也必须使用参数名称。
在调用具有许多参数,而且其中一些参数有默认值的存储过程时,命名参数特别有用。如果过程是惟一的,那么可以省略有默认值的参数,并且可以按任意顺序输入参数。命名参数使应用程序更加健壮,所以,即使存储过程中参数的顺序发生了改变,也不必修改应用程序。
JDBC 驱动程序提供了 DatabaseMetaData.supportsNamedParameters() 方法来确认驱动程序和 RDMS 是否支持 CallableStatement 中的命名参数。如果支持命名参数,则系统返回 true。例如:
清单 5. supportsNamedParameters() 的使用
Connection myConn = . . . // connection to the RDBMS for Database
DatabaseMetaData dbmd = myConn.getMetaData();
if (dbmd.supportsNamedParameters() == true)
{
System.out.println("NAMED PARAMETERS FOR CALLABLE"
+ "STATEMENTS IS SUPPORTED");
}
获取存储过程的参数名称
可以使用 DatabaseMetaData 的 getprocedureColumns 获取存储过程的参数名称,该方法的定义如清单 6 所示:
清单 6. getProcedureColumn() 方法的使用
Connection myConn = . . . // connection to the RDBMS for Database
. .
DatabaseMetaData dbmd = myConn.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(
"myDB", schemaPattern, procedureNamePattern, columnNamePattern);
rs.next() {
String parameterName = rs.getString(4);
- - - or - - -
String parameterName = rs.getString("COLUMN_NAME");
- - -
System.out.println("Column Name: " + parameterName);
与 getProcedureColumns() 方法的参数相匹配的所有列的名称都将被显示。
清单 7 显示了 CallableStatements 中的命名参数的使用。
创建存储过程
清单 7. 可调用 OUT 参数的使用
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float,
minprice float,
out prod_id float);
. . .
let prod_id="value for prod_id";
end procedure;
清单 8 中的 Java 代码首先创建一个有 5 个参数的 CallableStatement,这 5 个参数与存储过程中的参数相对应。JDBC 调用的括号中的问号字符 (?) 对参数进行引用。设置或注册所有的参数。使用格式 cstmt.setString("arg", name); 命名参数,其中 arg 是相应的存储过程中的参数名称。这里不需要按照存储过程中的参数顺序来命名参数。
清单 8. 可调用命名参数的使用
String sqlCall = "{call CreateProductDef(?,?,?,?,?)}";
CallableStatement cstmt = conn.prepareCall(sqlCall);
cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.
cstmt.setFloat("listprice", listprice); // Set Product ListPrice.
cstmt.setFloat("minprice", minprice); // Set Product MinPrice.
// Register out parameter which should return the product is created.
cstmt.registerOutParameter("prod_id", Types.FLOAT);
// Execute the call.
cstmt.execute();
// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");
如果 CallableStatement 中的参数数量少于存储过程中的参数数量,那么剩下的参数必须有默认值。不需要为有默认值的参数设置值,因为服务器会自动使用默认值。例如,如果一个存储过程有 10 个参数,其中 4 个参数没有默认值,6 个参数有默认值,那么在 CallableStatement 中必须至少有 4 个问号。也可以使用 5 个、6 个或至多 10 个问号。在下面这个惟一的存储过程中,参数 listprice 和 minprice 有默认值:
清单 9. 创建包括具有默认值的参数的过程
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float default 100.00,
minprice float default 90.00,
out prod_id float);
. . .
let prod_id = value for prod_id;
end procedure;
清单 10 中的 Java 代码使用少于存储过程中参数数量的参数(存储过程中有 5 个参数,而代码中只使用 4 个参数)调用存储过程。由于 listprice 有一个默认值,因此可以在 CallableStatement 中省略它。
清单 10. 默认参数的使用
String sqlCall = "{call CreateProductDef(?,?,?,?)}";
// 4 params for 5 args
CallableStatement cstmt = conn.prepareCall(sqlCall);
cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.
cstmt.setFloat("minprice", minprice); // Set Product MinPrice.
// Register out parameter which should return the product id created.
cstmt.registerOutParameter("prod_id", Types.FLOAT);
// Execute the call.
cstmt.execute();
// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");
如果可调用语句包含 OUT 或 INOUT 参数,那么需要使用 CallableStatement 的 registerOutParameter 注册这些参数。清单 11 使用 out 参数 prod_id 创建一个具有 OUT 参数的存储过程。类似地,可以使用关键字 INOUT 创建 INOUT 参数。
清单 11. INOUT 和 OUT 参数的使用
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
inout listprice float default 100.00,
minprice float default 90.00,
out prod_id float);
清单 12 使用 CallableStatements registerOutparameter 方法注册 CallableStatement 的 out 参数。
清单 12. 使用 CallableStatement 注册 OUT 参数
cstmt.registerOutParameter("prod_id", Types.FLOAT);
清单 13 将使用命名参数特性的所有语句合并在一起:
清单 13. 演示命名参数功能的程序
package Callable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
public class out1 {
static Connection conn;
public static void main(String[] args) {
getConnect();
System.out.println("Connection Established");
createProc();
runthis();
System.out.println("\n=============Finished=============");
System.exit(0);
}
private static void getConnect() {
try
{
Class.forName("com.informix.jdbc.IfxDriver");
String url = "jdbc:informix-sqli://host name or ip :porn number/database
name:informixserver=dbservername;";
System.out.println("URL: "+url);
conn = DriverManager.getConnection(url);
}
catch( Exception e )
{
e.printStackTrace();
System.exit(1);
}
}
private static void createProc() {
String str=null;
Statement stmt = null;
try
{
stmt = conn.createStatement();
}
catch (SQLException e2)
{
e2.printStackTrace();
}
str="drop function c_out_proc";
try
{
stmt.executeUpdate (str);
}
catch (SQLException e1)
{ }
str = "create function c_out_proc ( i int, OUT d varchar(20) ) \n" +
"returning float; \n" +
"define f float; \n" +
"let d= \"Hello OUT\"; \n" +
"let f=i*2; \n" +
"return f; \n" +
"end function; \n";
try
{
stmt.executeUpdate (str);
System.out.println("Function created \n");
}
catch (SQLException e)
{
System.out.println("Error on creating function: " + e.toString());
System.exit(1);
}
}
private static void runthis()
{
CallableStatement cstmt = null;
String command = "{? = call c_out_proc(?, ?)} ";
try
{
cstmt = conn.prepareCall (command);
cstmt.setInt(1, 2);
cstmt.registerOutParameter(2, Types.VARCHAR);
ResultSet rs = cstmt.executeQuery();
if (rs == null)
{
System.out.println("rs is null *** this is BAD.");
System.exit(0);
}
else
{
rs.next();
System.out.println(rs.getFloat(1));
System.out.println(cstmt.getString(2));
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
简介:JDBC 中的语句处理
在 JDBC 应用程序中,JDBC 语句对象用于将 SQL 语句发送到数据库服务器。一个语句对象与一个连接相关联,应用程序与数据库服务器之间的通信由语句对象来处理。
JDBC 中有三种类型的语句对象:
1. 常规语句(General statement)
2. 预置语句(Prepared statement)
3. 可调用语句(Callable statement)
语句对象与一个连接相关联,所以要创建一个语句对象,首先应该建立一个数据库连接。
创建连接
清单 1 中的代码示例演示了如何创建连接:
清单 1.装载 Informix 驱动程序并创建一个连接的代码示例
Connection con = null;
try {
Class.forName("com.informix.jdbc.IfxDriver");
String url = "jdbc:informix-sqli://hostname:port_number/dbname:
informixserver=servername; userid=userid;password=pwd;";
con = DriverManager.getConnection(url);
}
现在逐个考察这三种类型的语句对象。
常规语句
可以使用连接的 createStatement 方法创建这种语句。这种语句专用于不需要传递任何值作为参数的 SQL 语句。
清单 2. 演示创建语句的示例代码
Statement stmt = con.createStatement();
cmd = "create database testDB;";
rc = stmt.executeUpdate(cmd);
stmt.close();
预置语句
预置语句是 statement 类的一个子类。预置语句与 statement 类的主要区别在于,前者可以只编译和优化一次,然后通过设置不同的参数值多次使用。所以,如果想多次执行一条语句,那么预置语句是更好的选择。由于已经预先编译好,所以减少了执行时间。因此,预置语句的优点是,它不仅包含一条 SQL 语句,而且还是一条预先编译好的 SQL 语句。另一个区别是,SQL 语句在创建后就被提供给预置语句。
清单 3. 解释预置语句的示例代码
PreparedStatement pstmt = con.prepareStatement("UPDATE tab1 "+
"set col1 = ? where key = 1");
pstmt.setShort(1, (short)2);
int rowcount = pstmt.executeUpdate();
在此,同一个预置语句可用于不同的 col1 值。参数一旦设定,它的值将保持不变,直到被重新设置或者 clearParameters 被调用。这项特性使得预置语句可以用于批量处理 INSERT/UPDATE。
批量更新
通过设置多个值,批量更新特性提高了需要多次执行的语句的性能。这样可以将多个更新操作提交到一个数据源并进行一次性处理。语句对象也可以使用批量更新。但语句对象提交不同的 SQL 语句进行批处理,而预置语句提交的是一组参数。
清单 4 显示了如何使用预置语句进行批量插入:
清单 4. 演示批量更新的示例代码
PreparedStatement pst = conn.prepareStatement("insert into tab1 values (?)");
for loop....
{
pst.setInt (1, i);
pst.addBatch();
}
pst.executeBatch();
addBatch 方法将语句添加到一个缓存中,然后使用 executeBatch() 方法转储到数据库中。所以它节省了语句的编译/优化,因为它只编译一次(对于预置语句),而且还节省了与服务器之间的往返,因为它一次性发送了批量插入。
可调用语句
这是调用 SQL 语句的第三种方法,它提供了一种从 Java™ 程序中调用服务器上的存储过程的方式。可调用语句也需要先作准备,然后使用 set 方法设置它们的参数。可以通过以下两种方式设置参数值:
1. 顺序位置
2. 命名参数
顺序位置是传统的参数设置方式,它根据参数在 CallableStatements 中的位置来设置参数。但是,命名参数则提供了更大的灵活性,它允许根据名称而不是顺序位置来设置参数。在调用例程时,必须以名称或顺序格式指定 CallableStatement 的参数。例如,如果对一个参数使用了参数名称,那么对所有其他参数也必须使用参数名称。
在调用具有许多参数,而且其中一些参数有默认值的存储过程时,命名参数特别有用。如果过程是惟一的,那么可以省略有默认值的参数,并且可以按任意顺序输入参数。命名参数使应用程序更加健壮,所以,即使存储过程中参数的顺序发生了改变,也不必修改应用程序。
JDBC 驱动程序提供了 DatabaseMetaData.supportsNamedParameters() 方法来确认驱动程序和 RDMS 是否支持 CallableStatement 中的命名参数。如果支持命名参数,则系统返回 true。例如:
清单 5. supportsNamedParameters() 的使用
Connection myConn = . . . // connection to the RDBMS for Database
DatabaseMetaData dbmd = myConn.getMetaData();
if (dbmd.supportsNamedParameters() == true)
{
System.out.println("NAMED PARAMETERS FOR CALLABLE"
+ "STATEMENTS IS SUPPORTED");
}
获取存储过程的参数名称
可以使用 DatabaseMetaData 的 getprocedureColumns 获取存储过程的参数名称,该方法的定义如清单 6 所示:
清单 6. getProcedureColumn() 方法的使用
Connection myConn = . . . // connection to the RDBMS for Database
. .
DatabaseMetaData dbmd = myConn.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(
"myDB", schemaPattern, procedureNamePattern, columnNamePattern);
rs.next() {
String parameterName = rs.getString(4);
- - - or - - -
String parameterName = rs.getString("COLUMN_NAME");
- - -
System.out.println("Column Name: " + parameterName);
与 getProcedureColumns() 方法的参数相匹配的所有列的名称都将被显示。
清单 7 显示了 CallableStatements 中的命名参数的使用。
创建存储过程
清单 7. 可调用 OUT 参数的使用
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float,
minprice float,
out prod_id float);
. . .
let prod_id="value for prod_id";
end procedure;
清单 8 中的 Java 代码首先创建一个有 5 个参数的 CallableStatement,这 5 个参数与存储过程中的参数相对应。JDBC 调用的括号中的问号字符 (?) 对参数进行引用。设置或注册所有的参数。使用格式 cstmt.setString("arg", name); 命名参数,其中 arg 是相应的存储过程中的参数名称。这里不需要按照存储过程中的参数顺序来命名参数。
清单 8. 可调用命名参数的使用
String sqlCall = "{call CreateProductDef(?,?,?,?,?)}";
CallableStatement cstmt = conn.prepareCall(sqlCall);
cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.
cstmt.setFloat("listprice", listprice); // Set Product ListPrice.
cstmt.setFloat("minprice", minprice); // Set Product MinPrice.
// Register out parameter which should return the product is created.
cstmt.registerOutParameter("prod_id", Types.FLOAT);
// Execute the call.
cstmt.execute();
// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");
如果 CallableStatement 中的参数数量少于存储过程中的参数数量,那么剩下的参数必须有默认值。不需要为有默认值的参数设置值,因为服务器会自动使用默认值。例如,如果一个存储过程有 10 个参数,其中 4 个参数没有默认值,6 个参数有默认值,那么在 CallableStatement 中必须至少有 4 个问号。也可以使用 5 个、6 个或至多 10 个问号。在下面这个惟一的存储过程中,参数 listprice 和 minprice 有默认值:
清单 9. 创建包括具有默认值的参数的过程
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float default 100.00,
minprice float default 90.00,
out prod_id float);
. . .
let prod_id = value for prod_id;
end procedure;
清单 10 中的 Java 代码使用少于存储过程中参数数量的参数(存储过程中有 5 个参数,而代码中只使用 4 个参数)调用存储过程。由于 listprice 有一个默认值,因此可以在 CallableStatement 中省略它。
清单 10. 默认参数的使用
String sqlCall = "{call CreateProductDef(?,?,?,?)}";
// 4 params for 5 args
CallableStatement cstmt = conn.prepareCall(sqlCall);
cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.
cstmt.setFloat("minprice", minprice); // Set Product MinPrice.
// Register out parameter which should return the product id created.
cstmt.registerOutParameter("prod_id", Types.FLOAT);
// Execute the call.
cstmt.execute();
// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");
如果可调用语句包含 OUT 或 INOUT 参数,那么需要使用 CallableStatement 的 registerOutParameter 注册这些参数。清单 11 使用 out 参数 prod_id 创建一个具有 OUT 参数的存储过程。类似地,可以使用关键字 INOUT 创建 INOUT 参数。
清单 11. INOUT 和 OUT 参数的使用
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
inout listprice float default 100.00,
minprice float default 90.00,
out prod_id float);
清单 12 使用 CallableStatements registerOutparameter 方法注册 CallableStatement 的 out 参数。
清单 12. 使用 CallableStatement 注册 OUT 参数
cstmt.registerOutParameter("prod_id", Types.FLOAT);
清单 13 将使用命名参数特性的所有语句合并在一起:
清单 13. 演示命名参数功能的程序
package Callable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
public class out1 {
static Connection conn;
public static void main(String[] args) {
getConnect();
System.out.println("Connection Established");
createProc();
runthis();
System.out.println("\n=============Finished=============");
System.exit(0);
}
private static void getConnect() {
try
{
Class.forName("com.informix.jdbc.IfxDriver");
String url = "jdbc:informix-sqli://host name or ip :porn number/database
name:informixserver=dbservername;";
System.out.println("URL: "+url);
conn = DriverManager.getConnection(url);
}
catch( Exception e )
{
e.printStackTrace();
System.exit(1);
}
}
private static void createProc() {
String str=null;
Statement stmt = null;
try
{
stmt = conn.createStatement();
}
catch (SQLException e2)
{
e2.printStackTrace();
}
str="drop function c_out_proc";
try
{
stmt.executeUpdate (str);
}
catch (SQLException e1)
{ }
str = "create function c_out_proc ( i int, OUT d varchar(20) ) \n" +
"returning float; \n" +
"define f float; \n" +
"let d= \"Hello OUT\"; \n" +
"let f=i*2; \n" +
"return f; \n" +
"end function; \n";
try
{
stmt.executeUpdate (str);
System.out.println("Function created \n");
}
catch (SQLException e)
{
System.out.println("Error on creating function: " + e.toString());
System.exit(1);
}
}
private static void runthis()
{
CallableStatement cstmt = null;
String command = "{? = call c_out_proc(?, ?)} ";
try
{
cstmt = conn.prepareCall (command);
cstmt.setInt(1, 2);
cstmt.registerOutParameter(2, Types.VARCHAR);
ResultSet rs = cstmt.executeQuery();
if (rs == null)
{
System.out.println("rs is null *** this is BAD.");
System.exit(0);
}
else
{
rs.next();
System.out.println(rs.getFloat(1));
System.out.println(cstmt.getString(2));
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
发表评论
-
ssl &ca
2011-05-30 23:39 793donot remember where to get th ... -
how to monitor tibco ems server
2011-05-22 13:09 948the tool was found in tibco com ... -
how to create a j2ee with maven
2011-05-20 00:09 7091.note that add ejb to ear as a ... -
best practice about building ear
2010-10-26 22:23 825http://www.oracle.com/technetwo ... -
inheritance mapping
2010-06-15 11:10 903the three strategies: table pe ... -
Spring petstore log4j initialize
2010-01-25 21:40 8971.用listener初始化log4j 2.servlet的日 ... -
log4j实现
2010-01-18 11:16 7591.通过抛出异常,然后分析异常串来获得调用日志接口的类 2.将 ... -
apache common logging design philosophy
2010-01-07 20:54 1125The Logging package is an ultra ... -
分层设计
2009-11-17 10:52 967对于一个业务系统而言,系统研发的目标是为特定业务提供支持,业务 ... -
effective enterprise java
2009-11-16 23:04 8861.内置监控(happybit.jsp) 2.内置管理 3.先 ... -
关注java VisualVM
2009-11-14 11:08 8471.jdk6中带了这个分析工具,有时间研究一下 2.关注con ... -
参数传递中的编码问题(get和post方式)
2009-02-13 16:48 5782转载自http://www.iteye.com/t ... -
获取图片来显示,如何优化
2009-02-13 11:42 9431.访问量大的话就搞了专门的图片服务器 少的话直接放在weba ... -
command pattern
2009-02-12 22:57 7581.命令模式将发出请求的对象和执行请求的对象解耦。 2.在被解 ... -
ORACLE存储过程使用数组参数
2009-02-03 13:26 5955http://blog.csdn.net/louie520/a ... -
spring aop实现原理
2009-01-22 14:08 976http://www.blogjava.net/DoubleJ ...
相关推荐
4. **设置输入参数**:如果存储过程有输入参数,需要使用`CallableStatement`的`setXXX()`方法(如`setInt()`, `setString()`等)设置这些参数值。参数通常以问号(?)作为占位符。 5. **调用存储过程**:使用`...
- `JdbcTemplate`适用于无命名参数的存储过程,而`NamedParameterJdbcTemplate`则适合有命名参数的情况,使代码更具可读性。 4. **存储过程的优点** - 性能优化:存储过程在数据库服务器上预编译,执行效率高。 ...
- 获取并处理输出参数和结果集。 4. **性能比较** 存储过程通常比单独的SQL语句执行更快,因为它们在数据库中预编译并缓存,避免了每次执行时的解析和编译过程。同时,由于减少了网络通信,它们可以提高整体性能...
4. **处理结果**:如果存储过程有返回值或输出参数,你需要使用`ResultSet`或`getXXX()`方法来获取它们。在上面的例子中,存储过程没有返回值,但如果有的话,你可以这样处理: ```java ResultSet rs = cs....
2. **有返回值的存储过程**:使用`OUT`参数或`RETURN`语句返回单个值,Java调用时同样通过CallableStatement,指定输出参数。 3. **返回列表**:使用`REF CURSOR`类型作为`OUT`参数,返回一个游标,Java中需遍历并...
例如,NamedParameterJdbcTemplate允许使用命名参数(如`:username`),而JdbcTemplate则支持问号(`?`)作为位置参数。 4. **Result Set Mapping**: Spring-JDBC可以自动将查询结果映射到Java对象,这通常通过...
- Hibernate调用Oracle存储过程需要配置JDBC驱动,并使用`CallableStatement`来执行存储过程。 4. Java调用Oracle存储过程: - 无返回值的存储过程:使用`CallableStatement`的`execute()`方法。 - 有返回值的非...
首先,存储过程是在数据库层面预先编译好的一组SQL语句,它可以接受输入参数,处理数据,并返回结果。使用存储过程的优点包括性能提升、代码复用和安全性增强。在Oracle这样的数据库系统中,我们可以创建一个名为`...
对于存储过程,我们通常使用CallableStatement,因为它允许我们调用数据库的存储过程和函数。 4. 使用CallableStatement的`{call}`方法设置SQL语句,格式通常为`{call procedure_name(?, ?...)}`,问号代表参数占位...
- **命名规则**:遵循Oracle的命名规范,使用大写字母,单词间用下划线分隔。 - **注释**:使用`--`进行单行注释,`/* */`进行多行注释。 - **块结构**:PL/SQL程序由声明部分、执行部分和异常处理部分组成,通常...
- **Update(更新)**:修改已有记录,使用PreparedStatement设置参数,执行update()方法。 - **Delete(删除)**:删除特定记录,通过执行delete语句,如Statement的executeUpdate()。 **5. 事务处理** JDBC支持...
通过以上知识点的学习,可以了解到如何在Oracle数据库中创建和使用存储过程,以及如何使用Java进行数据库连接、调用存储过程以及处理输出参数等高级功能。这对于进一步深入学习Oracle数据库与Java集成开发具有重要...
- **CallableStatement**:用于调用数据库存储过程,其方法命名与PreparedStatement类似,但多了`registerOutParameter()`和`getXXX()`方法用于处理存储过程的输出参数。 ### 5. 数据库连接池 在实际开发中,为...
此外,过程还可以使用各种控制结构(如IF-THEN-ELSE、FOR循环)、游标、异常处理等,使得数据库操作更具有灵活性。 5、在实际应用中,PL/SQL过程通常用于实现业务规则、事务管理、数据处理等任务。例如,可以创建一...
在实际项目中,了解如何在Java程序中创建和执行CallableStatement对象,设置输入和输出参数,以及正确处理结果集是至关重要的。同时,事务管理和错误处理也是Java与PL/SQL交互时需要考虑的方面,以确保数据的一致性...
JdbcTemplate适用于参数较少、不涉及复杂参数的情况,而NamedParameterJdbcTemplate则适用于处理命名参数,使得代码更易读。 1. 使用JdbcTemplate执行存储过程: ```java @Autowired private JdbcTemplate ...
2. 使用`CallableStatementCreator`:如果存储过程有复杂的参数或者返回值,可以自定义`CallableStatementCreator`来创建`CallableStatement`。 ```java session.doWork(new Work() { public void execute...
- **命名参数**:在 CallableStatement 和 PreparedStatement 中支持命名参数。 - **批处理更新**:通过 BatchUpdateExecutor 支持批处理更新操作,这有助于提高数据插入或更新的效率。 - **大结果集**:增强了 ...
2. **SQL语句执行**:允许Java应用执行SQL查询、插入、更新、删除等操作,支持预编译的PreparedStatement和CallableStatement,提高性能并防止SQL注入攻击。 3. **事务处理**:支持ACID(原子性、一致性、隔离性和...