简单的写下获取数据库连接的工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtils {
// 设定数据库驱动,数据库连接地址端口名称,用户名,密码
private static final String driver =
"oracle.jdbc.driver.OracleDriver";
private static final String url =
"jdbc:oracle:thin:@ip:xxxx";
private static final String username =
"xxxx";
private static final String password =
"xxxx";
/**
* 注册数据库驱动
*/
static {
try {
Class.forName(driver);
}
catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e.getMessage());
}
}
/**
* 获取数据库连接
*/
public static Connection
getConnection() {
try {
Connection connection = DriverManager.getConnection(url, username, password);
// 成功,返回connection
return connection;
}
catch (SQLException e) {
e.printStackTrace();
}
// 获取失败,返回null
return null;
}
/**
* 释放连接
*/
public static void cleanup(Connection conn, Statement st, ResultSet rs) {
if (rs !=
null) {
try {
rs.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
rs =
null;
}
}
if (st !=
null) {
try {
st.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
st =
null;
}
}
if (conn !=
null) {
try {
conn.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
conn =
null;
}
}
}
}
在应用程序中访问存储过程
根据官方提供的API,我们可以看到:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import com.turing.oracle.dbutil.DBUtils;
import oracle.jdbc.OracleTypes;
public class TestProcedure {
@Test
public void callProcedure(){
// {call <procedure-name>[(<arg1>,<arg2>, ...)]}
Connection conn =
null ;
CallableStatement callableStatement =
null ;
/**
*
根据员工姓名,查询员工的全部信息
create or replace procedure QueryStaffInfo(staffName in xgj_test.username%type,
pSal out number,
pComm out xgj_test.comm%type,
pJob out xgj_test.job%type)
is
begin
--查询该员工的薪资,奖金和职位
select t.sal,t.comm,t.job into pSal,pComm,pJob from xgj_test t where t.username=staffName;
end QueryStaffInfo;
*/
// 我们可以看到该存过 4个参数 1个入参 3个出参
String sql =
"{call QueryStaffInfo(?,?,?,?)}";
try {
// 获取连接
conn = DBUtils.getConnection();
// 通过连接获取到CallableStatement
callableStatement = conn.prepareCall(sql);
// 对于in 参数,需要赋值
callableStatement.setString(
1,
"xiao");
// 对于out 参数,需要声明
callableStatement.registerOutParameter(
2, OracleTypes.NUMBER);
// 第二个 ?
callableStatement.registerOutParameter(
3, OracleTypes.NUMBER);
// 第三个 ?
callableStatement.registerOutParameter(
4, OracleTypes.VARCHAR);
// 第四个 ?
// 执行调用
callableStatement.execute();
// 取出结果
int salary = callableStatement.getInt(
2);
int comm = callableStatement.getInt(
3);
String job = callableStatement.getString(
3);
System.out.println(salary +
"\t" + comm +
"\t" + job);
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
DBUtils.cleanup(conn, callableStatement,
null);
}
}
}
在应用程序中访问存储函数
import java.sql.CallableStatement;
import java.sql.Connection;
import org.junit.Test;
import com.turing.oracle.dbutil.DBUtils;
import oracle.jdbc.OracleTypes;
public class TestFuction {
@Test
public void callFuction(){
//{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
Connection conn =
null;
CallableStatement call =
null;
/**
* create or replace function querySalaryInCome(staffName in varchar2)
return number as
--定义变量保存员工的工资和奖金
pSalary xgj_test.sal%type;
pComm xgj_test.comm%type;
begin
--查询员工的工资和奖金
select t.sal, t.comm
into pSalary, pComm
from xgj_test t
where t.username = staffName;
--直接返回年薪
return pSalary * 12 + nvl(pComm,0);
end querySalaryInCome;
*/
String sql =
"{?=call querySalaryInCome(?)}";
try {
// 获取连接
conn = DBUtils.getConnection();
// 通过conn获取CallableStatement
call = conn.prepareCall(sql);
// out 参数,需要声明
call.registerOutParameter(
1, OracleTypes.NUMBER);
// in 参数,需要赋值
call.setString(
2,
"gong");
// 执行
call.execute();
// 取出返回值 第一个?的值
double income = call.getDouble(
1);
System.out.println(
"该员工的年收入:" + income);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
DBUtils.cleanup(conn, call,
null);
}
}
}
在out参数中访问光标
在out参数中使用光标
我们之前抛出的两个思考问题:
查询员工的所有信息–> out参数太多怎么办?
查询某个部门中所有员工的信息–> out中返回集合?
我们可以通过返回Cursor的方式来实现。
在out参数中使用光标 的步骤:
申明包结构
包头