JDBC 常用 API
DriverManager 类 驱劢管理器 , 用于获得 Connection 对象
Connection 接口 连接对象 , 用于获得获得 Statement 对象
Statement 用于执行静态 SQL 并可返回结果的对象
PreparedStatement 继承自 Statement , 预编译的 Sql 语句对象
CallableStatement 继承自 PreparedStatement , 用于执行存储过程
ResultSet 查询返回的数据库结果集
结果集相当于数据库中的游标( cursor )
next()方法的功能 包括两个劢作:下移一行 , 并判断下一行有没有数据
存储过程 && 通过 JDBC API 调用存储过程 *
1) 存储过程( Stored Procedure,简称 SP , 也称为 Procedure , 过程 )存储过程( Stored Procedure )是在大型数据库系统中 , 一组完成特定功能的 SQL 语句集 , 经编译后存储在数据库中 , 用户通过指定存储过程的名字及参数来执行它。
2) 函数( function )
to_char / nvl / coalesc 等都是 Oracle 数据库的内置函数
自己写的函数和 Procedure 功能类似 , 类似于 java 中的方法。
过程和函数都是驻留在数据库中的程序块
过程可以有返回值也可以没有 , 函数必须有返回值
3) 数据库编程
在数据库中编译好程序块 , 实现特定的功能
4) 优势:提高效率
最大限度的减少 I/O
已经编译过的过程 , 减少编译时间
5) 每条 sql 语句对应一个执行计划( Explain Plan ) , 缓存中保持一定数量的sql 语句解析结果和
它的执行计划
数据准备:
1) 创建 user_xxx 表
create table user_xxx(
id number(4) ,
password char(4) ,
name char(20) ,
phone char(20) ,
email varchar2(50)
) ;
insert into user_xxx values( 1001 , '1234' , 'liucs' , '13600000000' , 'liucs@sina.com' ) ;
创建存储过程:
create or replace procedure checkUser_xxx(
p_userid in char , -- in 表示输入( 入口 , 默认值 )
p_pwd in char ,
flag out number -- out 表示输出( 出口 )
)
is v_password char(4) ; -- 定义变量
begin -- begin 和 end 之间为程序体
select password into v_password from user_xxx where id = p_userid ;
if v_password = p_pwd then flag := 1 ; -- “:=”表示赋值 , "="表示比较
else flag := 0 ;
end if ;
exception --当出现异常 , 程序会跳到这里执行
when others then flag := -1 ; --flag 赋值
end ;
/ -- "/"表示执行创建过程的语句
------------------------------------------------------------------------------------------------------------
create or replace procedure update_emp(
p_id in number , -- in 表示输入( 入口 , 默认值 )
p_newSalary in number ,
flag out number -- out 表示输出( 出口 )
)
is
begin -- begin 和 end 之间为程序体
update emp_xxx set salary = p_newSalary where empno =p_id;
flag := SQL%ROWCOUNT ; -- “:=”表示赋值 , "="表示比较
commit;
end ;
/
程序中调用存储过程:
public int checkUser(User user){
int flag = - 2;
String sql =" {call checkUser_xxx(? ,? ,?)} "; //调用过程的语法
String sql ="{call update_emp(? ,? ,?)}"; //调用过程的语法
Connetct conn =DriveManager("url","userId","pwd");
CallableStatement call =null;
try{
call=conn.prepareCall(sql);//预处理
call.setInt(1,user.getId());
call.setString(2,user.getPwd());
call.setDouble(2,user.getSalary());
call.registerOutParameter(3,Types.INTEGER);
call.execute();
flag = call.getInt(3); //取得存储过程的返回值
}catch(SQLException e){
e.printStackTrace();
}finally{
call.close();
conn.close();
}
return flag;
}